Merge branch 'master' of https://github.com/apache/incubator-weex-playground
diff --git a/LICENSE b/LICENSE
index d645695..8c17493 100644
--- a/LICENSE
+++ b/LICENSE
@@ -187,7 +187,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.
- Copyright [yyyy] [name of copyright owner]
+ Copyright 2019 Apache Incubator-Weex
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..47b56f3
--- /dev/null
+++ b/README.md
@@ -0,0 +1,14 @@
+# incubator-weex-playground
+
+[Weex](https://github.com/apache/incubator-weex) is a framework for building high-performance cross-platform mobile applications with a modern web development experience.
+Weex Playground App can be used to test and preview weex pages on Android or IOS.
+
+Find more about weex at [weex.apache.org](https://weex.apache.org).
+
+## Run Weex Playground
+### Android
+* Open `android` In Android Studio
+* In `playground/java/com.alibaba.weex/IndexActivity`, modify `CURRENT_IP` to your local IP
+* Click <img src="http://gtms04.alicdn.com/tps/i4/TB1wCcqMpXXXXakXpXX3G7tGXXX-34-44.png" height="16" > (`Run` button)
+
+
diff --git a/android/.gitignore b/android/.gitignore
new file mode 100644
index 0000000..71b6719
--- /dev/null
+++ b/android/.gitignore
@@ -0,0 +1,8 @@
+.gradle
+.idea
+local.properties
+*iml
+build
+captures
+.settings
+.project
diff --git a/android/build.gradle b/android/build.gradle
new file mode 100644
index 0000000..b69e18e
--- /dev/null
+++ b/android/build.gradle
@@ -0,0 +1,65 @@
+
+buildscript {
+ repositories {
+ google()
+ maven(){
+ url 'https://maven.aliyun.com/repository/google'
+ }
+ jcenter(){
+ url 'https://maven.aliyun.com/repository/jcenter'
+ }
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.3.2'
+ }
+}
+
+
+subprojects {
+ repositories {
+ google()
+ maven(){
+ url 'https://maven.aliyun.com/repository/google'
+ }
+ maven() {
+ url 'http://oss.jfrog.org/oss-snapshot-local/'
+ }
+ jcenter(){
+ url 'https://maven.aliyun.com/repository/jcenter'
+ }
+ }
+ buildscript {
+ repositories {
+ google()
+ maven(){
+ url 'https://maven.aliyun.com/repository/google'
+ }
+ jcenter(){
+ url 'https://maven.aliyun.com/repository/jcenter'
+ }
+ }
+ }
+ ext {
+ compileSdkVersion=26
+ buildToolsVersion="26.0.3"
+ minSdkVersion=14
+ targetSdkVersion=26
+ supportLibVersion="26.0.2"
+ fastjsonLibVersion="1.1.46.android"
+ weexSdkVersion="0.26.1.3-SNAPSHOT"
+ }
+ if(project.name == 'playground'){
+ apply plugin: 'com.android.application'
+ dependencies {
+ implementation "com.taobao.android:weex_sdk:${project.weexSdkVersion}@aar"
+ }
+ }
+ if(project.name == 'commons'){
+ apply plugin: 'com.android.library'
+ dependencies {
+ implementation "com.taobao.android:weex_sdk:${project.weexSdkVersion}@aar"
+ }
+ }
+
+
+}
diff --git a/android/commons/build.gradle b/android/commons/build.gradle
new file mode 100644
index 0000000..29dd4b2
--- /dev/null
+++ b/android/commons/build.gradle
@@ -0,0 +1,76 @@
+plugins {
+ id "com.github.hierynomus.license" version "0.14.0"
+}
+
+apply plugin: 'com.android.library'
+
+android {
+
+ compileSdkVersion project.compileSdkVersion
+// buildToolsVersion project.buildToolsVersion
+ resourcePrefix "weexcomm"
+
+ defaultConfig {
+ minSdkVersion project.minSdkVersion
+ targetSdkVersion project.targetSdkVersion
+ versionCode 1
+ versionName "1.0"
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_7
+ targetCompatibility JavaVersion.VERSION_1_7
+ }
+
+ lintOptions {
+ abortOnError false
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+
+ debug {
+ jniDebuggable true
+ debuggable true
+
+ }
+ }
+}
+
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+ implementation "com.android.support:support-v4:${project.supportLibVersion}"
+ implementation "com.android.support:appcompat-v7:${project.supportLibVersion}"
+ // implementation project(':weex_sdk')
+ implementation 'com.squareup.picasso:picasso:2.5.2'
+ implementation 'com.facebook.fresco:fresco:0.10.0'
+ implementation 'com.taobao.android.weex_inspection:protocol:1.1.4.1'
+
+ compileOnly 'com.taobao.android:weex_analyzer:0.1.0.5'
+ compileOnly 'com.squareup.okhttp:okhttp:2.3.0'
+ compileOnly 'com.squareup.okhttp:okhttp-ws:2.3.0'
+ compileOnly "com.alibaba:fastjson:${project.fastjsonLibVersion}"
+
+ testImplementation 'junit:junit:4.12'
+ testImplementation 'org.hamcrest:hamcrest-core:1.3'
+ testImplementation 'org.javassist:javassist:3.20.0-GA'
+ testImplementation 'org.mockito:mockito-core:1.10.19'
+ testImplementation 'org.objenesis:objenesis:2.1'
+ testImplementation 'org.powermock:powermock-core:1.6.4'
+ testImplementation 'org.powermock:powermock-api-mockito:1.6.4'
+ testImplementation 'org.powermock:powermock-module-junit4-common:1.6.4'
+ testImplementation 'org.powermock:powermock-module-junit4:1.6.4'
+ testImplementation 'org.powermock:powermock-module-junit4-legacy:1.6.4'
+ testImplementation 'org.powermock:powermock-module-testng:1.6.4'
+ testImplementation 'org.robolectric:robolectric:3.0-rc3'
+}
+
+if(file('../license/LICENSE').exists()){
+ license {
+ header = file('../license/LICENSE')
+ }
+ preBuild.dependsOn licenseFormat
+}
\ No newline at end of file
diff --git a/android/commons/proguard-rules.pro b/android/commons/proguard-rules.pro
new file mode 100644
index 0000000..4acd43d
--- /dev/null
+++ b/android/commons/proguard-rules.pro
@@ -0,0 +1,17 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in /Users/sospartan/sdks/android_sdk20130219/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
diff --git a/android/commons/src/androidTest/java/com/alibaba/weex/commons/ApplicationTest.java b/android/commons/src/androidTest/java/com/alibaba/weex/commons/ApplicationTest.java
new file mode 100644
index 0000000..d8cab6d
--- /dev/null
+++ b/android/commons/src/androidTest/java/com/alibaba/weex/commons/ApplicationTest.java
@@ -0,0 +1,31 @@
+/*
+ * 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.commons;
+
+import android.app.Application;
+import android.test.ApplicationTestCase;
+
+/**
+ * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
+ */
+public class ApplicationTest extends ApplicationTestCase<Application> {
+ public ApplicationTest() {
+ super(Application.class);
+ }
+}
diff --git a/android/commons/src/main/AndroidManifest.xml b/android/commons/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..af18743
--- /dev/null
+++ b/android/commons/src/main/AndroidManifest.xml
@@ -0,0 +1,24 @@
+<!--
+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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.alibaba.weex.commons">
+
+
+
+</manifest>
diff --git a/android/commons/src/main/java/com/alibaba/weex/commons/AbstractWeexActivity.java b/android/commons/src/main/java/com/alibaba/weex/commons/AbstractWeexActivity.java
new file mode 100644
index 0000000..8854ce2
--- /dev/null
+++ b/android/commons/src/main/java/com/alibaba/weex/commons/AbstractWeexActivity.java
@@ -0,0 +1,257 @@
+/*
+ * 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.commons;
+
+import android.graphics.PixelFormat;
+import android.graphics.Rect;
+import android.os.Bundle;
+import android.support.annotation.CallSuper;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v7.app.AppCompatActivity;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.weex.commons.util.AssertUtil;
+import com.alibaba.weex.commons.util.ScreenUtil;
+import com.taobao.weex.IWXRenderListener;
+import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKInstance;
+import com.taobao.weex.common.Constants;
+import com.taobao.weex.common.WXRenderStrategy;
+import com.taobao.weex.utils.WXUtils;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by sospartan on 5/30/16.
+ */
+public abstract class AbstractWeexActivity extends AppCompatActivity implements IWXRenderListener {
+ private static final String TAG = "AbstractWeexActivity";
+
+ private ViewGroup mContainer;
+ private WXSDKInstance mInstance;
+
+ protected WXAnalyzerDelegate mWxAnalyzerDelegate;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ createWeexInstance();
+ mInstance.onActivityCreate();
+
+ mWxAnalyzerDelegate = new WXAnalyzerDelegate(this);
+ mWxAnalyzerDelegate.onCreate();
+ getWindow().setFormat(PixelFormat.TRANSLUCENT);
+ }
+
+ protected final void setContainer(ViewGroup container){
+ mContainer = container;
+ }
+
+ protected final ViewGroup getContainer(){
+ return mContainer;
+ }
+
+ protected void destoryWeexInstance(){
+ if(mInstance != null){
+ mInstance.registerRenderListener(null);
+ mInstance.destroy();
+ mInstance = null;
+ }
+ }
+
+ protected void createWeexInstance(){
+ destoryWeexInstance();
+
+ Rect outRect = new Rect();
+ getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect);
+
+ mInstance = new WXSDKInstance(this);
+ mInstance.registerRenderListener(this);
+ }
+
+ protected void renderPage(String template,String source){
+ renderPage(template,source,null);
+ }
+
+ protected void renderPage(String template,String source,String jsonInitData){
+ AssertUtil.throwIfNull(mContainer,new RuntimeException("Can't render page, container is null"));
+ Map<String, Object> options = new HashMap<>();
+ options.put(WXSDKInstance.BUNDLE_URL, source);
+ // Set options.bundleDigest
+ try {
+ String banner = WXUtils.getBundleBanner(template);
+ JSONObject jsonObj = JSONObject.parseObject(banner);
+ String digest = null;
+ if (jsonObj != null) {
+ digest = jsonObj.getString(Constants.CodeCache.BANNER_DIGEST);
+ }
+ if (digest != null) {
+ options.put(Constants.CodeCache.DIGEST, digest);
+ }
+ } catch (Throwable t) {}
+ //Set options.codeCachePath
+ String path = WXEnvironment.getFilesDir(getApplicationContext());
+ path += File.separator;
+ path += Constants.CodeCache.SAVE_PATH;
+ path += File.separator;
+ options.put(Constants.CodeCache.PATH, path);
+
+ mInstance.setTrackComponent(true);
+ mInstance.render(
+ getPageName(),
+ template,
+ options,
+ jsonInitData,
+ WXRenderStrategy.APPEND_ASYNC);
+ }
+
+ protected void renderPageByURL(String url){
+ renderPageByURL(url,null);
+ }
+
+ protected void renderPageByURL(String url,String jsonInitData){
+ AssertUtil.throwIfNull(mContainer,new RuntimeException("Can't render page, container is null"));
+ Map<String, Object> options = new HashMap<>();
+ options.put(WXSDKInstance.BUNDLE_URL, url);
+ mInstance.setTrackComponent(true);
+ mInstance.renderByUrl(
+ getPageName(),
+ url,
+ options,
+ jsonInitData,
+ WXRenderStrategy.APPEND_ASYNC);
+ }
+
+ protected String getPageName(){
+ return TAG;
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ if(mInstance!=null){
+ mInstance.onActivityStart();
+ }
+ if(mWxAnalyzerDelegate != null){
+ mWxAnalyzerDelegate.onStart();
+ }
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ if(mInstance!=null){
+ mInstance.onActivityResume();
+ }
+ if(mWxAnalyzerDelegate != null){
+ mWxAnalyzerDelegate.onResume();
+ }
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ if(mInstance!=null){
+ mInstance.onActivityPause();
+ }
+ if(mWxAnalyzerDelegate != null){
+ mWxAnalyzerDelegate.onPause();
+ }
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+ if(mInstance!=null){
+ mInstance.onActivityStop();
+ }
+ if(mWxAnalyzerDelegate != null){
+ mWxAnalyzerDelegate.onStop();
+ }
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ if(mInstance!=null){
+ mInstance.onActivityDestroy();
+ }
+ if(mWxAnalyzerDelegate != null){
+ mWxAnalyzerDelegate.onDestroy();
+ }
+ }
+
+ @Override
+ public void onViewCreated(WXSDKInstance wxsdkInstance, View view) {
+ View wrappedView = null;
+ if(mWxAnalyzerDelegate != null){
+ wrappedView = mWxAnalyzerDelegate.onWeexViewCreated(wxsdkInstance,view);
+ }
+ if(wrappedView != null){
+ view = wrappedView;
+ }
+ if (mContainer != null) {
+ mContainer.removeAllViews();
+ mContainer.addView(view);
+ }
+ }
+
+
+
+ @Override
+ public void onRefreshSuccess(WXSDKInstance wxsdkInstance, int i, int i1) {
+
+ }
+
+ @Override
+ @CallSuper
+ public void onRenderSuccess(WXSDKInstance instance, int width, int height) {
+ if(mWxAnalyzerDelegate != null){
+ mWxAnalyzerDelegate.onWeexRenderSuccess(instance);
+ }
+ }
+
+ @Override
+ @CallSuper
+ public void onException(WXSDKInstance instance, String errCode, String msg) {
+ if(mWxAnalyzerDelegate != null){
+ mWxAnalyzerDelegate.onException(instance,errCode,msg);
+ }
+ }
+
+ @Override
+ @CallSuper
+ public boolean onKeyUp(int keyCode, KeyEvent event) {
+ return (mWxAnalyzerDelegate != null && mWxAnalyzerDelegate.onKeyUp(keyCode,event)) || super.onKeyUp(keyCode, event);
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ if (mInstance != null) {
+ mInstance.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ }
+ }
+}
diff --git a/android/commons/src/main/java/com/alibaba/weex/commons/SimpleWeexActivity.java b/android/commons/src/main/java/com/alibaba/weex/commons/SimpleWeexActivity.java
new file mode 100644
index 0000000..91e0d1a
--- /dev/null
+++ b/android/commons/src/main/java/com/alibaba/weex/commons/SimpleWeexActivity.java
@@ -0,0 +1,47 @@
+/*
+ * 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.commons;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.view.ViewGroup;
+import com.taobao.weex.WXSDKInstance;
+
+/**
+ * Basic Weex powered Activity.
+ * Created by sospartan on 5/31/16.
+ */
+public abstract class SimpleWeexActivity extends AbstractWeexActivity {
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContainer((ViewGroup) findViewById(android.R.id.content));
+ }
+
+ @Override
+ public void onRenderSuccess(WXSDKInstance instance, int width, int height) {
+ super.onRenderSuccess(instance,width,height);
+ }
+
+ @Override
+ public void onException(WXSDKInstance instance, String errCode, String msg) {
+ super.onException(instance,errCode,msg);
+ }
+}
diff --git a/android/commons/src/main/java/com/alibaba/weex/commons/WXAnalyzerDelegate.java b/android/commons/src/main/java/com/alibaba/weex/commons/WXAnalyzerDelegate.java
new file mode 100644
index 0000000..f9ad58e
--- /dev/null
+++ b/android/commons/src/main/java/com/alibaba/weex/commons/WXAnalyzerDelegate.java
@@ -0,0 +1,193 @@
+/*
+ * 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.commons;
+
+import android.content.Context;
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
+import android.view.KeyEvent;
+import android.view.View;
+
+import com.taobao.weex.WXSDKInstance;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+
+/**
+ * Description:
+ * <p>
+ * Created by rowandjj(chuyi)<br/>
+ * Date: 2016/10/27<br/>
+ * Time: 下午7:01<br/>
+ */
+
+public final class WXAnalyzerDelegate {
+ private Object mWXAnalyzer;
+
+ private static boolean ENABLE = false;
+
+ @SuppressWarnings("unchecked")
+ public WXAnalyzerDelegate(@Nullable Context context) {
+ if(!ENABLE){
+ return;
+ }
+ if(context == null){
+ return;
+ }
+ try {
+ Class clazz = Class.forName("com.taobao.weex.analyzer.WeexDevOptions");
+ Constructor constructor = clazz.getDeclaredConstructor(Context.class);
+ mWXAnalyzer = constructor.newInstance(context);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void onCreate() {
+ if (mWXAnalyzer == null) {
+ return;
+ }
+ try {
+ Method method = mWXAnalyzer.getClass().getDeclaredMethod("onCreate");
+ method.invoke(mWXAnalyzer);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ public void onStart() {
+ if (mWXAnalyzer == null) {
+ return;
+ }
+ try {
+ Method method = mWXAnalyzer.getClass().getDeclaredMethod("onStart");
+ method.invoke(mWXAnalyzer);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void onResume() {
+ if (mWXAnalyzer == null) {
+ return;
+ }
+ try {
+ Method method = mWXAnalyzer.getClass().getDeclaredMethod("onResume");
+ method.invoke(mWXAnalyzer);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ public void onPause() {
+ if (mWXAnalyzer == null) {
+ return;
+ }
+ try {
+ Method method = mWXAnalyzer.getClass().getDeclaredMethod("onPause");
+ method.invoke(mWXAnalyzer);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void onStop() {
+ if (mWXAnalyzer == null) {
+ return;
+ }
+ try {
+ Method method = mWXAnalyzer.getClass().getDeclaredMethod("onStop");
+ method.invoke(mWXAnalyzer);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void onDestroy() {
+ if (mWXAnalyzer == null) {
+ return;
+ }
+ try {
+ Method method = mWXAnalyzer.getClass().getDeclaredMethod("onDestroy");
+ method.invoke(mWXAnalyzer);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ public void onWeexRenderSuccess(@Nullable WXSDKInstance instance) {
+ if (mWXAnalyzer == null || instance == null) {
+ return;
+ }
+ try {
+ Method method = mWXAnalyzer.getClass().getDeclaredMethod("onWeexRenderSuccess", WXSDKInstance.class);
+ method.invoke(mWXAnalyzer, instance);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+
+
+ public boolean onKeyUp(int keyCode, KeyEvent event) {
+ if (mWXAnalyzer == null) {
+ return false;
+ }
+ try {
+ Method method = mWXAnalyzer.getClass().getDeclaredMethod("onKeyUp", int.class, KeyEvent.class);
+ return (boolean) method.invoke(mWXAnalyzer, keyCode, event);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ public void onException(WXSDKInstance instance, String errCode, String msg) {
+ if (mWXAnalyzer == null) {
+ return;
+ }
+ if (TextUtils.isEmpty(errCode) && TextUtils.isEmpty(msg)) {
+ return;
+ }
+ try {
+ Method method = mWXAnalyzer.getClass().getDeclaredMethod("onException", WXSDKInstance.class, String.class, String.class);
+ method.invoke(mWXAnalyzer, instance, errCode, msg);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public View onWeexViewCreated(WXSDKInstance instance, View view) {
+ if (mWXAnalyzer == null || instance == null || view == null) {
+ return null;
+ }
+ try {
+ Method method = mWXAnalyzer.getClass().getDeclaredMethod("onWeexViewCreated", WXSDKInstance.class, View.class);
+ View retView = (View) method.invoke(mWXAnalyzer, instance, view);
+ return retView;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return view;
+ }
+ }
+
+}
diff --git a/android/commons/src/main/java/com/alibaba/weex/commons/adapter/BlurTool.java b/android/commons/src/main/java/com/alibaba/weex/commons/adapter/BlurTool.java
new file mode 100644
index 0000000..53eb456
--- /dev/null
+++ b/android/commons/src/main/java/com/alibaba/weex/commons/adapter/BlurTool.java
@@ -0,0 +1,325 @@
+/*
+ * 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.commons.adapter;
+
+import android.graphics.Bitmap;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import com.taobao.weex.utils.WXLogUtils;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+
+/**
+ * Created by rowandjj(chuyi)<br/>
+ */
+
+public class BlurTool {
+
+ public interface OnBlurCompleteListener {
+ /**
+ * blur complete event.(Notice:in sub thread)
+ *
+ * @param bitmap the blurred bitmap
+ * */
+ void onBlurComplete(@NonNull Bitmap bitmap);
+ }
+
+ private static ExecutorService sExecutorService = Executors.newCachedThreadPool(new ThreadFactory() {
+ @Override
+ public Thread newThread(Runnable r) {
+ return new Thread(r,"wx_blur_thread");
+ }
+ });
+
+ private static final String TAG = "BlurTool";
+
+ /**
+ * radius in [0,10]
+ * */
+ @NonNull
+ @SuppressWarnings("unused")
+ public static Bitmap blur(@NonNull Bitmap originalImage, int radius) {
+ long start = System.currentTimeMillis();
+ radius = Math.min(10, Math.max(0,radius));//[0,10]
+ if(radius == 0) {
+ return originalImage;
+ }
+ int width = originalImage.getWidth();
+ int height = originalImage.getHeight();
+
+ if(width <= 0 || height <= 0) {
+ return originalImage;
+ }
+
+ double sampling = calculateSampling(radius);
+ int retryTimes = 3;
+ Bitmap sampledImage = Bitmap.createScaledBitmap(originalImage,(int)(sampling*width),(int)(sampling*height),true);
+ for(int i = 0; i < retryTimes; i++) {
+ try {
+ if(radius == 0) {
+ return originalImage;
+ }
+ double s = calculateSampling(radius);
+ if(s != sampling) {
+ sampling = s;
+ sampledImage = Bitmap.createScaledBitmap(originalImage,(int)(sampling*width),(int)(sampling*height),true);
+ }
+
+ Bitmap result = stackBlur(sampledImage,radius);
+ return result;
+ }catch (Exception e) {
+ WXLogUtils.e(TAG, "thrown exception when blurred image(times = " + i + "),"+ e.getMessage());
+ radius -= 1;
+ radius = Math.max(0,radius);
+ }
+ }
+ WXLogUtils.d(TAG, "elapsed time on blurring image(radius:"+ radius + ",sampling: " + sampling + "): " + (System.currentTimeMillis() - start) + "ms");
+ return originalImage;
+ }
+
+ private static double calculateSampling(int radius){
+ double sampling;
+ if(radius <= 3) {
+ sampling = 1/(double)2;
+ }else if(radius <= 8) {
+ sampling = 1/(double)4;
+ }else {
+ sampling = 1/(double)8;
+ }
+
+ return sampling;
+ }
+
+ @SuppressWarnings("unused")
+ public static void asyncBlur(@NonNull final Bitmap originalImage, final int radius, @Nullable final OnBlurCompleteListener listener) {
+ sExecutorService.execute(new Runnable() {
+ @Override
+ public void run() {
+ if(listener != null) {
+ listener.onBlurComplete(blur(originalImage,radius));
+ }
+ }
+ });
+ }
+
+ private static Bitmap stackBlur(Bitmap sentBitmap, int radius) {
+ // Stack Blur Algorithm by Mario Klingemann <mario@quasimondo.com>
+ Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);
+
+ if (radius < 1) {
+ return (null);
+ }
+
+ int w = bitmap.getWidth();
+ int h = bitmap.getHeight();
+
+ int[] pix = new int[w * h];
+ bitmap.getPixels(pix, 0, w, 0, 0, w, h);
+
+ int wm = w - 1;
+ int hm = h - 1;
+ int wh = w * h;
+ int div = radius + radius + 1;
+
+ int r[] = new int[wh];
+ int g[] = new int[wh];
+ int b[] = new int[wh];
+ int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;
+ int vmin[] = new int[Math.max(w, h)];
+
+ int divsum = (div + 1) >> 1;
+ divsum *= divsum;
+ int dv[] = new int[256 * divsum];
+ for (i = 0; i < 256 * divsum; i++) {
+ dv[i] = (i / divsum);
+ }
+
+ yw = yi = 0;
+
+ int[][] stack = new int[div][3];
+ int stackpointer;
+ int stackstart;
+ int[] sir;
+ int rbs;
+ int r1 = radius + 1;
+ int routsum, goutsum, boutsum;
+ int rinsum, ginsum, binsum;
+
+ for (y = 0; y < h; y++) {
+ rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
+ for (i = -radius; i <= radius; i++) {
+ p = pix[yi + Math.min(wm, Math.max(i, 0))];
+ sir = stack[i + radius];
+ sir[0] = (p & 0xff0000) >> 16;
+ sir[1] = (p & 0x00ff00) >> 8;
+ sir[2] = (p & 0x0000ff);
+ rbs = r1 - Math.abs(i);
+ rsum += sir[0] * rbs;
+ gsum += sir[1] * rbs;
+ bsum += sir[2] * rbs;
+ if (i > 0) {
+ rinsum += sir[0];
+ ginsum += sir[1];
+ binsum += sir[2];
+ } else {
+ routsum += sir[0];
+ goutsum += sir[1];
+ boutsum += sir[2];
+ }
+ }
+ stackpointer = radius;
+
+ for (x = 0; x < w; x++) {
+
+ r[yi] = dv[rsum];
+ g[yi] = dv[gsum];
+ b[yi] = dv[bsum];
+
+ rsum -= routsum;
+ gsum -= goutsum;
+ bsum -= boutsum;
+
+ stackstart = stackpointer - radius + div;
+ sir = stack[stackstart % div];
+
+ routsum -= sir[0];
+ goutsum -= sir[1];
+ boutsum -= sir[2];
+
+ if (y == 0) {
+ vmin[x] = Math.min(x + radius + 1, wm);
+ }
+ p = pix[yw + vmin[x]];
+
+ sir[0] = (p & 0xff0000) >> 16;
+ sir[1] = (p & 0x00ff00) >> 8;
+ sir[2] = (p & 0x0000ff);
+
+ rinsum += sir[0];
+ ginsum += sir[1];
+ binsum += sir[2];
+
+ rsum += rinsum;
+ gsum += ginsum;
+ bsum += binsum;
+
+ stackpointer = (stackpointer + 1) % div;
+ sir = stack[(stackpointer) % div];
+
+ routsum += sir[0];
+ goutsum += sir[1];
+ boutsum += sir[2];
+
+ rinsum -= sir[0];
+ ginsum -= sir[1];
+ binsum -= sir[2];
+
+ yi++;
+ }
+ yw += w;
+ }
+ for (x = 0; x < w; x++) {
+ rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
+ yp = -radius * w;
+ for (i = -radius; i <= radius; i++) {
+ yi = Math.max(0, yp) + x;
+
+ sir = stack[i + radius];
+
+ sir[0] = r[yi];
+ sir[1] = g[yi];
+ sir[2] = b[yi];
+
+ rbs = r1 - Math.abs(i);
+
+ rsum += r[yi] * rbs;
+ gsum += g[yi] * rbs;
+ bsum += b[yi] * rbs;
+
+ if (i > 0) {
+ rinsum += sir[0];
+ ginsum += sir[1];
+ binsum += sir[2];
+ } else {
+ routsum += sir[0];
+ goutsum += sir[1];
+ boutsum += sir[2];
+ }
+
+ if (i < hm) {
+ yp += w;
+ }
+ }
+ yi = x;
+ stackpointer = radius;
+ for (y = 0; y < h; y++) {
+ // Preserve alpha channel: ( 0xff000000 & pix[yi] )
+ pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16) | (dv[gsum] << 8) | dv[bsum];
+
+ rsum -= routsum;
+ gsum -= goutsum;
+ bsum -= boutsum;
+
+ stackstart = stackpointer - radius + div;
+ sir = stack[stackstart % div];
+
+ routsum -= sir[0];
+ goutsum -= sir[1];
+ boutsum -= sir[2];
+
+ if (x == 0) {
+ vmin[y] = Math.min(y + r1, hm) * w;
+ }
+ p = x + vmin[y];
+
+ sir[0] = r[p];
+ sir[1] = g[p];
+ sir[2] = b[p];
+
+ rinsum += sir[0];
+ ginsum += sir[1];
+ binsum += sir[2];
+
+ rsum += rinsum;
+ gsum += ginsum;
+ bsum += binsum;
+
+ stackpointer = (stackpointer + 1) % div;
+ sir = stack[stackpointer];
+
+ routsum += sir[0];
+ goutsum += sir[1];
+ boutsum += sir[2];
+
+ rinsum -= sir[0];
+ ginsum -= sir[1];
+ binsum -= sir[2];
+
+ yi += w;
+ }
+ }
+
+ bitmap.setPixels(pix, 0, w, 0, 0, w, h);
+
+ return (bitmap);
+ }
+}
diff --git a/android/commons/src/main/java/com/alibaba/weex/commons/adapter/BlurTransformation.java b/android/commons/src/main/java/com/alibaba/weex/commons/adapter/BlurTransformation.java
new file mode 100644
index 0000000..b530b92
--- /dev/null
+++ b/android/commons/src/main/java/com/alibaba/weex/commons/adapter/BlurTransformation.java
@@ -0,0 +1,52 @@
+/*
+ * 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.commons.adapter;
+
+import android.graphics.Bitmap;
+
+import com.squareup.picasso.Transformation;
+
+public class BlurTransformation implements Transformation {
+
+ private int mRadius;
+
+ public BlurTransformation(int radius) {
+ mRadius = radius;
+ }
+
+ @Override public Bitmap transform(Bitmap source) {
+ if(mRadius <= 0) {
+ return source;
+ }
+ Bitmap bitmap;
+ try {
+ bitmap = BlurTool.blur(source, mRadius);
+ }catch (Exception e){
+ bitmap = source;
+ }
+ if(bitmap != source) {
+ source.recycle();
+ }
+ return bitmap;
+ }
+
+ @Override public String key() {
+ return "BlurTransformation(radius=" + mRadius + ")";
+ }
+}
diff --git a/android/commons/src/main/java/com/alibaba/weex/commons/adapter/DefaultWebSocketAdapter.java b/android/commons/src/main/java/com/alibaba/weex/commons/adapter/DefaultWebSocketAdapter.java
new file mode 100644
index 0000000..22810dc
--- /dev/null
+++ b/android/commons/src/main/java/com/alibaba/weex/commons/adapter/DefaultWebSocketAdapter.java
@@ -0,0 +1,188 @@
+/*
+ * 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.commons.adapter;
+
+import android.support.annotation.Nullable;
+
+import com.alibaba.weex.commons.util.WSEventReporter;
+import com.squareup.okhttp.Headers;
+import com.squareup.okhttp.OkHttpClient;
+import com.squareup.okhttp.Request;
+import com.squareup.okhttp.Response;
+import com.squareup.okhttp.ws.WebSocket;
+import com.squareup.okhttp.ws.WebSocketCall;
+import com.squareup.okhttp.ws.WebSocketListener;
+import com.taobao.weex.appfram.websocket.IWebSocketAdapter;
+import com.taobao.weex.appfram.websocket.WebSocketCloseCodes;
+import com.taobao.weex.http.Status;
+
+import java.io.EOFException;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+import okio.Buffer;
+import okio.BufferedSource;
+
+/**
+ * Created by moxun on 16/12/27.
+ */
+
+public class DefaultWebSocketAdapter implements IWebSocketAdapter {
+
+ private WebSocket ws;
+ private EventListener eventListener;
+ private WSEventReporter wsEventReporter;
+
+ @Override
+ public void connect(String url, @Nullable final String protocol, EventListener listener) {
+ this.eventListener = listener;
+ this.wsEventReporter = WSEventReporter.newInstance();
+ OkHttpClient okHttpClient = new OkHttpClient();
+
+ Request.Builder builder = new Request.Builder();
+
+ if (protocol != null) {
+ builder.addHeader(HEADER_SEC_WEBSOCKET_PROTOCOL, protocol);
+ }
+
+ builder.url(url);
+ wsEventReporter.created(url);
+
+ Request wsRequest = builder.build();
+ WebSocketCall webSocketCall = WebSocketCall.create(okHttpClient, wsRequest);
+
+ try {
+ Field field = WebSocketCall.class.getDeclaredField("request");
+ field.setAccessible(true);
+ Request realRequest = (Request) field.get(webSocketCall);
+ Headers wsHeaders = realRequest.headers();
+ Map<String, String> headers = new HashMap<>();
+ for (String name : wsHeaders.names()) {
+ headers.put(name, wsHeaders.values(name).toString());
+ }
+ wsEventReporter.willSendHandshakeRequest(headers, null);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+
+ webSocketCall.enqueue(new WebSocketListener() {
+ @Override
+ public void onOpen(WebSocket webSocket, Request request, Response response) throws IOException {
+ ws = webSocket;
+ eventListener.onOpen();
+ Headers wsHeaders = response.headers();
+ Map<String, String> headers = new HashMap<>();
+ for (String name : wsHeaders.names()) {
+ headers.put(name, wsHeaders.values(name).toString());
+ }
+ wsEventReporter.handshakeResponseReceived(response.code(),
+ Status.getStatusText(String.valueOf(response.code())),
+ headers);
+ }
+
+ @Override
+ public void onMessage(BufferedSource payload, WebSocket.PayloadType type) throws IOException {
+ if (type == WebSocket.PayloadType.BINARY) {
+ wsEventReporter.frameReceived(payload.readByteArray());
+ } else {
+ String message = payload.readUtf8();
+ eventListener.onMessage(message);
+ wsEventReporter.frameReceived(message);
+ }
+ payload.close();
+ }
+
+ @Override
+ public void onPong(Buffer payload) {
+
+ }
+
+ @Override
+ public void onClose(int code, String reason) {
+ eventListener.onClose(code, reason, true);
+ wsEventReporter.closed();
+ }
+
+ @Override
+ public void onFailure(IOException e) {
+ e.printStackTrace();
+ if (e instanceof EOFException) {
+ eventListener.onClose(WebSocketCloseCodes.CLOSE_NORMAL.getCode(), WebSocketCloseCodes.CLOSE_NORMAL.name(), true);
+ wsEventReporter.closed();
+ } else {
+ eventListener.onError(e.getMessage());
+ wsEventReporter.frameError(e.getMessage());
+ }
+ }
+ });
+ }
+
+ @Override
+ public void send(String data) {
+ if (ws != null) {
+ try {
+ Buffer buffer = new Buffer().writeUtf8(data);
+ ws.sendMessage(WebSocket.PayloadType.TEXT, buffer.buffer());
+ buffer.flush();
+ buffer.close();
+
+ wsEventReporter.frameSent(data);
+ } catch (Exception e) {
+ e.printStackTrace();
+ reportError(e.getMessage());
+ wsEventReporter.frameError(e.getMessage());
+ }
+ } else {
+ reportError("WebSocket is not ready");
+ }
+ }
+
+ @Override
+ public void close(int code, String reason) {
+ if (ws != null) {
+ try {
+ ws.close(code, reason);
+ } catch (Exception e) {
+ e.printStackTrace();
+ reportError(e.getMessage());
+ }
+ }
+ }
+
+ @Override
+ public void destroy() {
+ if (ws != null) {
+ try {
+ ws.close(WebSocketCloseCodes.CLOSE_GOING_AWAY.getCode(), WebSocketCloseCodes.CLOSE_GOING_AWAY.name());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private void reportError(String message) {
+ if (eventListener != null) {
+ eventListener.onError(message);
+ }
+ }
+}
diff --git a/android/commons/src/main/java/com/alibaba/weex/commons/adapter/DefaultWebSocketAdapterFactory.java b/android/commons/src/main/java/com/alibaba/weex/commons/adapter/DefaultWebSocketAdapterFactory.java
new file mode 100644
index 0000000..a2cd4ec
--- /dev/null
+++ b/android/commons/src/main/java/com/alibaba/weex/commons/adapter/DefaultWebSocketAdapterFactory.java
@@ -0,0 +1,33 @@
+/*
+ * 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.commons.adapter;
+
+import com.taobao.weex.appfram.websocket.IWebSocketAdapter;
+import com.taobao.weex.appfram.websocket.IWebSocketAdapterFactory;
+
+/**
+ * Created by moxun on 16/12/28.
+ */
+
+public class DefaultWebSocketAdapterFactory implements IWebSocketAdapterFactory {
+ @Override
+ public IWebSocketAdapter createWebSocketAdapter() {
+ return new DefaultWebSocketAdapter();
+ }
+}
diff --git a/android/commons/src/main/java/com/alibaba/weex/commons/adapter/FrescoImageAdapter.java b/android/commons/src/main/java/com/alibaba/weex/commons/adapter/FrescoImageAdapter.java
new file mode 100644
index 0000000..bc4ab42
--- /dev/null
+++ b/android/commons/src/main/java/com/alibaba/weex/commons/adapter/FrescoImageAdapter.java
@@ -0,0 +1,175 @@
+/*
+ * 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.commons.adapter;
+
+import android.graphics.Color;
+import android.graphics.drawable.Animatable;
+import android.net.Uri;
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
+import android.util.Log;
+import android.widget.ImageView;
+
+import com.facebook.common.executors.UiThreadImmediateExecutorService;
+import com.facebook.common.internal.Preconditions;
+import com.facebook.common.logging.FLog;
+import com.facebook.common.references.CloseableReference;
+import com.facebook.datasource.BaseDataSubscriber;
+import com.facebook.datasource.DataSource;
+import com.facebook.datasource.DataSubscriber;
+import com.facebook.drawee.backends.pipeline.Fresco;
+import com.facebook.drawee.controller.BaseControllerListener;
+import com.facebook.drawee.controller.ControllerListener;
+import com.facebook.drawee.interfaces.DraweeController;
+import com.facebook.drawee.view.DraweeView;
+import com.facebook.imagepipeline.common.ImageDecodeOptions;
+import com.facebook.imagepipeline.core.ImagePipeline;
+import com.facebook.imagepipeline.image.CloseableImage;
+import com.facebook.imagepipeline.image.CloseableStaticBitmap;
+import com.facebook.imagepipeline.image.ImageInfo;
+import com.facebook.imagepipeline.image.QualityInfo;
+import com.facebook.imagepipeline.request.ImageRequest;
+import com.facebook.imagepipeline.request.ImageRequestBuilder;
+import com.taobao.weex.WXSDKManager;
+import com.taobao.weex.adapter.IWXImgLoaderAdapter;
+import com.taobao.weex.common.WXImageStrategy;
+import com.taobao.weex.dom.WXImageQuality;
+
+public class FrescoImageAdapter implements IWXImgLoaderAdapter {
+
+ public FrescoImageAdapter() {
+ }
+
+ @Override
+ public void setImage(final String url, final ImageView view,
+ WXImageQuality quality, WXImageStrategy strategy) {
+
+ WXSDKManager.getInstance().postOnUiThread(new Runnable() {
+
+ @Override
+ public void run() {
+ if (view == null || view.getLayoutParams() == null) {
+ return;
+ }
+ if (TextUtils.isEmpty(url)) {
+ view.setImageBitmap(null);
+ return;
+ }
+ String temp = url;
+ if (url.startsWith("//")) {
+ temp = "http:" + url;
+ }
+ if (view.getLayoutParams().width <= 0 || view.getLayoutParams().height <= 0) {
+ return;
+ }
+
+ Uri uri = Uri.parse(temp);
+
+ ImageDecodeOptions decodeOptions = ImageDecodeOptions.newBuilder()
+ .setBackgroundColor(Color.GREEN)
+ .build();
+
+ ImageRequest request = ImageRequestBuilder
+ .newBuilderWithSource(uri)
+ .setImageDecodeOptions(decodeOptions)
+ .setAutoRotateEnabled(true)
+ .setLocalThumbnailPreviewsEnabled(true)
+ .setLowestPermittedRequestLevel(ImageRequest.RequestLevel.FULL_FETCH)
+ .setProgressiveRenderingEnabled(false)
+ .build();
+
+ if(view instanceof DraweeView){
+ Log.d("FrescoImageAdapter","load: "+url);
+ ControllerListener controllerListener = new BaseControllerListener<ImageInfo>() {
+ @Override
+ public void onFinalImageSet(
+ String id,
+ @Nullable ImageInfo imageInfo,
+ @Nullable Animatable anim) {
+ if (imageInfo == null) {
+ return;
+ }
+ QualityInfo qualityInfo = imageInfo.getQualityInfo();
+ FLog.d("Final image received! " +
+ "Size %d x %d",
+ "Quality level %d, good enough: %s, full quality: %s",
+ imageInfo.getWidth(),
+ imageInfo.getHeight(),
+ qualityInfo.getQuality(),
+ qualityInfo.isOfGoodEnoughQuality(),
+ qualityInfo.isOfFullQuality());
+ }
+
+ @Override
+ public void onIntermediateImageSet(String id, @Nullable ImageInfo imageInfo) {
+ FLog.d("","Intermediate image received");
+ }
+
+ @Override
+ public void onFailure(String id, Throwable throwable) {
+ FLog.e(getClass(), throwable, "Error loading %s", id);
+ }
+ };
+ DraweeController controller = Fresco.newDraweeControllerBuilder()
+ .setAutoPlayAnimations(true)
+ .setControllerListener(controllerListener)
+ .setUri(uri)
+ .setImageRequest(request)
+ .build();
+ ((DraweeView)view).setController(controller);
+
+ }else {
+ ImagePipeline imagePipeline = Fresco.getImagePipeline();
+ DataSource<CloseableReference<CloseableImage>>
+ dataSource = imagePipeline.fetchDecodedImage(request, new Object());
+ DataSubscriber dataSubscriber =
+ new BaseDataSubscriber<CloseableReference<CloseableImage>>() {
+ @Override
+ public void onNewResultImpl(DataSource<CloseableReference<CloseableImage>> dataSource) {
+
+ CloseableReference<CloseableImage> imageReference = dataSource.getResult();
+ if (imageReference != null) {
+ try {
+ // do something with the image
+ Preconditions.checkState(CloseableReference.isValid(imageReference));
+ CloseableImage closeableImage = imageReference.get();
+ if (closeableImage instanceof CloseableStaticBitmap) {
+ CloseableStaticBitmap closeableStaticBitmap = (CloseableStaticBitmap) closeableImage;
+ view.setImageBitmap(closeableStaticBitmap.getUnderlyingBitmap());
+ // boolean hasResult = null != closeableStaticBitmap.getUnderlyingBitmap();
+ } else {
+ throw new UnsupportedOperationException("Unrecognized image class: " + closeableImage);
+ }
+ } finally {
+ imageReference.close();
+ }
+ }
+ }
+
+ @Override
+ public void onFailureImpl(DataSource dataSource) {
+ }
+ };
+
+ dataSource.subscribe(dataSubscriber, UiThreadImmediateExecutorService.getInstance());
+ }
+ }
+ }, 0);
+ }
+}
diff --git a/android/commons/src/main/java/com/alibaba/weex/commons/adapter/FrescoImageComponent.java b/android/commons/src/main/java/com/alibaba/weex/commons/adapter/FrescoImageComponent.java
new file mode 100644
index 0000000..56e9a25
--- /dev/null
+++ b/android/commons/src/main/java/com/alibaba/weex/commons/adapter/FrescoImageComponent.java
@@ -0,0 +1,45 @@
+/*
+ * 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.commons.adapter;
+
+import android.content.Context;
+import android.support.annotation.NonNull;
+import android.widget.ImageView;
+import com.taobao.weex.WXSDKInstance;
+import com.taobao.weex.ui.action.BasicComponentData;
+import com.taobao.weex.ui.component.WXImage;
+import com.taobao.weex.ui.component.WXVContainer;
+
+/**
+ * Created by sospartan on 8/19/16.
+ */
+public class FrescoImageComponent extends WXImage {
+
+ public FrescoImageComponent(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) {
+ super(instance, parent, basicComponentData);
+ }
+
+ @Override
+ protected ImageView initComponentHostView(@NonNull Context context) {
+ FrescoImageView view = new FrescoImageView(context);
+ view.setScaleType(ImageView.ScaleType.FIT_XY);
+
+ return view;
+ }
+}
diff --git a/android/commons/src/main/java/com/alibaba/weex/commons/adapter/FrescoImageView.java b/android/commons/src/main/java/com/alibaba/weex/commons/adapter/FrescoImageView.java
new file mode 100644
index 0000000..9227a90
--- /dev/null
+++ b/android/commons/src/main/java/com/alibaba/weex/commons/adapter/FrescoImageView.java
@@ -0,0 +1,75 @@
+/*
+ * 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.commons.adapter;
+
+import android.content.Context;
+import android.graphics.*;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.support.annotation.NonNull;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import com.facebook.drawee.view.DraweeView;
+import com.facebook.drawee.view.SimpleDraweeView;
+import com.taobao.weex.ui.view.border.BorderDrawable;
+import com.taobao.weex.ui.view.gesture.WXGesture;
+import com.taobao.weex.ui.view.gesture.WXGestureObservable;
+import com.taobao.weex.utils.WXViewUtils;
+
+/**
+ * Created by sospartan on 8/19/16.
+ */
+public class FrescoImageView extends SimpleDraweeView implements WXGestureObservable {
+ public FrescoImageView(Context context) {
+ super(context);
+ }
+
+ public FrescoImageView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public FrescoImageView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ public FrescoImageView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ private WXGesture wxGesture;
+
+ @Override
+ public void registerGestureListener(WXGesture wxGesture) {
+ this.wxGesture = wxGesture;
+ }
+
+ @Override
+ public WXGesture getGestureListener() {
+ return wxGesture;
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ boolean result = super.onTouchEvent(event);
+ if (wxGesture != null) {
+ result |= wxGesture.onTouch(this, event);
+ }
+ return result;
+ }
+}
diff --git a/android/commons/src/main/java/com/alibaba/weex/commons/adapter/ImageAdapter.java b/android/commons/src/main/java/com/alibaba/weex/commons/adapter/ImageAdapter.java
new file mode 100644
index 0000000..77dc4fc
--- /dev/null
+++ b/android/commons/src/main/java/com/alibaba/weex/commons/adapter/ImageAdapter.java
@@ -0,0 +1,119 @@
+/*
+ * 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.commons.adapter;
+
+import android.net.Uri;
+import android.os.Looper;
+import android.text.TextUtils;
+import android.widget.ImageView;
+
+import com.squareup.picasso.Callback;
+import com.squareup.picasso.Picasso;
+import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKInstance;
+import com.taobao.weex.WXSDKManager;
+import com.taobao.weex.adapter.IWXImgLoaderAdapter;
+import com.taobao.weex.common.WXImageStrategy;
+import com.taobao.weex.dom.WXImageQuality;
+import com.taobao.weex.ui.IFComponentHolder;
+
+public class ImageAdapter implements IWXImgLoaderAdapter {
+
+ public ImageAdapter() {
+ }
+
+ @Override
+ public void setImage(final String url, final ImageView view,
+ WXImageQuality quality, final WXImageStrategy strategy) {
+ Runnable runnable = new Runnable() {
+
+ @Override
+ public void run() {
+ if(view==null||view.getLayoutParams()==null){
+ return;
+ }
+ if (TextUtils.isEmpty(url)) {
+ view.setImageBitmap(null);
+ return;
+ }
+ if (null != strategy){
+ recordImgLoadAction(strategy.instanceId);
+ }
+
+ String temp = url;
+ if (url.startsWith("//")) {
+ temp = "http:" + url;
+ }
+
+ if(!TextUtils.isEmpty(strategy.placeHolder)){
+ Picasso.Builder builder=new Picasso.Builder(WXEnvironment.getApplication());
+ Picasso picasso=builder.build();
+ picasso.load(Uri.parse(strategy.placeHolder)).into(view);
+
+ view.setTag(strategy.placeHolder.hashCode(),picasso);
+ }
+
+ Picasso.with(WXEnvironment.getApplication())
+ .load(temp)
+ .transform(new BlurTransformation(strategy.blurRadius))
+ .into(view, new Callback() {
+ @Override
+ public void onSuccess() {
+ if(strategy.getImageListener()!=null){
+ strategy.getImageListener().onImageFinish(url,view,true,null);
+ }
+ recordImgLoadResult(strategy.instanceId,true,null);
+
+ if(!TextUtils.isEmpty(strategy.placeHolder)){
+ ((Picasso) view.getTag(strategy.placeHolder.hashCode())).cancelRequest(view);
+ }
+ }
+
+ @Override
+ public void onError() {
+ if(strategy.getImageListener()!=null){
+ strategy.getImageListener().onImageFinish(url,view,false,null);
+ }
+ recordImgLoadResult(strategy.instanceId,false,null);
+ }
+ });
+ }
+ };
+ if(Thread.currentThread() == Looper.getMainLooper().getThread()){
+ runnable.run();
+ }else {
+ WXSDKManager.getInstance().postOnUiThread(runnable, 0);
+ }
+ }
+ private void recordImgLoadAction(String instanceId){
+ WXSDKInstance instance = WXSDKManager.getInstance().getAllInstanceMap().get(instanceId);
+ if (null == instance || instance.isDestroy()){
+ return;
+ }
+ instance.getApmForInstance().actionLoadImg();
+ }
+
+ private void recordImgLoadResult(String instanceId,boolean succeed,String errorCode){
+ WXSDKInstance instance = WXSDKManager.getInstance().getAllInstanceMap().get(instanceId);
+ if (null == instance || instance.isDestroy()){
+ return;
+ }
+ instance.getApmForInstance().actionLoadImgResult(succeed,errorCode);
+ }
+}
diff --git a/android/commons/src/main/java/com/alibaba/weex/commons/adapter/JSExceptionAdapter.java b/android/commons/src/main/java/com/alibaba/weex/commons/adapter/JSExceptionAdapter.java
new file mode 100644
index 0000000..3c6c2ff
--- /dev/null
+++ b/android/commons/src/main/java/com/alibaba/weex/commons/adapter/JSExceptionAdapter.java
@@ -0,0 +1,37 @@
+/*
+ * 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.commons.adapter;
+
+import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.adapter.IWXJSExceptionAdapter;
+import com.taobao.weex.common.WXJSExceptionInfo;
+import com.taobao.weex.utils.WXLogUtils;
+
+/**
+ */
+
+public class JSExceptionAdapter implements IWXJSExceptionAdapter {
+
+ @Override
+ public void onJSException(WXJSExceptionInfo exception) {
+ if (exception != null && WXEnvironment.isApkDebugable()) {
+ WXLogUtils.d(exception.toString());
+ }
+ }
+}
diff --git a/android/commons/src/main/java/com/alibaba/weex/commons/adapter/PicassoBasedDrawableLoader.java b/android/commons/src/main/java/com/alibaba/weex/commons/adapter/PicassoBasedDrawableLoader.java
new file mode 100644
index 0000000..a642dc7
--- /dev/null
+++ b/android/commons/src/main/java/com/alibaba/weex/commons/adapter/PicassoBasedDrawableLoader.java
@@ -0,0 +1,108 @@
+/**
+ * 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.commons.adapter;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.PixelFormat;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.view.Gravity;
+
+import com.squareup.picasso.Picasso;
+import com.squareup.picasso.Target;
+import com.taobao.weex.WXSDKManager;
+import com.taobao.weex.adapter.DrawableStrategy;
+import com.taobao.weex.adapter.IDrawableLoader;
+
+public class PicassoBasedDrawableLoader implements IDrawableLoader {
+
+ private Context mContext;
+
+ public PicassoBasedDrawableLoader(Context context) {
+ mContext = context;
+ }
+
+ @Override
+ public void setDrawable(final String url,
+ final DrawableTarget drawableTarget,
+ final DrawableStrategy drawableStrategy) {
+ WXSDKManager.getInstance().postOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ String temp = url;
+ if (url.startsWith("//")) {
+ temp = "http:" + url;
+ }
+
+ /** This is a hack for picasso, as Picasso hold weakReference to Target.
+ * http://stackoverflow.com/questions/24180805/onbitmaploaded-of-target-object-not-called-on-first-load
+ */
+ class PlaceHolderDrawableTarget extends Drawable implements Target {
+
+ @Override
+ public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
+ BitmapDrawable bitmapDrawable = new BitmapDrawable(mContext.getResources(), bitmap);
+ bitmapDrawable.setGravity(Gravity.FILL);
+ drawableTarget.setDrawable(bitmapDrawable, true);
+ }
+
+ @Override
+ public void onBitmapFailed(Drawable errorDrawable) {
+
+ }
+
+ @Override
+ public void onPrepareLoad(Drawable placeHolderDrawable) {
+ drawableTarget.setDrawable(this, true);
+ }
+
+ @Override
+ public void draw(Canvas canvas) {
+
+ }
+
+ @Override
+ public void setAlpha(int alpha) {
+
+ }
+
+ @Override
+ public void setColorFilter(ColorFilter colorFilter) {
+
+ }
+
+ @Override
+ public int getOpacity() {
+ return PixelFormat.UNKNOWN;
+ }
+ }
+ Picasso.
+ with(mContext).
+ load(temp).
+ resize(drawableStrategy.width, drawableStrategy.height).
+ onlyScaleDown().
+ into(new PlaceHolderDrawableTarget());
+ }
+ }, 0);
+
+ }
+}
diff --git a/android/commons/src/main/java/com/alibaba/weex/commons/util/AssertUtil.java b/android/commons/src/main/java/com/alibaba/weex/commons/util/AssertUtil.java
new file mode 100644
index 0000000..07ec3b9
--- /dev/null
+++ b/android/commons/src/main/java/com/alibaba/weex/commons/util/AssertUtil.java
@@ -0,0 +1,30 @@
+/*
+ * 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.commons.util;
+
+/**
+ * Created by sospartan on 5/31/16.
+ */
+public class AssertUtil {
+ public static<T extends Exception> void throwIfNull(Object object,T e) throws T {
+ if(object == null){
+ throw e;
+ }
+ }
+}
diff --git a/android/commons/src/main/java/com/alibaba/weex/commons/util/RequestIdGenerator.java b/android/commons/src/main/java/com/alibaba/weex/commons/util/RequestIdGenerator.java
new file mode 100644
index 0000000..8f4f169
--- /dev/null
+++ b/android/commons/src/main/java/com/alibaba/weex/commons/util/RequestIdGenerator.java
@@ -0,0 +1,33 @@
+/**
+ * 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.commons.util;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Created by moxun on 17/4/20.
+ */
+
+public class RequestIdGenerator {
+ private static final AtomicInteger sIdGenerator = new AtomicInteger(0);
+
+ public static int nextRequestId() {
+ return sIdGenerator.getAndIncrement();
+ }
+}
diff --git a/android/commons/src/main/java/com/alibaba/weex/commons/util/ScreenUtil.java b/android/commons/src/main/java/com/alibaba/weex/commons/util/ScreenUtil.java
new file mode 100644
index 0000000..e2caed3
--- /dev/null
+++ b/android/commons/src/main/java/com/alibaba/weex/commons/util/ScreenUtil.java
@@ -0,0 +1,126 @@
+/*
+ * 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.commons.util;
+
+import android.content.res.TypedArray;
+import android.graphics.Point;
+import android.os.Build;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.AppCompatActivity;
+import android.util.Log;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+public class ScreenUtil {
+ private static final String TAG = "WXTBUtil";
+
+ private static boolean isSupportSmartBar = false;
+
+ static {
+ isSupportSmartBar = isSupportSmartBar();
+ }
+ public static int getDisplayWidth(AppCompatActivity activity){
+ int width=0;
+ if (activity != null && activity.getWindowManager() != null && activity.getWindowManager().getDefaultDisplay() != null) {
+ Point point=new Point();
+ activity.getWindowManager().getDefaultDisplay().getSize(point);
+ width = point.x;
+ }
+ return width;
+ }
+
+ public static int getDisplayHeight(AppCompatActivity activity) {
+ int height = 0;
+ if (activity != null && activity.getWindowManager() != null && activity.getWindowManager().getDefaultDisplay() != null) {
+ Point point=new Point();
+ activity.getWindowManager().getDefaultDisplay().getSize(point);
+ height=point.y;
+ }
+
+ Log.e(TAG, "isSupportSmartBar:" + isSupportSmartBar);
+
+ if (isSupportSmartBar) {
+ int smartBarHeight = getSmartBarHeight(activity);
+ Log.e(TAG, "smartBarHeight:" + smartBarHeight);
+ height -= smartBarHeight;
+ }
+
+ if (activity.getSupportActionBar() != null) {
+ int actionbar= activity.getSupportActionBar().getHeight();
+ if(actionbar==0){
+ TypedArray actionbarSizeTypedArray=activity.obtainStyledAttributes(new int[]{android.R.attr.actionBarSize});
+ actionbar= (int) actionbarSizeTypedArray.getDimension(0,0);
+ }
+ Log.d(TAG, "actionbar:" + actionbar);
+ height -= actionbar;
+ }
+
+ int status = getStatusBarHeight(activity);
+ Log.d(TAG, "status:" + status);
+
+ height -= status;
+
+ Log.d(TAG,"height:"+height);
+ return height;
+ }
+
+ private static int getStatusBarHeight(AppCompatActivity activity) {
+ Class<?> c;
+ Object obj;
+ Field field;
+ int x;
+ int statusBarHeight = 0;
+ try {
+ c = Class.forName("com.android.internal.R$dimen");
+ obj = c.newInstance();
+ field = c.getField("status_bar_height");
+ x = Integer.parseInt(field.get(obj).toString());
+ statusBarHeight = activity.getResources().getDimensionPixelSize(x);
+ } catch (Exception e1) {
+ e1.printStackTrace();
+ }
+ return statusBarHeight;
+ }
+
+ private static int getSmartBarHeight(AppCompatActivity activity) {
+ ActionBar actionbar = activity.getSupportActionBar();
+ if (actionbar != null)
+ try {
+ Class c = Class.forName("com.android.internal.R$dimen");
+ Object obj = c.newInstance();
+ Field field = c.getField("mz_action_button_min_height");
+ int height = Integer.parseInt(field.get(obj).toString());
+ return activity.getResources().getDimensionPixelSize(height);
+ } catch (Exception e) {
+ e.printStackTrace();
+ actionbar.getHeight();
+ }
+ return 0;
+ }
+
+ private static boolean isSupportSmartBar() {
+ try {
+ final Method method = Build.class.getMethod("hasSmartBar");
+ return method != null;
+ } catch (final Exception e) {
+ return false;
+ }
+ }
+}
diff --git a/android/commons/src/main/java/com/alibaba/weex/commons/util/WSEventReporter.java b/android/commons/src/main/java/com/alibaba/weex/commons/util/WSEventReporter.java
new file mode 100644
index 0000000..aba09c1
--- /dev/null
+++ b/android/commons/src/main/java/com/alibaba/weex/commons/util/WSEventReporter.java
@@ -0,0 +1,210 @@
+/**
+ * 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.commons.util;
+
+import android.support.annotation.Nullable;
+import android.util.Pair;
+
+import com.taobao.weex.devtools.inspector.network.NetworkEventReporter;
+import com.taobao.weex.devtools.inspector.network.NetworkEventReporterManager;
+import com.taobao.weex.devtools.inspector.network.SimpleBinaryInspectorWebSocketFrame;
+import com.taobao.weex.devtools.inspector.network.SimpleTextInspectorWebSocketFrame;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by moxun on 17/4/20.
+ */
+
+public class WSEventReporter {
+
+ private String requestId;
+ private NetworkEventReporter reporter;
+ private WSRequest request;
+
+ public static WSEventReporter newInstance() {
+ return new WSEventReporter();
+ }
+
+ private WSEventReporter() {
+ requestId = String.valueOf(RequestIdGenerator.nextRequestId());
+ reporter = NetworkEventReporterManager.get();
+ }
+
+ public void created(String url) {
+ if (reporter != null) {
+ reporter.webSocketCreated(requestId, url);
+ }
+ }
+
+ public void closed() {
+ if (reporter != null) {
+ reporter.webSocketClosed(requestId);
+ }
+ }
+
+ public void willSendHandshakeRequest(Map<String, String> headers, @Nullable String friendlyName) {
+ if (reporter != null) {
+ request = new WSRequest(requestId, friendlyName, headers);
+ reporter.webSocketWillSendHandshakeRequest(request);
+ }
+ }
+
+ public void handshakeResponseReceived(int code, String phrase, Map<String, String> responseHeaders) {
+ if (reporter != null) {
+ reporter.webSocketHandshakeResponseReceived(new WSResponse(requestId, code, phrase, responseHeaders, request));
+ }
+ }
+
+ public void frameSent(String frame) {
+ if (reporter != null) {
+ reporter.webSocketFrameSent(new SimpleTextInspectorWebSocketFrame(requestId, frame));
+ }
+ }
+
+ public void frameSent(byte[] frame) {
+ if (reporter != null) {
+ reporter.webSocketFrameSent(new SimpleBinaryInspectorWebSocketFrame(requestId, frame));
+ }
+ }
+
+ public void frameReceived(String frame) {
+ if (reporter != null) {
+ reporter.webSocketFrameReceived(new SimpleTextInspectorWebSocketFrame(requestId, frame));
+ }
+ }
+
+ public void frameReceived(byte[] frame) {
+ if (reporter != null) {
+ reporter.webSocketFrameReceived(new SimpleBinaryInspectorWebSocketFrame(requestId, frame));
+ }
+ }
+
+ public void frameError(String msg) {
+ if (reporter != null) {
+ reporter.webSocketFrameError(requestId, msg);
+ }
+ }
+
+ private static class WSRequest extends WSHeaderCommon implements NetworkEventReporter.InspectorWebSocketRequest {
+
+ private String id;
+ private String name;
+
+ public WSRequest(String id, String name, Map<String, String> headers) {
+ attachHeaders(headers);
+ this.id = id;
+ this.name = name;
+ if (this.name == null) {
+ this.name = "WS Connection " + id;
+ }
+ }
+
+ @Override
+ public String id() {
+ return id;
+ }
+
+ @Override
+ public String friendlyName() {
+ return name;
+ }
+ }
+
+ private static class WSResponse extends WSHeaderCommon implements NetworkEventReporter.InspectorWebSocketResponse {
+
+ private String id;
+ private int code;
+ private String phrase;
+ private WSHeaderCommon headers;
+
+ public WSResponse(String id, int code, String phrase, Map<String, String> responseHeaders, WSHeaderCommon headers) {
+ attachHeaders(responseHeaders);
+ this.id = id;
+ this.code = code;
+ this.phrase = phrase;
+ this.headers = headers;
+ }
+
+ @Override
+ public String requestId() {
+ return id;
+ }
+
+ @Override
+ public int statusCode() {
+ return code;
+ }
+
+ @Override
+ public String reasonPhrase() {
+ return phrase;
+ }
+
+ @Nullable
+ @Override
+ public NetworkEventReporter.InspectorHeaders requestHeaders() {
+ return headers;
+ }
+ }
+
+ private static class WSHeaderCommon implements NetworkEventReporter.InspectorHeaders {
+
+ private List<Pair<String, String>> headerList = new ArrayList<>();
+
+ public void attachHeaders(Map<String, String> headers) {
+ for (Map.Entry<String, String> entry : headers.entrySet()) {
+ headerList.add(new Pair<>(entry.getKey(), entry.getValue()));
+ }
+ }
+
+ public void addHeader(String key, String value) {
+ headerList.add(new Pair<>(key, value));
+ }
+
+
+ @Override
+ public int headerCount() {
+ return headerList.size();
+ }
+
+ @Override
+ public String headerName(int index) {
+ return headerList.get(index).first;
+ }
+
+ @Override
+ public String headerValue(int index) {
+ return headerList.get(index).second;
+ }
+
+ @Nullable
+ @Override
+ public String firstHeaderValue(String name) {
+ for (Pair<String, String> pair : headerList) {
+ if (pair.first.equals(name)) {
+ return pair.second;
+ }
+ }
+ return null;
+ }
+ }
+}
diff --git a/android/commons/src/main/res/values/strings.xml b/android/commons/src/main/res/values/strings.xml
new file mode 100644
index 0000000..be8deae
--- /dev/null
+++ b/android/commons/src/main/res/values/strings.xml
@@ -0,0 +1,23 @@
+<!--
+
+ 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.
+
+-->
+<resources>
+ <string name="app_name">My Module</string>
+</resources>
diff --git a/android/gradle.properties b/android/gradle.properties
new file mode 100755
index 0000000..8583e59
--- /dev/null
+++ b/android/gradle.properties
@@ -0,0 +1,17 @@
+## Project-wide Gradle settings.
+#
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+#
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+# Default value: -Xmx10248m -XX:MaxPermSize=256m
+#
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+#Mon Jun 27 20:06:22 CST 2016
+org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
+org.gradle.parallel=true
+android.enableAapt2=false
+android.enableD8=false
\ No newline at end of file
diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..1353677
--- /dev/null
+++ b/android/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..69927bd
--- /dev/null
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Tue Jun 18 20:43:32 CST 2019
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip
diff --git a/android/gradlew b/android/gradlew
new file mode 100755
index 0000000..cccdd3d
--- /dev/null
+++ b/android/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/android/playground/build.gradle b/android/playground/build.gradle
new file mode 100755
index 0000000..1c99f95
--- /dev/null
+++ b/android/playground/build.gradle
@@ -0,0 +1,135 @@
+plugins {
+ id "com.github.hierynomus.license" version "0.14.0"
+}
+
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion project.compileSdkVersion
+ defaultConfig {
+ applicationId "com.alibaba.weex"
+ minSdkVersion project.minSdkVersion
+ targetSdkVersion project.targetSdkVersion
+ versionCode 20
+ versionName "0.20.0"
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ multiDexEnabled true
+ ndk{
+ abiFilters "arm64-v8a", "armeabi-v7a", "x86"
+ }
+ if(!getBuildConfigFields()?.containsKey('externalLibraryName')) {
+ buildConfigField "String", "externalLibraryName", "\"\""
+ }
+ }
+ applicationVariants.all { variant ->
+ variant.outputs.each { output ->
+ def outputFile = output.outputFile
+ if (outputFile != null && outputFile.name.equals('app-debug.apk')) {
+ def fileName = outputFile.name.replace("app-debug.apk", "playground.apk")
+ output.outputFile = new File(outputFile.parent, fileName)
+ }
+ }
+ }
+ signingConfigs {
+ debug {
+ storeFile file("tools/weex.jks")
+ storePassword "123456"
+ keyAlias "weex"
+ keyPassword "123456"
+ }
+ }
+ buildTypes {
+ debug {
+ jniDebuggable true
+ debuggable true
+ }
+ }
+ sourceSets {
+ main {
+ jniLibs.srcDir(['libs'])
+ java {
+ srcDirs = ["src/main/java", "src/main/java_zxing"];
+ }
+ }
+ }
+ lintOptions {
+ abortOnError false
+ }
+
+ packagingOptions {
+ exclude 'LICENSE.txt'
+ }
+ testOptions {
+ reportDir = "$project.buildDir/test/report"
+ }
+ dexOptions {
+ preDexLibraries false
+ }
+ aaptOptions {
+ noCompress 'wasm'
+ }
+}
+
+
+dependencies {
+ implementation fileTree(include: ['*.jar'], dir: 'libs')
+ androidTestImplementation "com.android.support:support-annotations:${project.supportLibVersion}"
+ androidTestImplementation 'junit:junit:4.12'
+ androidTestImplementation 'org.awaitility:awaitility:3.0.0'
+ androidTestImplementation 'org.awaitility:awaitility-proxy:3.0.0'
+ androidTestImplementation 'com.android.support.test.espresso:espresso-core:2.2.2'
+ androidTestImplementation('com.android.support.test.espresso:espresso-contrib:2.2.2', {
+ exclude group: 'com.android.support', module: 'support-annotations'
+ exclude group: 'com.android.support', module: 'support-v4'
+ exclude group: 'com.android.support', module: 'design'
+ exclude group: 'com.android.support', module: 'appcompat-v7'
+ exclude group: 'com.android.support', module: 'recyclerview-v7'
+ })
+ androidTestImplementation 'com.android.support.test:runner:0.5'
+ androidTestImplementation 'com.squareup.picasso:picasso:2.5.2'
+ androidTestImplementation 'org.hamcrest:hamcrest-library:1.3'
+ androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
+ /*source dependency*/
+
+ implementation project(':commons')
+ // implementation project(':HeronAndroid')
+ //https://github.com/weexteam/weex-analyzer-android
+ //Weex-Analyzer provides several convenient tools such as Memory Monitor
+ // to optimize your application. It's not available by default,you can
+ // set WXAnalyzerDelegate#DEBUG==true to enable it
+ debugImplementation 'com.taobao.android:weex_analyzer:0.1.0.5'
+
+
+ implementation 'com.loopj.android:android-async-http:1.4.9@aar'
+ implementation 'com.facebook.fresco:fresco:0.12.0+'
+ implementation 'com.facebook.fresco:animated-gif:0.12.0'
+
+ implementation 'com.google.zxing:core:3.3.3'
+
+ implementation 'com.squareup.okhttp:okhttp:2.3.0'
+ implementation 'com.squareup.okhttp:okhttp-ws:2.3.0'
+ implementation 'com.squareup.okio:okio:1.0.1'
+ implementation "com.alibaba:fastjson:${project.fastjsonLibVersion}"
+ implementation "com.android.support:support-v4:${project.supportLibVersion}"
+ implementation "com.android.support:appcompat-v7:${project.supportLibVersion}"
+ implementation "com.android.support:design:${project.supportLibVersion}"
+ implementation "com.android.support:support-annotations:${project.supportLibVersion}"
+ implementation 'com.jakewharton.scalpel:scalpel:1.1.2'
+ implementation 'com.taobao.android.weex_inspection:urlconnection_interceptor:1.0.0'
+ implementation 'com.taobao.android.weex_inspection:protocol:1.1.4.1'
+ implementation 'com.android.support.test.espresso:espresso-idling-resource:2.2.2'
+ implementation 'com.taobao.android:weex_inspector:0.24.2.4'
+ //implementation project(":weex_inspector")
+
+ // Bind actions to effects. See https://alibaba.github.io/bindingx/
+ implementation 'com.alibaba.android:bindingx-core:1.1.1.2@aar'
+ implementation 'com.alibaba.android:bindingx_weex_plugin:1.1.1@aar'
+}
+
+if(file('../../license/LICENSE').exists()){
+ license {
+ header = file('../../license/LICENSE')
+ excludes(["com/google/zxing/**/*.java","**/*.xml"])
+ }
+ preBuild.dependsOn licenseFormat
+}
diff --git a/android/playground/proguard-rules.pro b/android/playground/proguard-rules.pro
new file mode 100755
index 0000000..d3079ee
--- /dev/null
+++ b/android/playground/proguard-rules.pro
@@ -0,0 +1,32 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in /Users/lixinke/Tool/android-eclipse/adt-bundle-mac-x86_64-20140702/sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+##weex
+-keep class com.taobao.weex.bridge.**{*;}
+-keep class com.taobao.weex.dom.**{*;}
+-keep class com.taobao.weex.adapter.**{*;}
+-keep class com.taobao.weex.common.**{*;}
+-keep class * implements com.taobao.weex.IWXObject{*;}
+-keep class com.taobao.weex.ui.**{*;}
+-keep class com.taobao.weex.ui.component.**{*;}
+-keep class com.taobao.weex.utils.**{
+ public <fields>;
+ public <methods>;
+ }
+-keep class com.taobao.weex.view.**{*;}
+-keep class com.taobao.weex.module.**{*;}
+-keep public class * extends com.taobao.weex.common.WXModule{*;}
\ No newline at end of file
diff --git a/android/playground/src/androidTest/AndroidManifest.xml b/android/playground/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..29b33cd
--- /dev/null
+++ b/android/playground/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,212 @@
+<!--
+ ~
+ ~ Apache License
+ ~ Version 2.0, January 2004
+ ~ http://www.apache.org/licenses/
+ ~
+ ~ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+ ~
+ ~ 1. Definitions.
+ ~
+ ~ "License" shall mean the terms and conditions for use, reproduction,
+ ~ and distribution as defined by Sections 1 through 9 of this document.
+ ~
+ ~ "Licensor" shall mean the copyright owner or entity authorized by
+ ~ the copyright owner that is granting the License.
+ ~
+ ~ "Legal Entity" shall mean the union of the acting entity and all
+ ~ other entities that control, are controlled by, or are under common
+ ~ control with that entity. For the purposes of this definition,
+ ~ "control" means (i) the power, direct or indirect, to cause the
+ ~ direction or management of such entity, whether by contract or
+ ~ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ ~ outstanding shares, or (iii) beneficial ownership of such entity.
+ ~
+ ~ "You" (or "Your") shall mean an individual or Legal Entity
+ ~ exercising permissions granted by this License.
+ ~
+ ~ "Source" form shall mean the preferred form for making modifications,
+ ~ including but not limited to software source code, documentation
+ ~ source, and configuration files.
+ ~
+ ~ "Object" form shall mean any form resulting from mechanical
+ ~ transformation or translation of a Source form, including but
+ ~ not limited to compiled object code, generated documentation,
+ ~ and conversions to other media types.
+ ~
+ ~ "Work" shall mean the work of authorship, whether in Source or
+ ~ Object form, made available under the License, as indicated by a
+ ~ copyright notice that is included in or attached to the work
+ ~ (an example is provided in the Appendix below).
+ ~
+ ~ "Derivative Works" shall mean any work, whether in Source or Object
+ ~ form, that is based on (or derived from) the Work and for which the
+ ~ editorial revisions, annotations, elaborations, or other modifications
+ ~ represent, as a whole, an original work of authorship. For the purposes
+ ~ of this License, Derivative Works shall not include works that remain
+ ~ separable from, or merely link (or bind by name) to the interfaces of,
+ ~ the Work and Derivative Works thereof.
+ ~
+ ~ "Contribution" shall mean any work of authorship, including
+ ~ the original version of the Work and any modifications or additions
+ ~ to that Work or Derivative Works thereof, that is intentionally
+ ~ submitted to Licensor for inclusion in the Work by the copyright owner
+ ~ or by an individual or Legal Entity authorized to submit on behalf of
+ ~ the copyright owner. For the purposes of this definition, "submitted"
+ ~ means any form of electronic, verbal, or written communication sent
+ ~ to the Licensor or its representatives, including but not limited to
+ ~ communication on electronic mailing lists, source code control systems,
+ ~ and issue tracking systems that are managed by, or on behalf of, the
+ ~ Licensor for the purpose of discussing and improving the Work, but
+ ~ excluding communication that is conspicuously marked or otherwise
+ ~ designated in writing by the copyright owner as "Not a Contribution."
+ ~
+ ~ "Contributor" shall mean Licensor and any individual or Legal Entity
+ ~ on behalf of whom a Contribution has been received by Licensor and
+ ~ subsequently incorporated within the Work.
+ ~
+ ~ 2. Grant of Copyright License. Subject to the terms and conditions of
+ ~ this License, each Contributor hereby grants to You a perpetual,
+ ~ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ ~ copyright license to reproduce, prepare Derivative Works of,
+ ~ publicly display, publicly perform, sublicense, and distribute the
+ ~ Work and such Derivative Works in Source or Object form.
+ ~
+ ~ 3. Grant of Patent License. Subject to the terms and conditions of
+ ~ this License, each Contributor hereby grants to You a perpetual,
+ ~ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ ~ (except as stated in this section) patent license to make, have made,
+ ~ use, offer to sell, sell, import, and otherwise transfer the Work,
+ ~ where such license applies only to those patent claims licensable
+ ~ by such Contributor that are necessarily infringed by their
+ ~ Contribution(s) alone or by combination of their Contribution(s)
+ ~ with the Work to which such Contribution(s) was submitted. If You
+ ~ institute patent litigation against any entity (including a
+ ~ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ ~ or a Contribution incorporated within the Work constitutes direct
+ ~ or contributory patent infringement, then any patent licenses
+ ~ granted to You under this License for that Work shall terminate
+ ~ as of the date such litigation is filed.
+ ~
+ ~ 4. Redistribution. You may reproduce and distribute copies of the
+ ~ Work or Derivative Works thereof in any medium, with or without
+ ~ modifications, and in Source or Object form, provided that You
+ ~ meet the following conditions:
+ ~
+ ~ (a) You must give any other recipients of the Work or
+ ~ Derivative Works a copy of this License; and
+ ~
+ ~ (b) You must cause any modified files to carry prominent notices
+ ~ stating that You changed the files; and
+ ~
+ ~ (c) You must retain, in the Source form of any Derivative Works
+ ~ that You distribute, all copyright, patent, trademark, and
+ ~ attribution notices from the Source form of the Work,
+ ~ excluding those notices that do not pertain to any part of
+ ~ the Derivative Works; and
+ ~
+ ~ (d) If the Work includes a "NOTICE" text file as part of its
+ ~ distribution, then any Derivative Works that You distribute must
+ ~ include a readable copy of the attribution notices contained
+ ~ within such NOTICE file, excluding those notices that do not
+ ~ pertain to any part of the Derivative Works, in at least one
+ ~ of the following places: within a NOTICE text file distributed
+ ~ as part of the Derivative Works; within the Source form or
+ ~ documentation, if provided along with the Derivative Works; or,
+ ~ within a display generated by the Derivative Works, if and
+ ~ wherever such third-party notices normally appear. The contents
+ ~ of the NOTICE file are for informational purposes only and
+ ~ do not modify the License. You may add Your own attribution
+ ~ notices within Derivative Works that You distribute, alongside
+ ~ or as an addendum to the NOTICE text from the Work, provided
+ ~ that such additional attribution notices cannot be construed
+ ~ as modifying the License.
+ ~
+ ~ You may add Your own copyright statement to Your modifications and
+ ~ may provide additional or different license terms and conditions
+ ~ for use, reproduction, or distribution of Your modifications, or
+ ~ for any such Derivative Works as a whole, provided Your use,
+ ~ reproduction, and distribution of the Work otherwise complies with
+ ~ the conditions stated in this License.
+ ~
+ ~ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ ~ any Contribution intentionally submitted for inclusion in the Work
+ ~ by You to the Licensor shall be under the terms and conditions of
+ ~ this License, without any additional terms or conditions.
+ ~ Notwithstanding the above, nothing herein shall supersede or modify
+ ~ the terms of any separate license agreement you may have executed
+ ~ with Licensor regarding such Contributions.
+ ~
+ ~ 6. Trademarks. This License does not grant permission to use the trade
+ ~ names, trademarks, service marks, or product names of the Licensor,
+ ~ except as required for reasonable and customary use in describing the
+ ~ origin of the Work and reproducing the content of the NOTICE file.
+ ~
+ ~ 7. Disclaimer of Warranty. Unless required by applicable law or
+ ~ agreed to in writing, Licensor provides the Work (and each
+ ~ Contributor provides its Contributions) on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ ~ implied, including, without limitation, any warranties or conditions
+ ~ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ ~ PARTICULAR PURPOSE. You are solely responsible for determining the
+ ~ appropriateness of using or redistributing the Work and assume any
+ ~ risks associated with Your exercise of permissions under this License.
+ ~
+ ~ 8. Limitation of Liability. In no event and under no legal theory,
+ ~ whether in tort (including negligence), contract, or otherwise,
+ ~ unless required by applicable law (such as deliberate and grossly
+ ~ negligent acts) or agreed to in writing, shall any Contributor be
+ ~ liable to You for damages, including any direct, indirect, special,
+ ~ incidental, or consequential damages of any character arising as a
+ ~ result of this License or out of the use or inability to use the
+ ~ Work (including but not limited to damages for loss of goodwill,
+ ~ work stoppage, computer failure or malfunction, or any and all
+ ~ other commercial damages or losses), even if such Contributor
+ ~ has been advised of the possibility of such damages.
+ ~
+ ~ 9. Accepting Warranty or Additional Liability. While redistributing
+ ~ the Work or Derivative Works thereof, You may choose to offer,
+ ~ and charge a fee for, acceptance of support, warranty, indemnity,
+ ~ or other liability obligations and/or rights consistent with this
+ ~ License. However, in accepting such obligations, You may act only
+ ~ on Your own behalf and on Your sole responsibility, not on behalf
+ ~ of any other Contributor, and only if You agree to indemnify,
+ ~ defend, and hold each Contributor harmless for any liability
+ ~ incurred by, or claims asserted against, such Contributor by reason
+ ~ of your accepting any such warranty or additional liability.
+ ~
+ ~ END OF TERMS AND CONDITIONS
+ ~
+ ~ APPENDIX: How to apply the Apache License to your work.
+ ~
+ ~ To apply the Apache License to your work, attach the following
+ ~ boilerplate notice, with the fields enclosed by brackets "[]"
+ ~ replaced with your own identifying information. (Don't include
+ ~ the brackets!) The text should be enclosed in the appropriate
+ ~ comment syntax for the file format. We also recommend that a
+ ~ file or class name and description of purpose be included on the
+ ~ same "printed page" as the copyright notice for easier
+ ~ identification within third-party archives.
+ ~
+ ~ Copyright 2016 Alibaba Group
+ ~
+ ~ Licensed 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.
+ -->
+
+<manifest
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ package="com.alibaba.weex">
+ <uses-sdk android:minSdkVersion="18"
+ tools:overrideLibrary="android.support.test.uiautomator.v18"/>
+</manifest>
\ No newline at end of file
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/ApplicationTest.java b/android/playground/src/androidTest/java/com/alibaba/weex/ApplicationTest.java
new file mode 100644
index 0000000..5f22786
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/ApplicationTest.java
@@ -0,0 +1,31 @@
+/*
+ * 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;
+
+import android.app.Application;
+import android.test.ApplicationTestCase;
+
+/**
+ * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
+ */
+public class ApplicationTest extends ApplicationTestCase<Application> {
+ public ApplicationTest() {
+ super(Application.class);
+ }
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/WeappJsBaseTestCase.java b/android/playground/src/androidTest/java/com/alibaba/weex/WeappJsBaseTestCase.java
new file mode 100644
index 0000000..242856e
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/WeappJsBaseTestCase.java
@@ -0,0 +1,74 @@
+/*
+ * 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;
+
+import android.content.Context;
+import android.test.ApplicationTestCase;
+
+import com.taobao.weex.WXSDKEngine;
+import com.taobao.weex.WXSDKInstance;
+
+/**
+ */
+public class WeappJsBaseTestCase extends ApplicationTestCase<WXApplication> {
+
+ public final String ComponentCountDownDir = "tc/countdown";
+ public final String ComponentImageDir = "tc/image";
+ public final String ComponentMarqueeDir = "tc/marquee";
+ public final String ComponentScrollerDir = "tc/scroller";
+ public final String ComponentSliderDir = "tc/slider";
+ public final String ComponentTabheaderDir = "tc/tabheader";
+ public final String ComponentTextrDir = "tc/text";
+ // private final String ComponentJSSelfTestDir = "tc/js";
+ public final String PathSep = "/";
+
+ Context testCtx = null;
+ WXApplication testApplication = null;
+ private WXSDKInstance mWaEngine;
+
+ public WeappJsBaseTestCase() {
+ super(WXApplication.class);
+ }
+
+ public void setUp() throws Exception {
+
+ if (testApplication == null){
+ createApplication(); // 创建 application
+ testApplication = getApplication();
+
+ WXSDKEngine.init(testApplication, null);
+// WXSDKEngine.registerComponent("latestVisitView", WXLatestVisitView.class);
+// WXSDKEngine.registerComponent("marquee", WXMarquee.class);
+// WXSDKEngine.registerComponent("countdown", WXCountDown.class);
+// WXSDKEngine.registerComponent("tabheader", WXTabHeader.class);
+ }
+
+// assertNotNull(testApplication);
+
+ }
+
+// /**
+// * Test basic startup/shutdown of Application
+// */
+// @MediumTest
+// public void testSimpleCreate() {
+//// createApplication();
+// }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/benchmark/BenchmarkTest.java b/android/playground/src/androidTest/java/com/alibaba/weex/benchmark/BenchmarkTest.java
new file mode 100644
index 0000000..7c5abaa
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/benchmark/BenchmarkTest.java
@@ -0,0 +1,234 @@
+/*
+ * 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.benchmark;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.matcher.ViewMatchers.withClassName;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.awaitility.Awaitility.await;
+import static org.hamcrest.MatcherAssert.assertThat;
+import android.support.annotation.NonNull;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SdkSuppress;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.Direction;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.UiObject2;
+import android.support.test.uiautomator.Until;
+import android.support.test.espresso.contrib.RecyclerViewActions;
+import android.text.TextUtils;
+import android.util.Log;
+import com.alibaba.weex.BenchmarkActivity;
+import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.common.WXPerformance;
+import com.taobao.weex.ui.view.listview.WXRecyclerView;
+import com.taobao.weex.utils.WXLogUtils;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.TimeUnit;
+import org.hamcrest.Matchers;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class BenchmarkTest {
+
+ private static final String TAG = "benchmark";
+ private static final int TIMES = 50;
+ private static final int FLING_SPEED = 10000;
+ private static final int SCROLL_SPEED = 5000;
+ private static final int FRAMES = 120;
+ private static final long WAIT_TIMEOUT = 10000;
+ private static final float FPS = 30;
+ private static final float FIRST_SCREEN_RENDER_TIME = 5000F;
+ private static List<Long> firstScreenRenderTime = new LinkedList<>();
+ private static List<Long> firstScreenLayoutTime = new LinkedList<>();
+ private static List<Long> flingFrameSeconds = new LinkedList<>();
+ private static List<Long> scrollFrameSeconds = new LinkedList<>();
+ private static final String DUMP_START = "QueueBufferDuration,\n";
+ private static final String DUMP_END = "---PROFILEDATA---";
+ private static final String DUMP_COMMAND = "dumpsys gfxinfo com.alibaba.weex framestats reset";
+
+ @Rule
+ public ActivityTestRule<BenchmarkActivity> mActivityRule = new ActivityTestRule(BenchmarkActivity.class);
+ @Rule
+ public RepeatRule repeatRule = new RepeatRule();
+ private UiDevice mUiDevice;
+
+ @Before
+ public void init() {
+ WXEnvironment.isPerf = true;
+ mUiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
+ }
+
+ @Test
+ public void testFirstScreenPerformance() {
+ List<Long> localTotalTime = new ArrayList<>(TIMES);
+ List<Long> localLayoutTime = new ArrayList<>(TIMES);
+ for (int i = 0; i < TIMES; i++) {
+ WXPerformance performance = fetchPerformance();
+ long currentTime = performance.screenRenderTime;
+ long layoutTime = performance.cssLayoutTime;
+ localTotalTime.add(currentTime);
+ localLayoutTime.add(layoutTime);
+ Log.d(TAG, "FIRST_SCREEN_RENDER_TIME (activity not kill) " + currentTime + "ms");
+ Log.d(TAG, "FIRST_SCREEN_LAYOUT_TIME (activity not kill) " + layoutTime + "ms");
+ }
+ BoxPlot render = new BoxPlot(localTotalTime);
+ BoxPlot layout = new BoxPlot(localLayoutTime);
+ Log.i(TAG, "Average firstScreenRenderTime (activity not kill) " + render.draw());
+ Log.i(TAG, "Average firstScreenLayoutTime (activity not kill) " + layout.draw());
+ assertThat(render.getAverage(), Matchers.lessThan(FIRST_SCREEN_RENDER_TIME));
+ }
+
+ @Repeat(TIMES)
+ @Test
+ public void testFirstFirstScreenPerformance() {
+ WXPerformance performance = fetchPerformance();
+ long currentTime = performance.screenRenderTime;
+ long layoutTime = performance.cssLayoutTime;
+ firstScreenRenderTime.add(currentTime);
+ firstScreenLayoutTime.add(layoutTime);
+ Log.d(TAG, "FIRST_SCREEN_RENDER_TIME (activity killed) " + currentTime + " ms");
+ Log.d(TAG, "FIRST_SCREEN_Layout_TIME (activity killed) " + layoutTime + " ms");
+ }
+
+ @Repeat(TIMES)
+ //@Test
+ @SdkSuppress(minSdkVersion = 23)
+ public void testFlingFPS() {
+ UiObject2 uiObject2 = loadPageForFPS();
+ if (uiObject2 != null) {
+ uiObject2.fling(Direction.DOWN, FLING_SPEED);
+ uiObject2.fling(Direction.DOWN, FLING_SPEED);
+ uiObject2.fling(Direction.DOWN, FLING_SPEED);
+ uiObject2.fling(Direction.DOWN, FLING_SPEED);
+ processGfxInfo(flingFrameSeconds);
+ }
+ }
+
+ @Repeat(TIMES)
+ //@Test
+ @SdkSuppress(minSdkVersion = 23)
+ public void testScrollFPS() {
+ UiObject2 uiObject2 = loadPageForFPS();
+ if (uiObject2 != null) {
+ uiObject2.scroll(Direction.DOWN, 6, SCROLL_SPEED);
+ processGfxInfo(scrollFrameSeconds);
+ }
+ }
+
+ @AfterClass
+ public static void count() {
+ BoxPlot boxPlot = new BoxPlot(firstScreenRenderTime);
+ Log.i(TAG, "Average firstScreenRenderTime (activity killed) " + boxPlot.draw());
+ assertThat(boxPlot.getAverage(), Matchers.lessThan(FIRST_SCREEN_RENDER_TIME));
+ BoxPlot layout = new BoxPlot(firstScreenLayoutTime);
+ Log.i(TAG, "Average firstScreenLayoutTime (activity killed) " + layout.draw());
+ if (!flingFrameSeconds.isEmpty()) {
+ BoxPlot flingPlot = new BoxPlot(flingFrameSeconds);
+ Log.i(TAG, "Average Fling FPS : " + flingPlot.draw());
+ assertThat(1000 / flingPlot.getMedian(), Matchers.greaterThan(FPS));
+ }
+ if (!scrollFrameSeconds.isEmpty()) {
+ BoxPlot scrollPlot = new BoxPlot(scrollFrameSeconds);
+ Log.i(TAG, "Average Scroll FPS : " + scrollPlot.draw());
+ assertThat(1000 / scrollPlot.getMedian(), Matchers.greaterThan(FPS));
+ }
+ }
+
+ private UiObject2 loadPageForFPS() {
+ BenchmarkActivity benchmarkActivity = loadWeexPage();
+ return mUiDevice.wait(Until.findObject(By.desc(BenchmarkActivity.ROOT)), WAIT_TIMEOUT);
+ }
+
+ private void processGfxInfo(List<Long> container) {
+ try {
+ String line;
+ String[] columns;
+ long timeStart, timeEnd, duration;
+ String result = mUiDevice.executeShellCommand(DUMP_COMMAND);
+ result = result.substring(result.indexOf(DUMP_START), result.lastIndexOf(DUMP_END));
+ result = result.substring(DUMP_START.length());
+ BufferedReader bufferedReader = new BufferedReader(new StringReader(result));
+ List<Long> list = createList(bufferedReader);
+ container.addAll(list);
+ BoxPlot boxPlot = new BoxPlot(list);
+ boxPlot.draw();
+ Log.d(TAG, "FPS : " + boxPlot.getMedian() + " ms");
+ } catch (IOException e) {
+ WXLogUtils.e(TAG, WXLogUtils.getStackTrace(e));
+ }
+ }
+
+ private List<Long> createList(BufferedReader bufferedReader) throws IOException {
+ String line;
+ String[] columns;
+ long timeStart, timeEnd, duration;
+ List<Long> list = new ArrayList<>(FRAMES);
+ while (!TextUtils.isEmpty(line = bufferedReader.readLine())) {
+ columns = line.split(",");
+ if (Long.parseLong(columns[0]) == 0) {
+ timeStart = Long.parseLong(columns[1]);
+ timeEnd = Long.parseLong(columns[columns.length - 1]);
+ duration = timeEnd - timeStart;
+ if (duration > 0) {
+ list.add(TimeUnit.MILLISECONDS.convert(duration, TimeUnit.NANOSECONDS));
+ }
+ }
+ }
+ return list;
+ }
+
+ private long calcTime() {
+ BenchmarkActivity benchmarkActivity = mActivityRule.getActivity();
+ benchmarkActivity.loadWeexPage("http://30.8.53.163:8080/complicated.js");
+ onView(withClassName(Matchers.is(WXRecyclerView.class.getName()))).perform
+ (RecyclerViewActions.scrollToPosition(0));
+ return benchmarkActivity.getWXInstance().getWXPerformance().screenRenderTime;
+ }
+
+ private WXPerformance fetchPerformance() {
+ return loadWeexPage().getWXInstance().getWXPerformance();
+ }
+
+ @NonNull
+ private BenchmarkActivity loadWeexPage() {
+ final BenchmarkActivity benchmarkActivity = mActivityRule.getActivity();
+ benchmarkActivity.loadWeexPage();
+ await().atMost(WAIT_TIMEOUT, TimeUnit.MILLISECONDS).until(new Callable<Boolean>() {
+ @Override
+ public Boolean call() throws Exception {
+ return benchmarkActivity.isRenderFinish();
+ }
+ });
+ return benchmarkActivity;
+ }
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/benchmark/BoxPlot.java b/android/playground/src/androidTest/java/com/alibaba/weex/benchmark/BoxPlot.java
new file mode 100644
index 0000000..7a3f446
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/benchmark/BoxPlot.java
@@ -0,0 +1,84 @@
+/*
+ * 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.benchmark;
+
+import java.util.Collections;
+import java.util.List;
+
+public class BoxPlot {
+
+ private static final String LINE = "–";
+
+ private List<Long> array;
+
+ private float average, max, min, median, q1, q3;
+
+ public BoxPlot(List<Long> array) {
+ this.array = array;
+ }
+
+ public void clear() {
+ if (array != null) {
+ array.clear();
+ }
+ }
+
+ public float getAverage(){
+ return average;
+ }
+
+ public float getMedian(){
+ return median;
+ }
+
+ public String draw() {
+ StringBuilder stringBuilder = new StringBuilder();
+ if(array!=null) {
+ calcValues();
+ stringBuilder.append("Average: ");
+ stringBuilder.append(average);
+ stringBuilder.append(", min: ");
+ stringBuilder.append(min);
+ stringBuilder.append(", q1: ");
+ stringBuilder.append(q1);
+ stringBuilder.append(", median: ");
+ stringBuilder.append(median);
+ stringBuilder.append(", q3: ");
+ stringBuilder.append(q3);
+ stringBuilder.append(", max: ");
+ stringBuilder.append(max);
+ }
+ return stringBuilder.toString();
+ }
+
+ private void calcValues() {
+ long sum = 0;
+ Collections.sort(array);
+ max = Collections.max(array);
+ min = Collections.min(array);
+ median = array.get(array.size() / 2);
+ q1 = array.get(array.size() / 4);
+ q3 = array.get(array.size() / 4 * 3);
+ for (Long value : array) {
+ sum += value;
+ }
+ average = sum / (float)array.size();
+ }
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/benchmark/Repeat.java b/android/playground/src/androidTest/java/com/alibaba/weex/benchmark/Repeat.java
new file mode 100644
index 0000000..01ae222
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/benchmark/Repeat.java
@@ -0,0 +1,33 @@
+/*
+ * 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.benchmark;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.METHOD;
+
+@Retention( RetentionPolicy.RUNTIME )
+@Target({ METHOD, ANNOTATION_TYPE })
+public @interface Repeat {
+ int value() default 1;
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/benchmark/RepeatRule.java b/android/playground/src/androidTest/java/com/alibaba/weex/benchmark/RepeatRule.java
new file mode 100644
index 0000000..dc7e33d
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/benchmark/RepeatRule.java
@@ -0,0 +1,56 @@
+/*
+ * 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.benchmark;
+
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+
+public class RepeatRule implements TestRule {
+
+ private static class RepeatStatement extends Statement {
+ private final Statement statement;
+ private final int repeat;
+
+ public RepeatStatement(Statement statement, int repeat) {
+ this.statement = statement;
+ this.repeat = repeat;
+ }
+
+ @Override
+ public void evaluate() throws Throwable {
+ for (int i = 0; i < repeat; i++) {
+ statement.evaluate();
+ }
+ }
+
+ }
+
+ @Override
+ public Statement apply(Statement statement, Description description) {
+ Statement result = statement;
+ Repeat repeat = description.getAnnotation(Repeat.class);
+ if (repeat != null) {
+ int times = repeat.value();
+ result = new RepeatStatement(statement, times);
+ }
+ return result;
+ }
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/benchmark/WeexNativeCompareTest.java b/android/playground/src/androidTest/java/com/alibaba/weex/benchmark/WeexNativeCompareTest.java
new file mode 100644
index 0000000..31085de
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/benchmark/WeexNativeCompareTest.java
@@ -0,0 +1,148 @@
+/*
+ * 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.benchmark;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.matcher.ViewMatchers.withClassName;
+
+import android.support.test.InstrumentationRegistry;
+import android.support.test.espresso.action.ViewActions;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.test.uiautomator.UiDevice;
+import android.text.TextUtils;
+import android.util.Log;
+import android.widget.TextView;
+import com.alibaba.weex.BenchmarkActivity;
+import com.taobao.weex.ui.view.WXFrameLayout;
+import com.taobao.weex.utils.WXLogUtils;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import org.hamcrest.Matchers;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class WeexNativeCompareTest {
+ private static final String TAG = "benchmark";
+ private static final int TIMES = 40;
+ private static final int FRAMES = 120;
+ private static final float FIRST_SCREEN_RENDER_TIME = 600F;
+ private static final String DUMP_START = "Flags,IntendedVsync,Vsync,OldestInputEvent,NewestInputEvent,"
+ + "HandleInputStart,AnimationStart,PerformTraversalsStart,DrawStart,"
+ + "SyncQueued,SyncStart,IssueDrawCommandsStart,SwapBuffers,FrameCompleted,\n";
+ private static final String DUMP_END = "---PROFILEDATA---";
+ private static final String DUMP_COMMAND = "dumpsys gfxinfo com.alibaba.weex framestats reset";
+
+ @Rule
+ public ActivityTestRule<BenchmarkActivity> mActivityRule = new ActivityTestRule(
+ BenchmarkActivity.class);
+ @Rule
+ public RepeatRule repeatRule = new RepeatRule();
+ private UiDevice mUiDevice;
+
+ @Before
+ public void init() {
+ mUiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
+ }
+
+ @Test
+ public void testWeexPerformance() {
+ List<Long> localTotalTime = new ArrayList<>(TIMES);
+ for (int i = 0; i < TIMES; i++) {
+ long currentTime = calcTime(true);
+ localTotalTime.add(currentTime);
+ Log.d(TAG, "Weex render time: " + currentTime + "ms");
+ }
+ BoxPlot boxPlot = new BoxPlot(localTotalTime);
+ Log.i(TAG, "Average Weex render time: " + boxPlot.draw());
+ }
+
+ @Test
+ public void testNativePerformance(){
+ List<Long> localTotalTime = new ArrayList<>(TIMES);
+ for (int i = 0; i < TIMES; i++) {
+ long currentTime = calcTime(false);
+ localTotalTime.add(currentTime);
+ Log.d(TAG, "Native render time: " + currentTime + "ms");
+ }
+ BoxPlot boxPlot = new BoxPlot(localTotalTime);
+ Log.i(TAG, "Average native render time: " + boxPlot.draw());
+ }
+
+ private long calcTime(boolean weex) {
+ BenchmarkActivity benchmarkActivity = mActivityRule.getActivity();
+ benchmarkActivity.loadWeexPage(weex);
+ if(weex) {
+ onView(withClassName(Matchers.is(WXFrameLayout.class.getName()))).perform
+ (ViewActions.swipeDown());
+ }
+ else{
+ onView(withClassName(Matchers.is(TextView.class.getName()))).perform
+ (ViewActions.swipeDown());
+ }
+ return benchmarkActivity.getDuration();
+ //.getWXInstance().getWXPerformance().screenRenderTime;
+ }
+
+ private void processGfxInfo(List<Long> container) {
+ try {
+ String line;
+ String[] columns;
+ long timeStart, timeEnd, duration;
+ String result = mUiDevice.executeShellCommand(DUMP_COMMAND);
+ result = result.substring(result.indexOf(DUMP_START), result.lastIndexOf(DUMP_END));
+ result = result.substring(DUMP_START.length());
+ BufferedReader bufferedReader = new BufferedReader(new StringReader(result));
+ List<Long> list = createList(bufferedReader);
+ container.addAll(list);
+ BoxPlot boxPlot = new BoxPlot(list);
+ boxPlot.draw();
+ Log.d(TAG, "FPS : " + boxPlot.getMedian() + " ms");
+ } catch (IOException e) {
+ WXLogUtils.e(TAG, WXLogUtils.getStackTrace(e));
+ }
+ }
+
+ private List<Long> createList(BufferedReader bufferedReader) throws IOException {
+ String line;
+ String[] columns;
+ long timeStart, timeEnd, duration;
+ List<Long> list = new ArrayList<>(FRAMES);
+ while (!TextUtils.isEmpty(line = bufferedReader.readLine())) {
+ columns = line.split(",");
+ if (Long.parseLong(columns[0]) == 0) {
+ timeStart = Long.parseLong(columns[1]);
+ timeEnd = Long.parseLong(columns[columns.length - 1]);
+ duration = timeEnd - timeStart;
+ if (duration > 0) {
+ list.add(TimeUnit.MILLISECONDS.convert(duration, TimeUnit.NANOSECONDS));
+ }
+ }
+ }
+ return list;
+ }
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_AHref_A_Href.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_AHref_A_Href.java
new file mode 100644
index 0000000..72f768e
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_AHref_A_Href.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_AHref_A_Href extends TestFlow {
+ public AG_AHref_A_Href() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_AHref");
+ testMap.put("testChildCaseInit", "AG_AHref_A_Href");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "href0");
+ put("screenshot", "AG_AHref_A_Href_01_href0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "href1");
+ put("screenshot", "AG_AHref_A_Href_02_href1");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Bottom_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Bottom_Color.java
new file mode 100644
index 0000000..9898adc
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Bottom_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_A_Border_Bottom_Color extends TestFlow {
+ public AG_Border_A_Border_Bottom_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_A_Border_Bottom_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_A_Border_Bottom_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_A_Border_Bottom_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Bottom_Left_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Bottom_Left_Radius.java
new file mode 100644
index 0000000..400a876
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Bottom_Left_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_A_Border_Bottom_Left_Radius extends TestFlow {
+ public AG_Border_A_Border_Bottom_Left_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_A_Border_Bottom_Left_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_A_Border_Bottom_Left_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_A_Border_Bottom_Left_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Bottom_Right_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Bottom_Right_Radius.java
new file mode 100644
index 0000000..fece5d5
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Bottom_Right_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_A_Border_Bottom_Right_Radius extends TestFlow {
+ public AG_Border_A_Border_Bottom_Right_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_A_Border_Bottom_Right_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_A_Border_Bottom_Right_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_A_Border_Bottom_Right_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Bottom_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Bottom_Width.java
new file mode 100644
index 0000000..0ac666f
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Bottom_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_A_Border_Bottom_Width extends TestFlow {
+ public AG_Border_A_Border_Bottom_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_A_Border_Bottom_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_A_Border_Bottom_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_A_Border_Bottom_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_A_Border_Bottom_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Color.java
new file mode 100644
index 0000000..ab2d037
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_A_Border_Color extends TestFlow {
+ public AG_Border_A_Border_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_A_Border_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_A_Border_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_A_Border_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Left_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Left_Color.java
new file mode 100644
index 0000000..f01c7d6
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Left_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_A_Border_Left_Color extends TestFlow {
+ public AG_Border_A_Border_Left_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_A_Border_Left_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_A_Border_Left_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_A_Border_Left_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Left_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Left_Width.java
new file mode 100644
index 0000000..99601f1
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Left_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_A_Border_Left_Width extends TestFlow {
+ public AG_Border_A_Border_Left_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_A_Border_Left_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_A_Border_Left_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_A_Border_Left_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_A_Border_Left_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Radius.java
new file mode 100644
index 0000000..81beb75
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_A_Border_Radius extends TestFlow {
+ public AG_Border_A_Border_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_A_Border_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_A_Border_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_A_Border_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Right_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Right_Color.java
new file mode 100644
index 0000000..1bb9bd6
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Right_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_A_Border_Right_Color extends TestFlow {
+ public AG_Border_A_Border_Right_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_A_Border_Right_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_A_Border_Right_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_A_Border_Right_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Right_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Right_Width.java
new file mode 100644
index 0000000..c2a1fbf
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Right_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_A_Border_Right_Width extends TestFlow {
+ public AG_Border_A_Border_Right_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_A_Border_Right_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_A_Border_Right_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_A_Border_Right_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_A_Border_Right_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Style.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Style.java
new file mode 100644
index 0000000..193defd
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Style.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_A_Border_Style extends TestFlow {
+ public AG_Border_A_Border_Style() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_A_Border_Style");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "solid");
+ put("screenshot", "AG_Border_A_Border_Style_01_solid");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "dashed");
+ put("screenshot", "AG_Border_A_Border_Style_02_dashed");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "dotted");
+ put("screenshot", "AG_Border_A_Border_Style_03_dotted");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Top_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Top_Color.java
new file mode 100644
index 0000000..8e1f014
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Top_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_A_Border_Top_Color extends TestFlow {
+ public AG_Border_A_Border_Top_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_A_Border_Top_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_A_Border_Top_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_A_Border_Top_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Top_Left_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Top_Left_Radius.java
new file mode 100644
index 0000000..cde9833
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Top_Left_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_A_Border_Top_Left_Radius extends TestFlow {
+ public AG_Border_A_Border_Top_Left_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_A_Border_Top_Left_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_A_Border_Top_Left_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_A_Border_Top_Left_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Top_Right_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Top_Right_Radius.java
new file mode 100644
index 0000000..f40b3b7
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Top_Right_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_A_Border_Top_Right_Radius extends TestFlow {
+ public AG_Border_A_Border_Top_Right_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_A_Border_Top_Right_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_A_Border_Top_Right_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_A_Border_Top_Right_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Top_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Top_Width.java
new file mode 100644
index 0000000..a22a55d
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Top_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_A_Border_Top_Width extends TestFlow {
+ public AG_Border_A_Border_Top_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_A_Border_Top_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_A_Border_Top_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_A_Border_Top_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_A_Border_Top_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Width.java
new file mode 100644
index 0000000..f26d1f5
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_A_Border_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_A_Border_Width extends TestFlow {
+ public AG_Border_A_Border_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_A_Border_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_A_Border_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_A_Border_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_A_Border_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Bottom_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Bottom_Color.java
new file mode 100644
index 0000000..64c3ad1
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Bottom_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Div_Border_Bottom_Color extends TestFlow {
+ public AG_Border_Div_Border_Bottom_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Div_Border_Bottom_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Div_Border_Bottom_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Div_Border_Bottom_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Bottom_Left_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Bottom_Left_Radius.java
new file mode 100644
index 0000000..627cb4f
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Bottom_Left_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Div_Border_Bottom_Left_Radius extends TestFlow {
+ public AG_Border_Div_Border_Bottom_Left_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Div_Border_Bottom_Left_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Div_Border_Bottom_Left_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Div_Border_Bottom_Left_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Bottom_Right_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Bottom_Right_Radius.java
new file mode 100644
index 0000000..b476750
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Bottom_Right_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Div_Border_Bottom_Right_Radius extends TestFlow {
+ public AG_Border_Div_Border_Bottom_Right_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Div_Border_Bottom_Right_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Div_Border_Bottom_Right_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Div_Border_Bottom_Right_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Bottom_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Bottom_Width.java
new file mode 100644
index 0000000..842e6a6
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Bottom_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Div_Border_Bottom_Width extends TestFlow {
+ public AG_Border_Div_Border_Bottom_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Div_Border_Bottom_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Div_Border_Bottom_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Div_Border_Bottom_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Div_Border_Bottom_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Color.java
new file mode 100644
index 0000000..2309a33
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Div_Border_Color extends TestFlow {
+ public AG_Border_Div_Border_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Div_Border_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Div_Border_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Div_Border_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Left_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Left_Color.java
new file mode 100644
index 0000000..cfcbf7f
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Left_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Div_Border_Left_Color extends TestFlow {
+ public AG_Border_Div_Border_Left_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Div_Border_Left_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Div_Border_Left_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Div_Border_Left_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Left_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Left_Width.java
new file mode 100644
index 0000000..e4884ee
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Left_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Div_Border_Left_Width extends TestFlow {
+ public AG_Border_Div_Border_Left_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Div_Border_Left_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Div_Border_Left_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Div_Border_Left_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Div_Border_Left_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Radius.java
new file mode 100644
index 0000000..217e02b
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Div_Border_Radius extends TestFlow {
+ public AG_Border_Div_Border_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Div_Border_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Div_Border_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Div_Border_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Right_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Right_Color.java
new file mode 100644
index 0000000..ee50179
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Right_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Div_Border_Right_Color extends TestFlow {
+ public AG_Border_Div_Border_Right_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Div_Border_Right_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Div_Border_Right_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Div_Border_Right_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Right_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Right_Width.java
new file mode 100644
index 0000000..e84210f
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Right_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Div_Border_Right_Width extends TestFlow {
+ public AG_Border_Div_Border_Right_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Div_Border_Right_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Div_Border_Right_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Div_Border_Right_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Div_Border_Right_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Style.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Style.java
new file mode 100644
index 0000000..ed84cc6
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Style.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Div_Border_Style extends TestFlow {
+ public AG_Border_Div_Border_Style() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Div_Border_Style");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "solid");
+ put("screenshot", "AG_Border_Div_Border_Style_01_solid");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "dashed");
+ put("screenshot", "AG_Border_Div_Border_Style_02_dashed");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "dotted");
+ put("screenshot", "AG_Border_Div_Border_Style_03_dotted");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Top_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Top_Color.java
new file mode 100644
index 0000000..f136dfc
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Top_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Div_Border_Top_Color extends TestFlow {
+ public AG_Border_Div_Border_Top_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Div_Border_Top_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Div_Border_Top_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Div_Border_Top_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Top_Left_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Top_Left_Radius.java
new file mode 100644
index 0000000..75602a5
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Top_Left_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Div_Border_Top_Left_Radius extends TestFlow {
+ public AG_Border_Div_Border_Top_Left_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Div_Border_Top_Left_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Div_Border_Top_Left_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Div_Border_Top_Left_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Top_Right_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Top_Right_Radius.java
new file mode 100644
index 0000000..e084c53
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Top_Right_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Div_Border_Top_Right_Radius extends TestFlow {
+ public AG_Border_Div_Border_Top_Right_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Div_Border_Top_Right_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Div_Border_Top_Right_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Div_Border_Top_Right_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Top_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Top_Width.java
new file mode 100644
index 0000000..feb9f82
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Top_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Div_Border_Top_Width extends TestFlow {
+ public AG_Border_Div_Border_Top_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Div_Border_Top_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Div_Border_Top_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Div_Border_Top_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Div_Border_Top_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Width.java
new file mode 100644
index 0000000..7d8195d
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Div_Border_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Div_Border_Width extends TestFlow {
+ public AG_Border_Div_Border_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Div_Border_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Div_Border_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Div_Border_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Div_Border_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Bottom_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Bottom_Color.java
new file mode 100644
index 0000000..8b37598
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Bottom_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Image_Border_Bottom_Color extends TestFlow {
+ public AG_Border_Image_Border_Bottom_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Image_Border_Bottom_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Image_Border_Bottom_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Image_Border_Bottom_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Bottom_Left_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Bottom_Left_Radius.java
new file mode 100644
index 0000000..ab4df8f
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Bottom_Left_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Image_Border_Bottom_Left_Radius extends TestFlow {
+ public AG_Border_Image_Border_Bottom_Left_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Image_Border_Bottom_Left_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Image_Border_Bottom_Left_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Image_Border_Bottom_Left_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Bottom_Right_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Bottom_Right_Radius.java
new file mode 100644
index 0000000..1f736d7
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Bottom_Right_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Image_Border_Bottom_Right_Radius extends TestFlow {
+ public AG_Border_Image_Border_Bottom_Right_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Image_Border_Bottom_Right_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Image_Border_Bottom_Right_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Image_Border_Bottom_Right_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Bottom_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Bottom_Width.java
new file mode 100644
index 0000000..d2e6271
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Bottom_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Image_Border_Bottom_Width extends TestFlow {
+ public AG_Border_Image_Border_Bottom_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Image_Border_Bottom_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Image_Border_Bottom_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Image_Border_Bottom_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Image_Border_Bottom_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Color.java
new file mode 100644
index 0000000..8bdc586
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Image_Border_Color extends TestFlow {
+ public AG_Border_Image_Border_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Image_Border_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Image_Border_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Image_Border_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Left_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Left_Color.java
new file mode 100644
index 0000000..2306009
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Left_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Image_Border_Left_Color extends TestFlow {
+ public AG_Border_Image_Border_Left_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Image_Border_Left_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Image_Border_Left_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Image_Border_Left_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Left_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Left_Width.java
new file mode 100644
index 0000000..ec49562
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Left_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Image_Border_Left_Width extends TestFlow {
+ public AG_Border_Image_Border_Left_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Image_Border_Left_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Image_Border_Left_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Image_Border_Left_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Image_Border_Left_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Radius.java
new file mode 100644
index 0000000..bd1b1fa
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Image_Border_Radius extends TestFlow {
+ public AG_Border_Image_Border_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Image_Border_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Image_Border_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Image_Border_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Right_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Right_Color.java
new file mode 100644
index 0000000..c64bd48
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Right_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Image_Border_Right_Color extends TestFlow {
+ public AG_Border_Image_Border_Right_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Image_Border_Right_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Image_Border_Right_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Image_Border_Right_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Right_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Right_Width.java
new file mode 100644
index 0000000..a7611a4
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Right_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Image_Border_Right_Width extends TestFlow {
+ public AG_Border_Image_Border_Right_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Image_Border_Right_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Image_Border_Right_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Image_Border_Right_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Image_Border_Right_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Style.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Style.java
new file mode 100644
index 0000000..ce8b05b
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Style.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Image_Border_Style extends TestFlow {
+ public AG_Border_Image_Border_Style() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Image_Border_Style");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "solid");
+ put("screenshot", "AG_Border_Image_Border_Style_01_solid");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "dashed");
+ put("screenshot", "AG_Border_Image_Border_Style_02_dashed");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "dotted");
+ put("screenshot", "AG_Border_Image_Border_Style_03_dotted");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Top_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Top_Color.java
new file mode 100644
index 0000000..be08a5f
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Top_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Image_Border_Top_Color extends TestFlow {
+ public AG_Border_Image_Border_Top_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Image_Border_Top_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Image_Border_Top_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Image_Border_Top_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Top_Left_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Top_Left_Radius.java
new file mode 100644
index 0000000..0f3ff95
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Top_Left_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Image_Border_Top_Left_Radius extends TestFlow {
+ public AG_Border_Image_Border_Top_Left_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Image_Border_Top_Left_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Image_Border_Top_Left_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Image_Border_Top_Left_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Top_Right_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Top_Right_Radius.java
new file mode 100644
index 0000000..a894281
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Top_Right_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Image_Border_Top_Right_Radius extends TestFlow {
+ public AG_Border_Image_Border_Top_Right_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Image_Border_Top_Right_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Image_Border_Top_Right_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Image_Border_Top_Right_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Top_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Top_Width.java
new file mode 100644
index 0000000..9597c45
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Top_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Image_Border_Top_Width extends TestFlow {
+ public AG_Border_Image_Border_Top_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Image_Border_Top_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Image_Border_Top_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Image_Border_Top_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Image_Border_Top_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Width.java
new file mode 100644
index 0000000..7eaa4b3
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Image_Border_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Image_Border_Width extends TestFlow {
+ public AG_Border_Image_Border_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Image_Border_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Image_Border_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Image_Border_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Image_Border_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Bottom_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Bottom_Color.java
new file mode 100644
index 0000000..df1ed78
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Bottom_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Input_Border_Bottom_Color extends TestFlow {
+ public AG_Border_Input_Border_Bottom_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Input_Border_Bottom_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Input_Border_Bottom_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Input_Border_Bottom_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Bottom_Left_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Bottom_Left_Radius.java
new file mode 100644
index 0000000..4590824
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Bottom_Left_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Input_Border_Bottom_Left_Radius extends TestFlow {
+ public AG_Border_Input_Border_Bottom_Left_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Input_Border_Bottom_Left_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Input_Border_Bottom_Left_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Input_Border_Bottom_Left_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Bottom_Right_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Bottom_Right_Radius.java
new file mode 100644
index 0000000..6fa2284
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Bottom_Right_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Input_Border_Bottom_Right_Radius extends TestFlow {
+ public AG_Border_Input_Border_Bottom_Right_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Input_Border_Bottom_Right_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Input_Border_Bottom_Right_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Input_Border_Bottom_Right_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Bottom_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Bottom_Width.java
new file mode 100644
index 0000000..ce4a46b
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Bottom_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Input_Border_Bottom_Width extends TestFlow {
+ public AG_Border_Input_Border_Bottom_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Input_Border_Bottom_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Input_Border_Bottom_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Input_Border_Bottom_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Input_Border_Bottom_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Color.java
new file mode 100644
index 0000000..ff1763e
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Input_Border_Color extends TestFlow {
+ public AG_Border_Input_Border_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Input_Border_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Input_Border_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Input_Border_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Left_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Left_Color.java
new file mode 100644
index 0000000..7537213
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Left_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Input_Border_Left_Color extends TestFlow {
+ public AG_Border_Input_Border_Left_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Input_Border_Left_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Input_Border_Left_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Input_Border_Left_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Left_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Left_Width.java
new file mode 100644
index 0000000..f682725
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Left_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Input_Border_Left_Width extends TestFlow {
+ public AG_Border_Input_Border_Left_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Input_Border_Left_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Input_Border_Left_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Input_Border_Left_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Input_Border_Left_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Radius.java
new file mode 100644
index 0000000..0f8441d
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Input_Border_Radius extends TestFlow {
+ public AG_Border_Input_Border_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Input_Border_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Input_Border_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Input_Border_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Right_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Right_Color.java
new file mode 100644
index 0000000..a6c472e
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Right_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Input_Border_Right_Color extends TestFlow {
+ public AG_Border_Input_Border_Right_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Input_Border_Right_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Input_Border_Right_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Input_Border_Right_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Right_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Right_Width.java
new file mode 100644
index 0000000..2b4a8ef
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Right_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Input_Border_Right_Width extends TestFlow {
+ public AG_Border_Input_Border_Right_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Input_Border_Right_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Input_Border_Right_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Input_Border_Right_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Input_Border_Right_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Style.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Style.java
new file mode 100644
index 0000000..6fb9c1b
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Style.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Input_Border_Style extends TestFlow {
+ public AG_Border_Input_Border_Style() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Input_Border_Style");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "solid");
+ put("screenshot", "AG_Border_Input_Border_Style_01_solid");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "dashed");
+ put("screenshot", "AG_Border_Input_Border_Style_02_dashed");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "dotted");
+ put("screenshot", "AG_Border_Input_Border_Style_03_dotted");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Top_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Top_Color.java
new file mode 100644
index 0000000..2156e68
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Top_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Input_Border_Top_Color extends TestFlow {
+ public AG_Border_Input_Border_Top_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Input_Border_Top_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Input_Border_Top_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Input_Border_Top_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Top_Left_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Top_Left_Radius.java
new file mode 100644
index 0000000..67816c1
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Top_Left_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Input_Border_Top_Left_Radius extends TestFlow {
+ public AG_Border_Input_Border_Top_Left_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Input_Border_Top_Left_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Input_Border_Top_Left_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Input_Border_Top_Left_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Top_Right_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Top_Right_Radius.java
new file mode 100644
index 0000000..a143813
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Top_Right_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Input_Border_Top_Right_Radius extends TestFlow {
+ public AG_Border_Input_Border_Top_Right_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Input_Border_Top_Right_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Input_Border_Top_Right_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Input_Border_Top_Right_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Top_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Top_Width.java
new file mode 100644
index 0000000..abdeee3
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Top_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Input_Border_Top_Width extends TestFlow {
+ public AG_Border_Input_Border_Top_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Input_Border_Top_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Input_Border_Top_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Input_Border_Top_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Input_Border_Top_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Width.java
new file mode 100644
index 0000000..df44ae5
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Input_Border_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Input_Border_Width extends TestFlow {
+ public AG_Border_Input_Border_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Input_Border_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Input_Border_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Input_Border_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Input_Border_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Bottom_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Bottom_Color.java
new file mode 100644
index 0000000..6da173e
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Bottom_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Switch_Border_Bottom_Color extends TestFlow {
+ public AG_Border_Switch_Border_Bottom_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Switch_Border_Bottom_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Switch_Border_Bottom_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Switch_Border_Bottom_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Bottom_Left_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Bottom_Left_Radius.java
new file mode 100644
index 0000000..7327406
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Bottom_Left_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Switch_Border_Bottom_Left_Radius extends TestFlow {
+ public AG_Border_Switch_Border_Bottom_Left_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Switch_Border_Bottom_Left_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Switch_Border_Bottom_Left_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Switch_Border_Bottom_Left_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Bottom_Right_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Bottom_Right_Radius.java
new file mode 100644
index 0000000..5e8c07b
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Bottom_Right_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Switch_Border_Bottom_Right_Radius extends TestFlow {
+ public AG_Border_Switch_Border_Bottom_Right_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Switch_Border_Bottom_Right_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Switch_Border_Bottom_Right_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Switch_Border_Bottom_Right_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Bottom_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Bottom_Width.java
new file mode 100644
index 0000000..d0e42fd
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Bottom_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Switch_Border_Bottom_Width extends TestFlow {
+ public AG_Border_Switch_Border_Bottom_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Switch_Border_Bottom_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Switch_Border_Bottom_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Switch_Border_Bottom_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Switch_Border_Bottom_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Color.java
new file mode 100644
index 0000000..4c24622
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Switch_Border_Color extends TestFlow {
+ public AG_Border_Switch_Border_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Switch_Border_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Switch_Border_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Switch_Border_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Left_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Left_Color.java
new file mode 100644
index 0000000..0f37b89
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Left_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Switch_Border_Left_Color extends TestFlow {
+ public AG_Border_Switch_Border_Left_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Switch_Border_Left_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Switch_Border_Left_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Switch_Border_Left_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Left_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Left_Width.java
new file mode 100644
index 0000000..fdee548
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Left_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Switch_Border_Left_Width extends TestFlow {
+ public AG_Border_Switch_Border_Left_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Switch_Border_Left_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Switch_Border_Left_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Switch_Border_Left_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Switch_Border_Left_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Radius.java
new file mode 100644
index 0000000..162c507
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Switch_Border_Radius extends TestFlow {
+ public AG_Border_Switch_Border_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Switch_Border_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Switch_Border_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Switch_Border_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Right_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Right_Color.java
new file mode 100644
index 0000000..5a580d7
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Right_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Switch_Border_Right_Color extends TestFlow {
+ public AG_Border_Switch_Border_Right_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Switch_Border_Right_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Switch_Border_Right_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Switch_Border_Right_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Right_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Right_Width.java
new file mode 100644
index 0000000..1c89eda
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Right_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Switch_Border_Right_Width extends TestFlow {
+ public AG_Border_Switch_Border_Right_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Switch_Border_Right_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Switch_Border_Right_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Switch_Border_Right_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Switch_Border_Right_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Style.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Style.java
new file mode 100644
index 0000000..c91c1ff
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Style.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Switch_Border_Style extends TestFlow {
+ public AG_Border_Switch_Border_Style() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Switch_Border_Style");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "solid");
+ put("screenshot", "AG_Border_Switch_Border_Style_01_solid");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "dashed");
+ put("screenshot", "AG_Border_Switch_Border_Style_02_dashed");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "dotted");
+ put("screenshot", "AG_Border_Switch_Border_Style_03_dotted");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Top_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Top_Color.java
new file mode 100644
index 0000000..135456a
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Top_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Switch_Border_Top_Color extends TestFlow {
+ public AG_Border_Switch_Border_Top_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Switch_Border_Top_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Switch_Border_Top_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Switch_Border_Top_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Top_Left_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Top_Left_Radius.java
new file mode 100644
index 0000000..d01f61d
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Top_Left_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Switch_Border_Top_Left_Radius extends TestFlow {
+ public AG_Border_Switch_Border_Top_Left_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Switch_Border_Top_Left_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Switch_Border_Top_Left_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Switch_Border_Top_Left_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Top_Right_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Top_Right_Radius.java
new file mode 100644
index 0000000..e8941f7
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Top_Right_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Switch_Border_Top_Right_Radius extends TestFlow {
+ public AG_Border_Switch_Border_Top_Right_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Switch_Border_Top_Right_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Switch_Border_Top_Right_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Switch_Border_Top_Right_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Top_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Top_Width.java
new file mode 100644
index 0000000..5c7ae67
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Top_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Switch_Border_Top_Width extends TestFlow {
+ public AG_Border_Switch_Border_Top_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Switch_Border_Top_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Switch_Border_Top_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Switch_Border_Top_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Switch_Border_Top_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Width.java
new file mode 100644
index 0000000..e982f97
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Switch_Border_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Switch_Border_Width extends TestFlow {
+ public AG_Border_Switch_Border_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Switch_Border_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Switch_Border_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Switch_Border_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Switch_Border_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Bottom_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Bottom_Color.java
new file mode 100644
index 0000000..9ec2a07
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Bottom_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Text_Border_Bottom_Color extends TestFlow {
+ public AG_Border_Text_Border_Bottom_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Text_Border_Bottom_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Text_Border_Bottom_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Text_Border_Bottom_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Bottom_Left_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Bottom_Left_Radius.java
new file mode 100644
index 0000000..caf346a
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Bottom_Left_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Text_Border_Bottom_Left_Radius extends TestFlow {
+ public AG_Border_Text_Border_Bottom_Left_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Text_Border_Bottom_Left_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Text_Border_Bottom_Left_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Text_Border_Bottom_Left_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Bottom_Right_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Bottom_Right_Radius.java
new file mode 100644
index 0000000..cea7312
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Bottom_Right_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Text_Border_Bottom_Right_Radius extends TestFlow {
+ public AG_Border_Text_Border_Bottom_Right_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Text_Border_Bottom_Right_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Text_Border_Bottom_Right_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Text_Border_Bottom_Right_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Bottom_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Bottom_Width.java
new file mode 100644
index 0000000..4770230
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Bottom_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Text_Border_Bottom_Width extends TestFlow {
+ public AG_Border_Text_Border_Bottom_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Text_Border_Bottom_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Text_Border_Bottom_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Text_Border_Bottom_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Text_Border_Bottom_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Color.java
new file mode 100644
index 0000000..ff1d670
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Text_Border_Color extends TestFlow {
+ public AG_Border_Text_Border_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Text_Border_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Text_Border_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Text_Border_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Left_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Left_Color.java
new file mode 100644
index 0000000..a59e398
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Left_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Text_Border_Left_Color extends TestFlow {
+ public AG_Border_Text_Border_Left_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Text_Border_Left_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Text_Border_Left_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Text_Border_Left_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Left_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Left_Width.java
new file mode 100644
index 0000000..429f827
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Left_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Text_Border_Left_Width extends TestFlow {
+ public AG_Border_Text_Border_Left_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Text_Border_Left_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Text_Border_Left_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Text_Border_Left_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Text_Border_Left_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Radius.java
new file mode 100644
index 0000000..c4b169e
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Text_Border_Radius extends TestFlow {
+ public AG_Border_Text_Border_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Text_Border_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Text_Border_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Text_Border_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Right_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Right_Color.java
new file mode 100644
index 0000000..75152ce
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Right_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Text_Border_Right_Color extends TestFlow {
+ public AG_Border_Text_Border_Right_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Text_Border_Right_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Text_Border_Right_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Text_Border_Right_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Right_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Right_Width.java
new file mode 100644
index 0000000..9b637d5
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Right_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Text_Border_Right_Width extends TestFlow {
+ public AG_Border_Text_Border_Right_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Text_Border_Right_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Text_Border_Right_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Text_Border_Right_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Text_Border_Right_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Style.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Style.java
new file mode 100644
index 0000000..0de90b8
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Style.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Text_Border_Style extends TestFlow {
+ public AG_Border_Text_Border_Style() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Text_Border_Style");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "solid");
+ put("screenshot", "AG_Border_Text_Border_Style_01_solid");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "dashed");
+ put("screenshot", "AG_Border_Text_Border_Style_02_dashed");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "dotted");
+ put("screenshot", "AG_Border_Text_Border_Style_03_dotted");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Top_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Top_Color.java
new file mode 100644
index 0000000..87579b9
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Top_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Text_Border_Top_Color extends TestFlow {
+ public AG_Border_Text_Border_Top_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Text_Border_Top_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Text_Border_Top_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Text_Border_Top_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Top_Left_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Top_Left_Radius.java
new file mode 100644
index 0000000..a052f7e
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Top_Left_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Text_Border_Top_Left_Radius extends TestFlow {
+ public AG_Border_Text_Border_Top_Left_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Text_Border_Top_Left_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Text_Border_Top_Left_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Text_Border_Top_Left_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Top_Right_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Top_Right_Radius.java
new file mode 100644
index 0000000..af5724a
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Top_Right_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Text_Border_Top_Right_Radius extends TestFlow {
+ public AG_Border_Text_Border_Top_Right_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Text_Border_Top_Right_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Text_Border_Top_Right_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Text_Border_Top_Right_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Top_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Top_Width.java
new file mode 100644
index 0000000..b0d21cc
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Top_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Text_Border_Top_Width extends TestFlow {
+ public AG_Border_Text_Border_Top_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Text_Border_Top_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Text_Border_Top_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Text_Border_Top_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Text_Border_Top_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Width.java
new file mode 100644
index 0000000..8f78d9e
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Text_Border_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Text_Border_Width extends TestFlow {
+ public AG_Border_Text_Border_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Text_Border_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Text_Border_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Text_Border_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Text_Border_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Bottom_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Bottom_Color.java
new file mode 100644
index 0000000..afea0cd
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Bottom_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Video_Border_Bottom_Color extends TestFlow {
+ public AG_Border_Video_Border_Bottom_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Video_Border_Bottom_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Video_Border_Bottom_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Video_Border_Bottom_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Bottom_Left_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Bottom_Left_Radius.java
new file mode 100644
index 0000000..a417ef4
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Bottom_Left_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Video_Border_Bottom_Left_Radius extends TestFlow {
+ public AG_Border_Video_Border_Bottom_Left_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Video_Border_Bottom_Left_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Video_Border_Bottom_Left_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Video_Border_Bottom_Left_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Bottom_Right_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Bottom_Right_Radius.java
new file mode 100644
index 0000000..6521b59
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Bottom_Right_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Video_Border_Bottom_Right_Radius extends TestFlow {
+ public AG_Border_Video_Border_Bottom_Right_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Video_Border_Bottom_Right_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Video_Border_Bottom_Right_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Video_Border_Bottom_Right_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Bottom_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Bottom_Width.java
new file mode 100644
index 0000000..5a416e0
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Bottom_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Video_Border_Bottom_Width extends TestFlow {
+ public AG_Border_Video_Border_Bottom_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Video_Border_Bottom_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Video_Border_Bottom_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Video_Border_Bottom_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Video_Border_Bottom_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Color.java
new file mode 100644
index 0000000..eafdec6
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Video_Border_Color extends TestFlow {
+ public AG_Border_Video_Border_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Video_Border_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Video_Border_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Video_Border_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Left_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Left_Color.java
new file mode 100644
index 0000000..3c50a89
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Left_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Video_Border_Left_Color extends TestFlow {
+ public AG_Border_Video_Border_Left_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Video_Border_Left_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Video_Border_Left_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Video_Border_Left_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Left_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Left_Width.java
new file mode 100644
index 0000000..5a77d67
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Left_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Video_Border_Left_Width extends TestFlow {
+ public AG_Border_Video_Border_Left_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Video_Border_Left_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Video_Border_Left_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Video_Border_Left_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Video_Border_Left_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Radius.java
new file mode 100644
index 0000000..d88ec00
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Video_Border_Radius extends TestFlow {
+ public AG_Border_Video_Border_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Video_Border_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Video_Border_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Video_Border_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Right_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Right_Color.java
new file mode 100644
index 0000000..949b790
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Right_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Video_Border_Right_Color extends TestFlow {
+ public AG_Border_Video_Border_Right_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Video_Border_Right_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Video_Border_Right_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Video_Border_Right_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Right_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Right_Width.java
new file mode 100644
index 0000000..e8db7d1
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Right_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Video_Border_Right_Width extends TestFlow {
+ public AG_Border_Video_Border_Right_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Video_Border_Right_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Video_Border_Right_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Video_Border_Right_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Video_Border_Right_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Style.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Style.java
new file mode 100644
index 0000000..cfaa573
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Style.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Video_Border_Style extends TestFlow {
+ public AG_Border_Video_Border_Style() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Video_Border_Style");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "solid");
+ put("screenshot", "AG_Border_Video_Border_Style_01_solid");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "dashed");
+ put("screenshot", "AG_Border_Video_Border_Style_02_dashed");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "dotted");
+ put("screenshot", "AG_Border_Video_Border_Style_03_dotted");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Top_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Top_Color.java
new file mode 100644
index 0000000..3686773
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Top_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Video_Border_Top_Color extends TestFlow {
+ public AG_Border_Video_Border_Top_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Video_Border_Top_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Video_Border_Top_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Video_Border_Top_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Top_Left_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Top_Left_Radius.java
new file mode 100644
index 0000000..be3c07d
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Top_Left_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Video_Border_Top_Left_Radius extends TestFlow {
+ public AG_Border_Video_Border_Top_Left_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Video_Border_Top_Left_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Video_Border_Top_Left_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Video_Border_Top_Left_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Top_Right_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Top_Right_Radius.java
new file mode 100644
index 0000000..0880893
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Top_Right_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Video_Border_Top_Right_Radius extends TestFlow {
+ public AG_Border_Video_Border_Top_Right_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Video_Border_Top_Right_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Video_Border_Top_Right_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Video_Border_Top_Right_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Top_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Top_Width.java
new file mode 100644
index 0000000..46ebf4b
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Top_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Video_Border_Top_Width extends TestFlow {
+ public AG_Border_Video_Border_Top_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Video_Border_Top_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Video_Border_Top_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Video_Border_Top_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Video_Border_Top_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Width.java
new file mode 100644
index 0000000..290a208
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Video_Border_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Video_Border_Width extends TestFlow {
+ public AG_Border_Video_Border_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Video_Border_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Video_Border_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Video_Border_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Video_Border_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Bottom_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Bottom_Color.java
new file mode 100644
index 0000000..e8daaab
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Bottom_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Web_Border_Bottom_Color extends TestFlow {
+ public AG_Border_Web_Border_Bottom_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Web_Border_Bottom_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Web_Border_Bottom_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Web_Border_Bottom_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Bottom_Left_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Bottom_Left_Radius.java
new file mode 100644
index 0000000..feb4ca3
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Bottom_Left_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Web_Border_Bottom_Left_Radius extends TestFlow {
+ public AG_Border_Web_Border_Bottom_Left_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Web_Border_Bottom_Left_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Web_Border_Bottom_Left_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Web_Border_Bottom_Left_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Bottom_Right_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Bottom_Right_Radius.java
new file mode 100644
index 0000000..58aae01
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Bottom_Right_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Web_Border_Bottom_Right_Radius extends TestFlow {
+ public AG_Border_Web_Border_Bottom_Right_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Web_Border_Bottom_Right_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Web_Border_Bottom_Right_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Web_Border_Bottom_Right_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Bottom_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Bottom_Width.java
new file mode 100644
index 0000000..0f76e3e
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Bottom_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Web_Border_Bottom_Width extends TestFlow {
+ public AG_Border_Web_Border_Bottom_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Web_Border_Bottom_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Web_Border_Bottom_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Web_Border_Bottom_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Web_Border_Bottom_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Color.java
new file mode 100644
index 0000000..1246a68
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Web_Border_Color extends TestFlow {
+ public AG_Border_Web_Border_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Web_Border_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Web_Border_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Web_Border_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Left_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Left_Color.java
new file mode 100644
index 0000000..85628b7
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Left_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Web_Border_Left_Color extends TestFlow {
+ public AG_Border_Web_Border_Left_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Web_Border_Left_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Web_Border_Left_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Web_Border_Left_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Left_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Left_Width.java
new file mode 100644
index 0000000..b3d16ae
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Left_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Web_Border_Left_Width extends TestFlow {
+ public AG_Border_Web_Border_Left_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Web_Border_Left_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Web_Border_Left_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Web_Border_Left_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Web_Border_Left_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Radius.java
new file mode 100644
index 0000000..f394fe8
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Web_Border_Radius extends TestFlow {
+ public AG_Border_Web_Border_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Web_Border_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Web_Border_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Web_Border_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Right_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Right_Color.java
new file mode 100644
index 0000000..5251309
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Right_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Web_Border_Right_Color extends TestFlow {
+ public AG_Border_Web_Border_Right_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Web_Border_Right_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Web_Border_Right_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Web_Border_Right_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Right_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Right_Width.java
new file mode 100644
index 0000000..1d4fa6a
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Right_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Web_Border_Right_Width extends TestFlow {
+ public AG_Border_Web_Border_Right_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Web_Border_Right_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Web_Border_Right_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Web_Border_Right_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Web_Border_Right_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Style.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Style.java
new file mode 100644
index 0000000..1409d17
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Style.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Web_Border_Style extends TestFlow {
+ public AG_Border_Web_Border_Style() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Web_Border_Style");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "solid");
+ put("screenshot", "AG_Border_Web_Border_Style_01_solid");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "dashed");
+ put("screenshot", "AG_Border_Web_Border_Style_02_dashed");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "dotted");
+ put("screenshot", "AG_Border_Web_Border_Style_03_dotted");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Top_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Top_Color.java
new file mode 100644
index 0000000..bc11365
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Top_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Web_Border_Top_Color extends TestFlow {
+ public AG_Border_Web_Border_Top_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Web_Border_Top_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Border_Web_Border_Top_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_Border_Web_Border_Top_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Top_Left_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Top_Left_Radius.java
new file mode 100644
index 0000000..c5d2222
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Top_Left_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Web_Border_Top_Left_Radius extends TestFlow {
+ public AG_Border_Web_Border_Top_Left_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Web_Border_Top_Left_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Web_Border_Top_Left_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Web_Border_Top_Left_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Top_Right_Radius.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Top_Right_Radius.java
new file mode 100644
index 0000000..bcc10fd
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Top_Right_Radius.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Web_Border_Top_Right_Radius extends TestFlow {
+ public AG_Border_Web_Border_Top_Right_Radius() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Web_Border_Top_Right_Radius");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Border_Web_Border_Top_Right_Radius_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Border_Web_Border_Top_Right_Radius_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Top_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Top_Width.java
new file mode 100644
index 0000000..adcae5c
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Top_Width.java
@@ -0,0 +1,64 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Web_Border_Top_Width extends TestFlow {
+ public AG_Border_Web_Border_Top_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object>TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Web_Border_Top_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Web_Border_Top_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Web_Border_Top_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Web_Border_Top_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Width.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Width.java
new file mode 100644
index 0000000..628bc06
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Border_Web_Border_Width.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Border_Web_Border_Width extends TestFlow {
+ public AG_Border_Web_Border_Width() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Border");
+ testMap.put("testChildCaseInit", "AG_Border_Web_Border_Width");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Border_Web_Border_Width_01_0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Border_Web_Border_Width_02_1");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "3");
+ put("screenshot", "AG_Border_Web_Border_Width_03_3");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonAttribute_A_If.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonAttribute_A_If.java
new file mode 100644
index 0000000..33f1656
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonAttribute_A_If.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonAttribute_A_If extends TestFlow {
+ public AG_CommonAttribute_A_If() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonAttribute");
+ testMap.put("testChildCaseInit", "AG_CommonAttribute_A_If");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "true");
+ put("screenshot", "AG_CommonAttribute_A_If_01_true");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "false");
+ put("screenshot", "AG_CommonAttribute_A_If_02_false");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonAttribute_Div_If.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonAttribute_Div_If.java
new file mode 100644
index 0000000..684e717
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonAttribute_Div_If.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonAttribute_Div_If extends TestFlow {
+ public AG_CommonAttribute_Div_If() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonAttribute");
+ testMap.put("testChildCaseInit", "AG_CommonAttribute_Div_If");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "true");
+ put("screenshot", "AG_CommonAttribute_Div_If_01_true");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "false");
+ put("screenshot", "AG_CommonAttribute_Div_If_02_false");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonAttribute_Image_If.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonAttribute_Image_If.java
new file mode 100644
index 0000000..a8ff83d
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonAttribute_Image_If.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonAttribute_Image_If extends TestFlow {
+ public AG_CommonAttribute_Image_If() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonAttribute");
+ testMap.put("testChildCaseInit", "AG_CommonAttribute_Image_If");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "true");
+ put("screenshot", "AG_CommonAttribute_Image_If_01_true");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "false");
+ put("screenshot", "AG_CommonAttribute_Image_If_02_false");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonAttribute_Input_If.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonAttribute_Input_If.java
new file mode 100644
index 0000000..c47f744
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonAttribute_Input_If.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonAttribute_Input_If extends TestFlow {
+ public AG_CommonAttribute_Input_If() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonAttribute");
+ testMap.put("testChildCaseInit", "AG_CommonAttribute_Input_If");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "true");
+ put("screenshot", "AG_CommonAttribute_Input_If_01_true");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "false");
+ put("screenshot", "AG_CommonAttribute_Input_If_02_false");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonAttribute_Switch_If.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonAttribute_Switch_If.java
new file mode 100644
index 0000000..d011213
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonAttribute_Switch_If.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonAttribute_Switch_If extends TestFlow {
+ public AG_CommonAttribute_Switch_If() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonAttribute");
+ testMap.put("testChildCaseInit", "AG_CommonAttribute_Switch_If");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "true");
+ put("screenshot", "AG_CommonAttribute_Switch_If_01_true");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "false");
+ put("screenshot", "AG_CommonAttribute_Switch_If_02_false");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonAttribute_Text_If.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonAttribute_Text_If.java
new file mode 100644
index 0000000..15e17c6
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonAttribute_Text_If.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonAttribute_Text_If extends TestFlow {
+ public AG_CommonAttribute_Text_If() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonAttribute");
+ testMap.put("testChildCaseInit", "AG_CommonAttribute_Text_If");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "true");
+ put("screenshot", "AG_CommonAttribute_Text_If_01_true");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "false");
+ put("screenshot", "AG_CommonAttribute_Text_If_02_false");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonAttribute_Video_If.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonAttribute_Video_If.java
new file mode 100644
index 0000000..04a4a59
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonAttribute_Video_If.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonAttribute_Video_If extends TestFlow {
+ public AG_CommonAttribute_Video_If() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonAttribute");
+ testMap.put("testChildCaseInit", "AG_CommonAttribute_Video_If");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "true");
+ put("screenshot", "AG_CommonAttribute_Video_If_01_true");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "false");
+ put("screenshot", "AG_CommonAttribute_Video_If_02_false");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonAttribute_Web_If.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonAttribute_Web_If.java
new file mode 100644
index 0000000..05958c4
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonAttribute_Web_If.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonAttribute_Web_If extends TestFlow {
+ public AG_CommonAttribute_Web_If() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonAttribute");
+ testMap.put("testChildCaseInit", "AG_CommonAttribute_Web_If");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "true");
+ put("screenshot", "AG_CommonAttribute_Web_If_01_true");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "false");
+ put("screenshot", "AG_CommonAttribute_Web_If_02_false");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonEvent_A_Onclick.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonEvent_A_Onclick.java
new file mode 100644
index 0000000..7c9e0c8
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonEvent_A_Onclick.java
@@ -0,0 +1,45 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonEvent_A_Onclick extends TestFlow {
+ public AG_CommonEvent_A_Onclick() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonEvent");
+ testMap.put("testChildCaseInit", "AG_CommonEvent_A_Onclick");
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonEvent_Div_Onclick.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonEvent_Div_Onclick.java
new file mode 100644
index 0000000..4bdb5e7
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonEvent_Div_Onclick.java
@@ -0,0 +1,45 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonEvent_Div_Onclick extends TestFlow {
+ public AG_CommonEvent_Div_Onclick() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonEvent");
+ testMap.put("testChildCaseInit", "AG_CommonEvent_Div_Onclick");
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonEvent_Image_Onclick.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonEvent_Image_Onclick.java
new file mode 100644
index 0000000..4f5c5a1
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonEvent_Image_Onclick.java
@@ -0,0 +1,45 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonEvent_Image_Onclick extends TestFlow {
+ public AG_CommonEvent_Image_Onclick() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonEvent");
+ testMap.put("testChildCaseInit", "AG_CommonEvent_Image_Onclick");
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonEvent_Input_Onclick.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonEvent_Input_Onclick.java
new file mode 100644
index 0000000..00eb917
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonEvent_Input_Onclick.java
@@ -0,0 +1,45 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonEvent_Input_Onclick extends TestFlow {
+ public AG_CommonEvent_Input_Onclick() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonEvent");
+ testMap.put("testChildCaseInit", "AG_CommonEvent_Input_Onclick");
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonEvent_Switch_Onclick.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonEvent_Switch_Onclick.java
new file mode 100644
index 0000000..30d2d46
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonEvent_Switch_Onclick.java
@@ -0,0 +1,45 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonEvent_Switch_Onclick extends TestFlow {
+ public AG_CommonEvent_Switch_Onclick() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonEvent");
+ testMap.put("testChildCaseInit", "AG_CommonEvent_Switch_Onclick");
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonEvent_Text_Onclick.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonEvent_Text_Onclick.java
new file mode 100644
index 0000000..74d27d6
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonEvent_Text_Onclick.java
@@ -0,0 +1,45 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonEvent_Text_Onclick extends TestFlow {
+ public AG_CommonEvent_Text_Onclick() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonEvent");
+ testMap.put("testChildCaseInit", "AG_CommonEvent_Text_Onclick");
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonEvent_Video_Onclick.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonEvent_Video_Onclick.java
new file mode 100644
index 0000000..6b699ed
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonEvent_Video_Onclick.java
@@ -0,0 +1,45 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonEvent_Video_Onclick extends TestFlow {
+ public AG_CommonEvent_Video_Onclick() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonEvent");
+ testMap.put("testChildCaseInit", "AG_CommonEvent_Video_Onclick");
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonEvent_Web_Onclick.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonEvent_Web_Onclick.java
new file mode 100644
index 0000000..88a9f48
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonEvent_Web_Onclick.java
@@ -0,0 +1,45 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonEvent_Web_Onclick extends TestFlow {
+ public AG_CommonEvent_Web_Onclick() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonEvent");
+ testMap.put("testChildCaseInit", "AG_CommonEvent_Web_Onclick");
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_A_Background_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_A_Background_Color.java
new file mode 100644
index 0000000..5d3d6f3
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_A_Background_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonStyle_A_Background_Color extends TestFlow {
+ public AG_CommonStyle_A_Background_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonStyle");
+ testMap.put("testChildCaseInit", "AG_CommonStyle_A_Background_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_CommonStyle_A_Background_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_CommonStyle_A_Background_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_A_Widthandheight.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_A_Widthandheight.java
new file mode 100644
index 0000000..616a4a1
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_A_Widthandheight.java
@@ -0,0 +1,69 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonStyle_A_Widthandheight extends TestFlow {
+ public AG_CommonStyle_A_Widthandheight() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonStyle");
+ testMap.put("testChildCaseInit", "AG_CommonStyle_A_Widthandheight");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "200");
+ put("screenshot", "AG_CommonStyle_A_Widthandheight_01_200");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "400");
+ put("screenshot", "AG_CommonStyle_A_Widthandheight_02_400");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "200");
+ put("screenshot", "AG_CommonStyle_A_Widthandheight_03_200");
+ }
+ });
+ testMap.put("step4",new TreeMap(){
+ {
+ put("click", "400");
+ put("screenshot", "AG_CommonStyle_A_Widthandheight_04_400");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Div_Background_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Div_Background_Color.java
new file mode 100644
index 0000000..b652e74
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Div_Background_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonStyle_Div_Background_Color extends TestFlow {
+ public AG_CommonStyle_Div_Background_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonStyle");
+ testMap.put("testChildCaseInit", "AG_CommonStyle_Div_Background_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_CommonStyle_Div_Background_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_CommonStyle_Div_Background_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Div_Widthandheight.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Div_Widthandheight.java
new file mode 100644
index 0000000..89b86b9
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Div_Widthandheight.java
@@ -0,0 +1,69 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonStyle_Div_Widthandheight extends TestFlow {
+ public AG_CommonStyle_Div_Widthandheight() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonStyle");
+ testMap.put("testChildCaseInit", "AG_CommonStyle_Div_Widthandheight");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "200");
+ put("screenshot", "AG_CommonStyle_Div_Widthandheight_01_200");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "400");
+ put("screenshot", "AG_CommonStyle_Div_Widthandheight_02_400");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "200");
+ put("screenshot", "AG_CommonStyle_Div_Widthandheight_03_200");
+ }
+ });
+ testMap.put("step4",new TreeMap(){
+ {
+ put("click", "400");
+ put("screenshot", "AG_CommonStyle_Div_Widthandheight_04_400");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Image_Background_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Image_Background_Color.java
new file mode 100644
index 0000000..fcf5c75
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Image_Background_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonStyle_Image_Background_Color extends TestFlow {
+ public AG_CommonStyle_Image_Background_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonStyle");
+ testMap.put("testChildCaseInit", "AG_CommonStyle_Image_Background_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_CommonStyle_Image_Background_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_CommonStyle_Image_Background_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Image_Widthandheight.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Image_Widthandheight.java
new file mode 100644
index 0000000..d350152
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Image_Widthandheight.java
@@ -0,0 +1,69 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonStyle_Image_Widthandheight extends TestFlow {
+ public AG_CommonStyle_Image_Widthandheight() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonStyle");
+ testMap.put("testChildCaseInit", "AG_CommonStyle_Image_Widthandheight");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "200");
+ put("screenshot", "AG_CommonStyle_Image_Widthandheight_01_200");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "400");
+ put("screenshot", "AG_CommonStyle_Image_Widthandheight_02_400");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "200");
+ put("screenshot", "AG_CommonStyle_Image_Widthandheight_03_200");
+ }
+ });
+ testMap.put("step4",new TreeMap(){
+ {
+ put("click", "400");
+ put("screenshot", "AG_CommonStyle_Image_Widthandheight_04_400");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Input_Background_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Input_Background_Color.java
new file mode 100644
index 0000000..6721685
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Input_Background_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonStyle_Input_Background_Color extends TestFlow {
+ public AG_CommonStyle_Input_Background_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonStyle");
+ testMap.put("testChildCaseInit", "AG_CommonStyle_Input_Background_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_CommonStyle_Input_Background_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_CommonStyle_Input_Background_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Input_Widthandheight.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Input_Widthandheight.java
new file mode 100644
index 0000000..e0af346
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Input_Widthandheight.java
@@ -0,0 +1,69 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonStyle_Input_Widthandheight extends TestFlow {
+ public AG_CommonStyle_Input_Widthandheight() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonStyle");
+ testMap.put("testChildCaseInit", "AG_CommonStyle_Input_Widthandheight");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "200");
+ put("screenshot", "AG_CommonStyle_Input_Widthandheight_01_200");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "400");
+ put("screenshot", "AG_CommonStyle_Input_Widthandheight_02_400");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "200");
+ put("screenshot", "AG_CommonStyle_Input_Widthandheight_03_200");
+ }
+ });
+ testMap.put("step4",new TreeMap(){
+ {
+ put("click", "400");
+ put("screenshot", "AG_CommonStyle_Input_Widthandheight_04_400");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Switch_Background_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Switch_Background_Color.java
new file mode 100644
index 0000000..3394336
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Switch_Background_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonStyle_Switch_Background_Color extends TestFlow {
+ public AG_CommonStyle_Switch_Background_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonStyle");
+ testMap.put("testChildCaseInit", "AG_CommonStyle_Switch_Background_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_CommonStyle_Switch_Background_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_CommonStyle_Switch_Background_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Switch_Widthandheight.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Switch_Widthandheight.java
new file mode 100644
index 0000000..abc76f6
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Switch_Widthandheight.java
@@ -0,0 +1,69 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonStyle_Switch_Widthandheight extends TestFlow {
+ public AG_CommonStyle_Switch_Widthandheight() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonStyle");
+ testMap.put("testChildCaseInit", "AG_CommonStyle_Switch_Widthandheight");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "200");
+ put("screenshot", "AG_CommonStyle_Switch_Widthandheight_01_200");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "400");
+ put("screenshot", "AG_CommonStyle_Switch_Widthandheight_02_400");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "200");
+ put("screenshot", "AG_CommonStyle_Switch_Widthandheight_03_200");
+ }
+ });
+ testMap.put("step4",new TreeMap(){
+ {
+ put("click", "400");
+ put("screenshot", "AG_CommonStyle_Switch_Widthandheight_04_400");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Text_Background_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Text_Background_Color.java
new file mode 100644
index 0000000..46fc85e
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Text_Background_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonStyle_Text_Background_Color extends TestFlow {
+ public AG_CommonStyle_Text_Background_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonStyle");
+ testMap.put("testChildCaseInit", "AG_CommonStyle_Text_Background_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_CommonStyle_Text_Background_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_CommonStyle_Text_Background_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Text_Widthandheight.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Text_Widthandheight.java
new file mode 100644
index 0000000..e35c9a6
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Text_Widthandheight.java
@@ -0,0 +1,69 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonStyle_Text_Widthandheight extends TestFlow {
+ public AG_CommonStyle_Text_Widthandheight() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonStyle");
+ testMap.put("testChildCaseInit", "AG_CommonStyle_Text_Widthandheight");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "200");
+ put("screenshot", "AG_CommonStyle_Text_Widthandheight_01_200");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "400");
+ put("screenshot", "AG_CommonStyle_Text_Widthandheight_02_400");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "200");
+ put("screenshot", "AG_CommonStyle_Text_Widthandheight_03_200");
+ }
+ });
+ testMap.put("step4",new TreeMap(){
+ {
+ put("click", "400");
+ put("screenshot", "AG_CommonStyle_Text_Widthandheight_04_400");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Video_Background_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Video_Background_Color.java
new file mode 100644
index 0000000..8f03948
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Video_Background_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonStyle_Video_Background_Color extends TestFlow {
+ public AG_CommonStyle_Video_Background_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonStyle");
+ testMap.put("testChildCaseInit", "AG_CommonStyle_Video_Background_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_CommonStyle_Video_Background_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_CommonStyle_Video_Background_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Video_Widthandheight.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Video_Widthandheight.java
new file mode 100644
index 0000000..97a8df8
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Video_Widthandheight.java
@@ -0,0 +1,69 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonStyle_Video_Widthandheight extends TestFlow {
+ public AG_CommonStyle_Video_Widthandheight() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonStyle");
+ testMap.put("testChildCaseInit", "AG_CommonStyle_Video_Widthandheight");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "200");
+ put("screenshot", "AG_CommonStyle_Video_Widthandheight_01_200");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "400");
+ put("screenshot", "AG_CommonStyle_Video_Widthandheight_02_400");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "200");
+ put("screenshot", "AG_CommonStyle_Video_Widthandheight_03_200");
+ }
+ });
+ testMap.put("step4",new TreeMap(){
+ {
+ put("click", "400");
+ put("screenshot", "AG_CommonStyle_Video_Widthandheight_04_400");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Web_Background_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Web_Background_Color.java
new file mode 100644
index 0000000..8d3c7de
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Web_Background_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonStyle_Web_Background_Color extends TestFlow {
+ public AG_CommonStyle_Web_Background_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonStyle");
+ testMap.put("testChildCaseInit", "AG_CommonStyle_Web_Background_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_CommonStyle_Web_Background_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#00FFFF");
+ put("screenshot", "AG_CommonStyle_Web_Background_Color_02_#00FFFF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Web_Widthandheight.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Web_Widthandheight.java
new file mode 100644
index 0000000..fde6ac9
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_CommonStyle_Web_Widthandheight.java
@@ -0,0 +1,69 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_CommonStyle_Web_Widthandheight extends TestFlow {
+ public AG_CommonStyle_Web_Widthandheight() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_CommonStyle");
+ testMap.put("testChildCaseInit", "AG_CommonStyle_Web_Widthandheight");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "200");
+ put("screenshot", "AG_CommonStyle_Web_Widthandheight_01_200");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "400");
+ put("screenshot", "AG_CommonStyle_Web_Widthandheight_02_400");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "200");
+ put("screenshot", "AG_CommonStyle_Web_Widthandheight_03_200");
+ }
+ });
+ testMap.put("step4",new TreeMap(){
+ {
+ put("click", "400");
+ put("screenshot", "AG_CommonStyle_Web_Widthandheight_04_400");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Gesture_Div_Click.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Gesture_Div_Click.java
new file mode 100644
index 0000000..91ff9ae
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Gesture_Div_Click.java
@@ -0,0 +1,45 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Gesture_Div_Click extends TestFlow {
+ public AG_Gesture_Div_Click() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Gesture");
+ testMap.put("testChildCaseInit", "AG_Gesture_Div_Click");
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Gesture_Div_Conflict.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Gesture_Div_Conflict.java
new file mode 100644
index 0000000..813c99c
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Gesture_Div_Conflict.java
@@ -0,0 +1,45 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Gesture_Div_Conflict extends TestFlow {
+ public AG_Gesture_Div_Conflict() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Gesture");
+ testMap.put("testChildCaseInit", "AG_Gesture_Div_Conflict");
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Gesture_Div_Longpress.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Gesture_Div_Longpress.java
new file mode 100644
index 0000000..5845b09
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Gesture_Div_Longpress.java
@@ -0,0 +1,45 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Gesture_Div_Longpress extends TestFlow {
+ public AG_Gesture_Div_Longpress() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Gesture");
+ testMap.put("testChildCaseInit", "AG_Gesture_Div_Longpress");
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Gesture_Div_Pan.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Gesture_Div_Pan.java
new file mode 100644
index 0000000..6a0229d
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Gesture_Div_Pan.java
@@ -0,0 +1,45 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Gesture_Div_Pan extends TestFlow {
+ public AG_Gesture_Div_Pan() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Gesture");
+ testMap.put("testChildCaseInit", "AG_Gesture_Div_Pan");
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Gesture_Div_Swipe.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Gesture_Div_Swipe.java
new file mode 100644
index 0000000..c24c85d
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Gesture_Div_Swipe.java
@@ -0,0 +1,45 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Gesture_Div_Swipe extends TestFlow {
+ public AG_Gesture_Div_Swipe() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Gesture");
+ testMap.put("testChildCaseInit", "AG_Gesture_Div_Swipe");
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Gesture_Div_Touch.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Gesture_Div_Touch.java
new file mode 100644
index 0000000..7e65386
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Gesture_Div_Touch.java
@@ -0,0 +1,45 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Gesture_Div_Touch extends TestFlow {
+ public AG_Gesture_Div_Touch() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Gesture");
+ testMap.put("testChildCaseInit", "AG_Gesture_Div_Touch");
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Image_Image_Onload.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Image_Image_Onload.java
new file mode 100644
index 0000000..63dd33a
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Image_Image_Onload.java
@@ -0,0 +1,45 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Image_Image_Onload extends TestFlow {
+ public AG_Image_Image_Onload() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Image");
+ testMap.put("testChildCaseInit", "AG_Image_Image_Onload");
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Image_Image_Resize.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Image_Image_Resize.java
new file mode 100644
index 0000000..c379554
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Image_Image_Resize.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Image_Image_Resize extends TestFlow {
+ public AG_Image_Image_Resize() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Image");
+ testMap.put("testChildCaseInit", "AG_Image_Image_Resize");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "stretch");
+ put("screenshot", "AG_Image_Image_Resize_01_stretch");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "cover");
+ put("screenshot", "AG_Image_Image_Resize_02_cover");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "contain");
+ put("screenshot", "AG_Image_Image_Resize_03_contain");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Image_Image_Src.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Image_Image_Src.java
new file mode 100644
index 0000000..d4dce32
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Image_Image_Src.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Image_Image_Src extends TestFlow {
+ public AG_Image_Image_Src() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Image");
+ testMap.put("testChildCaseInit", "AG_Image_Image_Src");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "src0");
+ put("screenshot", "AG_Image_Image_Src_01_src0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "src1");
+ put("screenshot", "AG_Image_Image_Src_02_src1");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Autofocus.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Autofocus.java
new file mode 100644
index 0000000..e560232
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Autofocus.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Input_Input_Autofocus extends TestFlow {
+ public AG_Input_Input_Autofocus() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Input");
+ testMap.put("testChildCaseInit", "AG_Input_Input_Autofocus");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "true");
+ put("screenshot", "AG_Input_Input_Autofocus_01_true");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "false");
+ put("screenshot", "AG_Input_Input_Autofocus_02_false");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Color.java
new file mode 100644
index 0000000..a1a6881
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Input_Input_Color extends TestFlow {
+ public AG_Input_Input_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Input");
+ testMap.put("testChildCaseInit", "AG_Input_Input_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Input_Input_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#FF00FF");
+ put("screenshot", "AG_Input_Input_Color_02_#FF00FF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Disabled.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Disabled.java
new file mode 100644
index 0000000..11ae61f
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Disabled.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Input_Input_Disabled extends TestFlow {
+ public AG_Input_Input_Disabled() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Input");
+ testMap.put("testChildCaseInit", "AG_Input_Input_Disabled");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "true");
+ put("screenshot", "AG_Input_Input_Disabled_01_true");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "false");
+ put("screenshot", "AG_Input_Input_Disabled_02_false");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Event.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Event.java
new file mode 100644
index 0000000..7e90bb8
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Event.java
@@ -0,0 +1,45 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Input_Input_Event extends TestFlow {
+ public AG_Input_Input_Event() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Input");
+ testMap.put("testChildCaseInit", "AG_Input_Input_Event");
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Font_Size.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Font_Size.java
new file mode 100644
index 0000000..7feb07d
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Font_Size.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Input_Input_Font_Size extends TestFlow {
+ public AG_Input_Input_Font_Size() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Input");
+ testMap.put("testChildCaseInit", "AG_Input_Input_Font_Size");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Input_Input_Font_Size_01_20");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "40");
+ put("screenshot", "AG_Input_Input_Font_Size_02_40");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Font_Style.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Font_Style.java
new file mode 100644
index 0000000..bdb4f70
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Font_Style.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Input_Input_Font_Style extends TestFlow {
+ public AG_Input_Input_Font_Style() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Input");
+ testMap.put("testChildCaseInit", "AG_Input_Input_Font_Style");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "normal");
+ put("screenshot", "AG_Input_Input_Font_Style_01_normal");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "italic");
+ put("screenshot", "AG_Input_Input_Font_Style_02_italic");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Font_Weight.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Font_Weight.java
new file mode 100644
index 0000000..fab6656
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Font_Weight.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Input_Input_Font_Weight extends TestFlow {
+ public AG_Input_Input_Font_Weight() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Input");
+ testMap.put("testChildCaseInit", "AG_Input_Input_Font_Weight");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "normal");
+ put("screenshot", "AG_Input_Input_Font_Weight_01_normal");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "bold");
+ put("screenshot", "AG_Input_Input_Font_Weight_02_bold");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Placeholder.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Placeholder.java
new file mode 100644
index 0000000..20cdca8
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Placeholder.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Input_Input_Placeholder extends TestFlow {
+ public AG_Input_Input_Placeholder() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Input");
+ testMap.put("testChildCaseInit", "AG_Input_Input_Placeholder");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "");
+ put("screenshot", "AG_Input_Input_Placeholder_01_");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "placeholder");
+ put("screenshot", "AG_Input_Input_Placeholder_02_placeholder");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Placeholder_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Placeholder_Color.java
new file mode 100644
index 0000000..935edbd
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Placeholder_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Input_Input_Placeholder_Color extends TestFlow {
+ public AG_Input_Input_Placeholder_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Input");
+ testMap.put("testChildCaseInit", "AG_Input_Input_Placeholder_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Input_Input_Placeholder_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#FF00FF");
+ put("screenshot", "AG_Input_Input_Placeholder_Color_02_#FF00FF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Text_Align.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Text_Align.java
new file mode 100644
index 0000000..dafed3b
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Text_Align.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Input_Input_Text_Align extends TestFlow {
+ public AG_Input_Input_Text_Align() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Input");
+ testMap.put("testChildCaseInit", "AG_Input_Input_Text_Align");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "left");
+ put("screenshot", "AG_Input_Input_Text_Align_01_left");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "center");
+ put("screenshot", "AG_Input_Input_Text_Align_02_center");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "right");
+ put("screenshot", "AG_Input_Input_Text_Align_03_right");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Type.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Type.java
new file mode 100644
index 0000000..3057b23
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Type.java
@@ -0,0 +1,75 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Input_Input_Type extends TestFlow {
+ public AG_Input_Input_Type() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Input");
+ testMap.put("testChildCaseInit", "AG_Input_Input_Type");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "text");
+ put("screenshot", "AG_Input_Input_Type_01_text");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "password");
+ put("screenshot", "AG_Input_Input_Type_02_password");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "tel");
+ put("screenshot", "AG_Input_Input_Type_03_tel");
+ }
+ });
+ testMap.put("step4",new TreeMap(){
+ {
+ put("click", "email");
+ put("screenshot", "AG_Input_Input_Type_04_email");
+ }
+ });
+ testMap.put("step5",new TreeMap(){
+ {
+ put("click", "url");
+ put("screenshot", "AG_Input_Input_Type_05_url");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Value.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Value.java
new file mode 100644
index 0000000..5c5aee1
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Input_Input_Value.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Input_Input_Value extends TestFlow {
+ public AG_Input_Input_Value() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Input");
+ testMap.put("testChildCaseInit", "AG_Input_Input_Value");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "AAA");
+ put("screenshot", "AG_Input_Input_Value_01_AAA");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "BBB");
+ put("screenshot", "AG_Input_Input_Value_02_BBB");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "");
+ put("screenshot", "AG_Input_Input_Value_03_");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_A_Margin.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_A_Margin.java
new file mode 100644
index 0000000..1dd5f47
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_A_Margin.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_A_Margin extends TestFlow {
+ public AG_Margin_A_Margin() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_A_Margin");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_A_Margin_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_A_Margin_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_A_Margin_Bottom.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_A_Margin_Bottom.java
new file mode 100644
index 0000000..a06c92a
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_A_Margin_Bottom.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_A_Margin_Bottom extends TestFlow {
+ public AG_Margin_A_Margin_Bottom() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_A_Margin_Bottom");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_A_Margin_Bottom_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_A_Margin_Bottom_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_A_Margin_Left.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_A_Margin_Left.java
new file mode 100644
index 0000000..869115e
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_A_Margin_Left.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_A_Margin_Left extends TestFlow {
+ public AG_Margin_A_Margin_Left() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_A_Margin_Left");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_A_Margin_Left_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_A_Margin_Left_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_A_Margin_Right.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_A_Margin_Right.java
new file mode 100644
index 0000000..f2b9ac0
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_A_Margin_Right.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_A_Margin_Right extends TestFlow {
+ public AG_Margin_A_Margin_Right() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_A_Margin_Right");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_A_Margin_Right_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_A_Margin_Right_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_A_Margin_Top.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_A_Margin_Top.java
new file mode 100644
index 0000000..2e86408
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_A_Margin_Top.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_A_Margin_Top extends TestFlow {
+ public AG_Margin_A_Margin_Top() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_A_Margin_Top");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_A_Margin_Top_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_A_Margin_Top_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Div_Margin.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Div_Margin.java
new file mode 100644
index 0000000..8168b07
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Div_Margin.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Div_Margin extends TestFlow {
+ public AG_Margin_Div_Margin() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Div_Margin");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Div_Margin_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Div_Margin_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Div_Margin_Bottom.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Div_Margin_Bottom.java
new file mode 100644
index 0000000..37341c2
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Div_Margin_Bottom.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Div_Margin_Bottom extends TestFlow {
+ public AG_Margin_Div_Margin_Bottom() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Div_Margin_Bottom");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Div_Margin_Bottom_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Div_Margin_Bottom_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Div_Margin_Left.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Div_Margin_Left.java
new file mode 100644
index 0000000..035ffb1
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Div_Margin_Left.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Div_Margin_Left extends TestFlow {
+ public AG_Margin_Div_Margin_Left() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Div_Margin_Left");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Div_Margin_Left_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Div_Margin_Left_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Div_Margin_Right.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Div_Margin_Right.java
new file mode 100644
index 0000000..c4e25a8
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Div_Margin_Right.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Div_Margin_Right extends TestFlow {
+ public AG_Margin_Div_Margin_Right() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Div_Margin_Right");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Div_Margin_Right_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Div_Margin_Right_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Div_Margin_Top.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Div_Margin_Top.java
new file mode 100644
index 0000000..acc20e5
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Div_Margin_Top.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Div_Margin_Top extends TestFlow {
+ public AG_Margin_Div_Margin_Top() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Div_Margin_Top");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Div_Margin_Top_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Div_Margin_Top_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Image_Margin.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Image_Margin.java
new file mode 100644
index 0000000..2f49cf5
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Image_Margin.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Image_Margin extends TestFlow {
+ public AG_Margin_Image_Margin() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Image_Margin");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Image_Margin_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Image_Margin_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Image_Margin_Bottom.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Image_Margin_Bottom.java
new file mode 100644
index 0000000..6455a29
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Image_Margin_Bottom.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Image_Margin_Bottom extends TestFlow {
+ public AG_Margin_Image_Margin_Bottom() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Image_Margin_Bottom");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Image_Margin_Bottom_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Image_Margin_Bottom_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Image_Margin_Left.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Image_Margin_Left.java
new file mode 100644
index 0000000..7e133d6
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Image_Margin_Left.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Image_Margin_Left extends TestFlow {
+ public AG_Margin_Image_Margin_Left() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Image_Margin_Left");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Image_Margin_Left_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Image_Margin_Left_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Image_Margin_Right.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Image_Margin_Right.java
new file mode 100644
index 0000000..0f46ff0
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Image_Margin_Right.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Image_Margin_Right extends TestFlow {
+ public AG_Margin_Image_Margin_Right() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Image_Margin_Right");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Image_Margin_Right_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Image_Margin_Right_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Image_Margin_Top.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Image_Margin_Top.java
new file mode 100644
index 0000000..d570690
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Image_Margin_Top.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Image_Margin_Top extends TestFlow {
+ public AG_Margin_Image_Margin_Top() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Image_Margin_Top");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Image_Margin_Top_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Image_Margin_Top_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Input_Margin.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Input_Margin.java
new file mode 100644
index 0000000..5613ec2
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Input_Margin.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Input_Margin extends TestFlow {
+ public AG_Margin_Input_Margin() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Input_Margin");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Input_Margin_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Input_Margin_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Input_Margin_Bottom.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Input_Margin_Bottom.java
new file mode 100644
index 0000000..5314ed3
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Input_Margin_Bottom.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Input_Margin_Bottom extends TestFlow {
+ public AG_Margin_Input_Margin_Bottom() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Input_Margin_Bottom");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Input_Margin_Bottom_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Input_Margin_Bottom_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Input_Margin_Left.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Input_Margin_Left.java
new file mode 100644
index 0000000..4d836c5
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Input_Margin_Left.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Input_Margin_Left extends TestFlow {
+ public AG_Margin_Input_Margin_Left() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Input_Margin_Left");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Input_Margin_Left_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Input_Margin_Left_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Input_Margin_Right.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Input_Margin_Right.java
new file mode 100644
index 0000000..10f4406
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Input_Margin_Right.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Input_Margin_Right extends TestFlow {
+ public AG_Margin_Input_Margin_Right() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Input_Margin_Right");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Input_Margin_Right_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Input_Margin_Right_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Input_Margin_Top.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Input_Margin_Top.java
new file mode 100644
index 0000000..2e80986
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Input_Margin_Top.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Input_Margin_Top extends TestFlow {
+ public AG_Margin_Input_Margin_Top() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Input_Margin_Top");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Input_Margin_Top_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Input_Margin_Top_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Switch_Margin.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Switch_Margin.java
new file mode 100644
index 0000000..4c4216f
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Switch_Margin.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Switch_Margin extends TestFlow {
+ public AG_Margin_Switch_Margin() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Switch_Margin");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Switch_Margin_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Switch_Margin_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Switch_Margin_Bottom.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Switch_Margin_Bottom.java
new file mode 100644
index 0000000..f5b1bf0
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Switch_Margin_Bottom.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Switch_Margin_Bottom extends TestFlow {
+ public AG_Margin_Switch_Margin_Bottom() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Switch_Margin_Bottom");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Switch_Margin_Bottom_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Switch_Margin_Bottom_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Switch_Margin_Left.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Switch_Margin_Left.java
new file mode 100644
index 0000000..7170d3f
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Switch_Margin_Left.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Switch_Margin_Left extends TestFlow {
+ public AG_Margin_Switch_Margin_Left() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Switch_Margin_Left");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Switch_Margin_Left_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Switch_Margin_Left_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Switch_Margin_Right.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Switch_Margin_Right.java
new file mode 100644
index 0000000..bb084f4
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Switch_Margin_Right.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Switch_Margin_Right extends TestFlow {
+ public AG_Margin_Switch_Margin_Right() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Switch_Margin_Right");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Switch_Margin_Right_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Switch_Margin_Right_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Switch_Margin_Top.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Switch_Margin_Top.java
new file mode 100644
index 0000000..c62f248
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Switch_Margin_Top.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Switch_Margin_Top extends TestFlow {
+ public AG_Margin_Switch_Margin_Top() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Switch_Margin_Top");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Switch_Margin_Top_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Switch_Margin_Top_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Text_Margin.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Text_Margin.java
new file mode 100644
index 0000000..88ba773
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Text_Margin.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Text_Margin extends TestFlow {
+ public AG_Margin_Text_Margin() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Text_Margin");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Text_Margin_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Text_Margin_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Text_Margin_Bottom.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Text_Margin_Bottom.java
new file mode 100644
index 0000000..0ee08b8
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Text_Margin_Bottom.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Text_Margin_Bottom extends TestFlow {
+ public AG_Margin_Text_Margin_Bottom() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Text_Margin_Bottom");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Text_Margin_Bottom_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Text_Margin_Bottom_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Text_Margin_Left.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Text_Margin_Left.java
new file mode 100644
index 0000000..8b17f82
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Text_Margin_Left.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Text_Margin_Left extends TestFlow {
+ public AG_Margin_Text_Margin_Left() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Text_Margin_Left");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Text_Margin_Left_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Text_Margin_Left_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Text_Margin_Right.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Text_Margin_Right.java
new file mode 100644
index 0000000..56ef575
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Text_Margin_Right.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Text_Margin_Right extends TestFlow {
+ public AG_Margin_Text_Margin_Right() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Text_Margin_Right");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Text_Margin_Right_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Text_Margin_Right_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Text_Margin_Top.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Text_Margin_Top.java
new file mode 100644
index 0000000..49e8ff4
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Text_Margin_Top.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Text_Margin_Top extends TestFlow {
+ public AG_Margin_Text_Margin_Top() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Text_Margin_Top");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Text_Margin_Top_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Text_Margin_Top_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Video_Margin.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Video_Margin.java
new file mode 100644
index 0000000..5a2b07d
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Video_Margin.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Video_Margin extends TestFlow {
+ public AG_Margin_Video_Margin() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Video_Margin");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Video_Margin_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Video_Margin_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Video_Margin_Bottom.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Video_Margin_Bottom.java
new file mode 100644
index 0000000..d229ce5
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Video_Margin_Bottom.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Video_Margin_Bottom extends TestFlow {
+ public AG_Margin_Video_Margin_Bottom() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Video_Margin_Bottom");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Video_Margin_Bottom_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Video_Margin_Bottom_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Video_Margin_Left.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Video_Margin_Left.java
new file mode 100644
index 0000000..bf75054
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Video_Margin_Left.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Video_Margin_Left extends TestFlow {
+ public AG_Margin_Video_Margin_Left() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Video_Margin_Left");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Video_Margin_Left_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Video_Margin_Left_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Video_Margin_Right.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Video_Margin_Right.java
new file mode 100644
index 0000000..6637069
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Video_Margin_Right.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Video_Margin_Right extends TestFlow {
+ public AG_Margin_Video_Margin_Right() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Video_Margin_Right");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Video_Margin_Right_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Video_Margin_Right_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Video_Margin_Top.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Video_Margin_Top.java
new file mode 100644
index 0000000..9922efa
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Video_Margin_Top.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Video_Margin_Top extends TestFlow {
+ public AG_Margin_Video_Margin_Top() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Video_Margin_Top");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Video_Margin_Top_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Video_Margin_Top_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Web_Margin.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Web_Margin.java
new file mode 100644
index 0000000..a6e2f53
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Web_Margin.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Web_Margin extends TestFlow {
+ public AG_Margin_Web_Margin() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Web_Margin");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Web_Margin_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Web_Margin_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Web_Margin_Bottom.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Web_Margin_Bottom.java
new file mode 100644
index 0000000..d06b17a
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Web_Margin_Bottom.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Web_Margin_Bottom extends TestFlow {
+ public AG_Margin_Web_Margin_Bottom() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Web_Margin_Bottom");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Web_Margin_Bottom_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Web_Margin_Bottom_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Web_Margin_Left.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Web_Margin_Left.java
new file mode 100644
index 0000000..870ca4c
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Web_Margin_Left.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Web_Margin_Left extends TestFlow {
+ public AG_Margin_Web_Margin_Left() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Web_Margin_Left");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Web_Margin_Left_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Web_Margin_Left_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Web_Margin_Right.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Web_Margin_Right.java
new file mode 100644
index 0000000..7b5e6eb
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Web_Margin_Right.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Web_Margin_Right extends TestFlow {
+ public AG_Margin_Web_Margin_Right() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Web_Margin_Right");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Web_Margin_Right_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Web_Margin_Right_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Web_Margin_Top.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Web_Margin_Top.java
new file mode 100644
index 0000000..ee70571
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Margin_Web_Margin_Top.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Margin_Web_Margin_Top extends TestFlow {
+ public AG_Margin_Web_Margin_Top() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Margin");
+ testMap.put("testChildCaseInit", "AG_Margin_Web_Margin_Top");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "10");
+ put("screenshot", "AG_Margin_Web_Margin_Top_01_10");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Margin_Web_Margin_Top_02_20");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Switch_Switch_Checked.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Switch_Switch_Checked.java
new file mode 100644
index 0000000..1747ef1
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Switch_Switch_Checked.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Switch_Switch_Checked extends TestFlow {
+ public AG_Switch_Switch_Checked() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Switch");
+ testMap.put("testChildCaseInit", "AG_Switch_Switch_Checked");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "true");
+ put("screenshot", "AG_Switch_Switch_Checked_01_true");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "false");
+ put("screenshot", "AG_Switch_Switch_Checked_02_false");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Switch_Switch_Onchange.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Switch_Switch_Onchange.java
new file mode 100644
index 0000000..2dac859
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Switch_Switch_Onchange.java
@@ -0,0 +1,45 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Switch_Switch_Onchange extends TestFlow {
+ public AG_Switch_Switch_Onchange() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Switch");
+ testMap.put("testChildCaseInit", "AG_Switch_Switch_Onchange");
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Color.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Color.java
new file mode 100644
index 0000000..c775a76
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Color.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Text_Text_Color extends TestFlow {
+ public AG_Text_Text_Color() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Text");
+ testMap.put("testChildCaseInit", "AG_Text_Text_Color");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "#FF0000");
+ put("screenshot", "AG_Text_Text_Color_01_#FF0000");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "#FF00FF");
+ put("screenshot", "AG_Text_Text_Color_02_#FF00FF");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Font_Size.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Font_Size.java
new file mode 100644
index 0000000..ad07f3d
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Font_Size.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Text_Text_Font_Size extends TestFlow {
+ public AG_Text_Text_Font_Size() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Text");
+ testMap.put("testChildCaseInit", "AG_Text_Text_Font_Size");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "20");
+ put("screenshot", "AG_Text_Text_Font_Size_01_20");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "40");
+ put("screenshot", "AG_Text_Text_Font_Size_02_40");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Font_Style.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Font_Style.java
new file mode 100644
index 0000000..0f16915
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Font_Style.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Text_Text_Font_Style extends TestFlow {
+ public AG_Text_Text_Font_Style() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Text");
+ testMap.put("testChildCaseInit", "AG_Text_Text_Font_Style");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "normal");
+ put("screenshot", "AG_Text_Text_Font_Style_01_normal");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "italic");
+ put("screenshot", "AG_Text_Text_Font_Style_02_italic");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Font_Weight.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Font_Weight.java
new file mode 100644
index 0000000..083e831
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Font_Weight.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Text_Text_Font_Weight extends TestFlow {
+ public AG_Text_Text_Font_Weight() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Text");
+ testMap.put("testChildCaseInit", "AG_Text_Text_Font_Weight");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "normal");
+ put("screenshot", "AG_Text_Text_Font_Weight_01_normal");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "bold");
+ put("screenshot", "AG_Text_Text_Font_Weight_02_bold");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Line_Height.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Line_Height.java
new file mode 100644
index 0000000..dec09a7
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Line_Height.java
@@ -0,0 +1,69 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Text_Text_Line_Height extends TestFlow {
+ public AG_Text_Text_Line_Height() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Text");
+ testMap.put("testChildCaseInit", "AG_Text_Text_Line_Height");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "-25");
+ put("screenshot", "AG_Text_Text_Line_Height_01_-25");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Text_Text_Line_Height_02_0");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "25");
+ put("screenshot", "AG_Text_Text_Line_Height_03_25");
+ }
+ });
+ testMap.put("step4",new TreeMap(){
+ {
+ put("click", "50");
+ put("screenshot", "AG_Text_Text_Line_Height_04_50");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Text_Align.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Text_Align.java
new file mode 100644
index 0000000..7a590fb
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Text_Align.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Text_Text_Text_Align extends TestFlow {
+ public AG_Text_Text_Text_Align() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Text");
+ testMap.put("testChildCaseInit", "AG_Text_Text_Text_Align");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "left");
+ put("screenshot", "AG_Text_Text_Text_Align_01_left");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "center");
+ put("screenshot", "AG_Text_Text_Text_Align_02_center");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "right");
+ put("screenshot", "AG_Text_Text_Text_Align_03_right");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Text_Decoration.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Text_Decoration.java
new file mode 100644
index 0000000..06074e3
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Text_Decoration.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Text_Text_Text_Decoration extends TestFlow {
+ public AG_Text_Text_Text_Decoration() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Text");
+ testMap.put("testChildCaseInit", "AG_Text_Text_Text_Decoration");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "none");
+ put("screenshot", "AG_Text_Text_Text_Decoration_01_none");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "underline");
+ put("screenshot", "AG_Text_Text_Text_Decoration_02_underline");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "line-through");
+ put("screenshot", "AG_Text_Text_Text_Decoration_03_line-through");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Text_Overflow.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Text_Overflow.java
new file mode 100644
index 0000000..132e3bd
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Text_Overflow.java
@@ -0,0 +1,75 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Text_Text_Text_Overflow extends TestFlow {
+ public AG_Text_Text_Text_Overflow() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Text");
+ testMap.put("testChildCaseInit", "AG_Text_Text_Text_Overflow");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "clip");
+ put("screenshot", "AG_Text_Text_Text_Overflow_01_clip");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "ellipsis");
+ put("screenshot", "AG_Text_Text_Text_Overflow_02_ellipsis");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "0");
+ put("screenshot", "AG_Text_Text_Text_Overflow_03_0");
+ }
+ });
+ testMap.put("step4",new TreeMap(){
+ {
+ put("click", "1");
+ put("screenshot", "AG_Text_Text_Text_Overflow_04_1");
+ }
+ });
+ testMap.put("step5",new TreeMap(){
+ {
+ put("click", "2");
+ put("screenshot", "AG_Text_Text_Text_Overflow_05_2");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Value.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Value.java
new file mode 100644
index 0000000..975efdb
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Text_Text_Value.java
@@ -0,0 +1,63 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Text_Text_Value extends TestFlow {
+ public AG_Text_Text_Value() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Text");
+ testMap.put("testChildCaseInit", "AG_Text_Text_Value");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "AAA");
+ put("screenshot", "AG_Text_Text_Value_01_AAA");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "BBB");
+ put("screenshot", "AG_Text_Text_Value_02_BBB");
+ }
+ });
+ testMap.put("step3",new TreeMap(){
+ {
+ put("click", "");
+ put("screenshot", "AG_Text_Text_Value_03_");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Video_Video_Auto_Play.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Video_Video_Auto_Play.java
new file mode 100644
index 0000000..fdd77fe
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Video_Video_Auto_Play.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Video_Video_Auto_Play extends TestFlow {
+ public AG_Video_Video_Auto_Play() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Video");
+ testMap.put("testChildCaseInit", "AG_Video_Video_Auto_Play");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "true");
+ put("screenshot", "AG_Video_Video_Auto_Play_01_true");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "false");
+ put("screenshot", "AG_Video_Video_Auto_Play_02_false");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Video_Video_Event.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Video_Video_Event.java
new file mode 100644
index 0000000..134ed0f
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Video_Video_Event.java
@@ -0,0 +1,45 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Video_Video_Event extends TestFlow {
+ public AG_Video_Video_Event() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Video");
+ testMap.put("testChildCaseInit", "AG_Video_Video_Event");
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Video_Video_Play_Status.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Video_Video_Play_Status.java
new file mode 100644
index 0000000..b760f53
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Video_Video_Play_Status.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Video_Video_Play_Status extends TestFlow {
+ public AG_Video_Video_Play_Status() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Video");
+ testMap.put("testChildCaseInit", "AG_Video_Video_Play_Status");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "play");
+ put("screenshot", "AG_Video_Video_Play_Status_01_play");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "pause");
+ put("screenshot", "AG_Video_Video_Play_Status_02_pause");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Video_Video_Src.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Video_Video_Src.java
new file mode 100644
index 0000000..fd59a74
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Video_Video_Src.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Video_Video_Src extends TestFlow {
+ public AG_Video_Video_Src() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Video");
+ testMap.put("testChildCaseInit", "AG_Video_Video_Src");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "src0");
+ put("screenshot", "AG_Video_Video_Src_01_src0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "src1");
+ put("screenshot", "AG_Video_Video_Src_02_src1");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Web_Web_Event.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Web_Web_Event.java
new file mode 100644
index 0000000..02dc357
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Web_Web_Event.java
@@ -0,0 +1,45 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Web_Web_Event extends TestFlow {
+ public AG_Web_Web_Event() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Web");
+ testMap.put("testChildCaseInit", "AG_Web_Web_Event");
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Web_Web_Src.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Web_Web_Src.java
new file mode 100644
index 0000000..c3e1fa3
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AG/AG_Web_Web_Src.java
@@ -0,0 +1,57 @@
+/*
+ * 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.uitest.TC_AG;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.util.TestFlow;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AG_Web_Web_Src extends TestFlow {
+ public AG_Web_Web_Src() {
+ super(WXPageActivity.class);
+ }
+
+ @Before
+ public void setUp() throws InterruptedException {
+ super.setUp();
+ TreeMap testMap = new <String, Object> TreeMap();
+ testMap.put("testComponet", "AG_Web");
+ testMap.put("testChildCaseInit", "AG_Web_Web_Src");
+ testMap.put("step1",new TreeMap(){
+ {
+ put("click", "src0");
+ put("screenshot", "AG_Web_Web_Src_01_src0");
+ }
+ });
+ testMap.put("step2",new TreeMap(){
+ {
+ put("click", "src1");
+ put("screenshot", "AG_Web_Web_Src_02_src1");
+ }
+ });
+ super.setTestMap(testMap);
+ }
+
+ @Test
+ public void doTest(){
+ super.testByTestMap();
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AHref/WeexUiTestCaseTCAHrefEvent.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AHref/WeexUiTestCaseTCAHrefEvent.java
new file mode 100644
index 0000000..aa4853b
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AHref/WeexUiTestCaseTCAHrefEvent.java
@@ -0,0 +1,296 @@
+/*
+ * 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.uitest.TC_AHref;
+
+import android.app.Activity;
+import android.app.Application;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.InstrumentationTestCase;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.EditText;
+import android.widget.FrameLayout;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.WeappJsBaseTestCase;
+import com.alibaba.weex.constants.Constants;
+import com.alibaba.weex.util.ScreenShot;
+import com.alibaba.weex.util.ViewUtil;
+import com.taobao.weex.ui.component.WXText;
+import com.taobao.weex.ui.view.WXTextView;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Created by admin on 16/3/23.
+ */
+public class WeexUiTestCaseTCAHrefEvent extends ActivityInstrumentationTestCase2<WXPageActivity> {
+ public final String TAG = "TestScript_Guide==";
+ public WeappJsBaseTestCase weappApplication;
+ public WXPageActivity waTestPageActivity;
+ public WXPageActivity waTestPageActivity2;
+
+ public ViewGroup mViewGroup;
+ public Application mApplication;
+ public Instrumentation mInstrumentation;
+
+ public ArrayList<View> mCaseListIndexView = new ArrayList<View>();
+ public boolean targetComponetNotFound = false;
+
+ public WeexUiTestCaseTCAHrefEvent() {
+ super(WXPageActivity.class);
+ }
+
+ public void setUp() throws Exception{
+
+ Log.e("TestScript_Guide", "setUp test!!");
+ setActivityInitialTouchMode(false);
+ weappApplication = new WeappJsBaseTestCase();
+ mInstrumentation = getInstrumentation();
+
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ waTestPageActivity = getActivity();
+// waTestPageActivity.getIntent().getData().toString();
+ Log.e(TAG, "activity1=" + waTestPageActivity.toString());
+ Thread.sleep(3000);
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ setViewGroup(mViewGroup);
+
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, "TC_");
+ setUpToFindComponet("TC_", this);
+
+ Thread.sleep(3000);
+ }
+
+ public void testAherf(){
+
+ findTargetComponetIfNotFound("TC_", this);
+
+ for(final View caseView : mCaseListIndexView){
+ if (((WXTextView)caseView).getText().toString().equals("TC_A")){
+ Log.e(TAG, "TC_AHref find");
+
+ final WXTextView inputView = (WXTextView)caseView;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ }
+ });
+
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+ Log.e(TAG, "activity2 = " + activity2.toString());
+
+ ViewGroup myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ Log.e(TAG, myGroup.toString());
+
+ ArrayList<View> inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "TC_A_Event");
+ Log.e(TAG, "TC_AHref_Event size== " + inputListView.size());
+ sleep(2000);
+
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_AHref_Event clcik!");
+ }
+ });
+
+ sleep(3000);
+ Log.e(TAG, "TC_AHref_Event_01_init snap!");
+ screenShot("TC_AHref_Event_01_init");
+ sleep(3000);
+ }
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ activity2 = getActivity();
+ Log.e(TAG, "activity2 = " + activity2.toString());
+
+ myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ ArrayList<View> inputListView11 = new ArrayList<View>();
+ sleep(3000);
+
+ inputListView11 = ViewUtil.getAllChildViews(myGroup);
+
+ for(View view :inputListView11){
+ if(view instanceof WXTextView){
+ if(((WXTextView) view).getText().toString().contains("Hello Weex")){
+ final FrameLayout aView = (FrameLayout)view.getParent();
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ aView.requestFocus();
+ aView.performClick();
+ Log.e(TAG, "TC_AHref_Event_02_afterClick clcik!");
+
+ }
+ });
+
+ sleep(2000);
+ Log.e(TAG, "TC_AHref_Event_02_afterClick snap!");
+ screenShot("TC_AHref_Event_02_afterClick");
+ sleep(2000);
+ break;
+ }
+ }
+ }
+ }
+ else{
+ targetComponetNotFound = true;
+ }
+ }
+
+ }
+
+
+
+ /**
+ * get tc list by text
+ * @param byText
+ * @return
+ * @throws InterruptedException
+ */
+ public ArrayList<View> getTestCaseListViewByText(String byText) throws InterruptedException {
+ Log.e("TestScript_Guide", "byText ==" + byText);
+
+ if(TextUtils.isEmpty(byText)){
+ return null;
+ }
+ ArrayList<View> outViews = new ArrayList<View>();
+
+ mViewGroup.findViewsWithText(outViews, byText, View.FIND_VIEWS_WITH_TEXT);
+
+ for (View view : outViews){
+ String viewText = ((WXTextView)view).getText().toString();
+ Log.e(TAG, "viewText ==" + viewText);
+
+
+ }
+ return outViews;
+ }
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(String caseText){
+ if (mCaseListIndexView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<mCaseListIndexView.size();i++){
+
+ view = (WXTextView)mCaseListIndexView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ try {
+ ScreenShot.shoot(WXPageActivity.wxPageActivityInstance, shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setViewGroup(ViewGroup viewGroup){
+ mViewGroup = viewGroup;
+ }
+
+ /**
+ *
+ */
+ public void findTargetComponetIfNotFound(String target, InstrumentationTestCase test){
+ if(mCaseListIndexView.size() ==1 || targetComponetNotFound){
+ if(((WXTextView)mCaseListIndexView.get(0))
+ .getText()
+ .toString()
+ .equals("TC__Home")){
+ sleep(1000);
+ TouchUtils.dragQuarterScreenUp(test,WXPageActivity.wxPageActivityInstance );
+ mViewGroup = (ViewGroup) WXPageActivity.wxPageActivityInstance.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ }
+
+ sleep(1000);
+ TouchUtils.dragQuarterScreenUp(test, WXPageActivity.wxPageActivityInstance );
+ mViewGroup = (ViewGroup) WXPageActivity.wxPageActivityInstance.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ }
+ }
+
+ /**
+ *
+ */
+ public void setUpToFindComponet(String target, InstrumentationTestCase test){
+ int max = 60;
+ int count = 0;
+ while(mCaseListIndexView.size() == 0){
+
+ if (count < max){
+ TouchUtils.dragQuarterScreenUp(test, WXPageActivity.wxPageActivityInstance );
+ mViewGroup = (ViewGroup) WXPageActivity.wxPageActivityInstance.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ count ++;
+ }
+ else{
+ break;
+ }
+
+ }
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AHref/WeexUiTestCaseTCAHrefStyle.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AHref/WeexUiTestCaseTCAHrefStyle.java
new file mode 100644
index 0000000..9256a7b
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AHref/WeexUiTestCaseTCAHrefStyle.java
@@ -0,0 +1,267 @@
+/*
+ * 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.uitest.TC_AHref;
+
+import android.app.Activity;
+import android.app.Application;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.InstrumentationTestCase;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.WeappJsBaseTestCase;
+import com.alibaba.weex.constants.Constants;
+import com.alibaba.weex.util.ScreenShot;
+import com.alibaba.weex.util.ViewUtil;
+import com.taobao.weex.ui.view.WXTextView;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Created by admin on 16/3/23.
+ */
+public class WeexUiTestCaseTCAHrefStyle extends ActivityInstrumentationTestCase2<WXPageActivity> {
+ public final String TAG = "TestScript_Guide==";
+ public WeappJsBaseTestCase weappApplication;
+ public WXPageActivity waTestPageActivity;
+ public WXPageActivity waTestPageActivity2;
+
+ public ViewGroup mViewGroup;
+ public Application mApplication;
+ public Instrumentation mInstrumentation;
+
+ public ArrayList<View> mCaseListIndexView = new ArrayList<View>();
+ private boolean targetComponetNotFound;
+
+ public WeexUiTestCaseTCAHrefStyle() {
+ super(WXPageActivity.class);
+ }
+
+ public void setUp() throws Exception{
+
+ Log.e("TestScript_Guide", "setUp test!!");
+ setActivityInitialTouchMode(false);
+ weappApplication = new WeappJsBaseTestCase();
+ mInstrumentation = getInstrumentation();
+
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ waTestPageActivity = getActivity();
+// waTestPageActivity.getIntent().getData().toString();
+ Log.e(TAG, "activity1=" + waTestPageActivity.toString());
+ Thread.sleep(3000);
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ setViewGroup(mViewGroup);
+
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, "TC_");
+ setUpToFindComponet("TC_", this);
+ Thread.sleep(3000);
+ }
+
+// public void testPreConditions()
+// {
+// assertNotNull(waTestPageActivity);
+// assertNotNull(mViewGroup);
+// assertNotNull(mCaseListIndexView);
+//
+// }
+
+ public void testAherfStyle(){
+
+ findTargetComponetIfNotFound("TC_", this);
+ for(final View caseView : mCaseListIndexView){
+ if (((WXTextView)caseView).getText().toString().equals("TC_A")){
+ Log.e(TAG, "TC_AHref find");
+
+ final WXTextView inputView = (WXTextView)caseView;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ }
+ });
+
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+ Log.e(TAG, "activity2 = " + activity2.toString());
+
+ ViewGroup myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ Log.e(TAG, myGroup.toString());
+
+ ArrayList<View> inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "TC_A_Style");
+ Log.e(TAG, "TC_AHref_Style size== " + inputListView.size());
+ sleep(2000);
+
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_AHref_Style clcik!");
+ }
+ });
+
+ sleep(3000);
+ Log.e(TAG, "TC_AHref_Style snap!");
+ screenShot("TC_AHref_Style");
+ sleep(3000);
+ }
+ }
+ else{
+ targetComponetNotFound = true;
+ }
+ }
+
+ }
+
+
+
+ /**
+ * get tc list by text
+ * @param byText
+ * @return
+ * @throws InterruptedException
+ */
+ public ArrayList<View> getTestCaseListViewByText(String byText) throws InterruptedException {
+ Log.e("TestScript_Guide", "byText ==" + byText);
+
+ if(TextUtils.isEmpty(byText)){
+ return null;
+ }
+ ArrayList<View> outViews = new ArrayList<View>();
+
+ mViewGroup.findViewsWithText(outViews, byText, View.FIND_VIEWS_WITH_TEXT);
+
+ for (View view : outViews){
+ String viewText = ((WXTextView)view).getText().toString();
+ Log.e(TAG, "viewText ==" + viewText);
+
+
+ }
+ return outViews;
+ }
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(String caseText){
+ if (mCaseListIndexView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<mCaseListIndexView.size();i++){
+
+ view = (WXTextView)mCaseListIndexView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ try {
+ ScreenShot.shoot(WXPageActivity.wxPageActivityInstance, shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setViewGroup(ViewGroup viewGroup){
+ mViewGroup = viewGroup;
+ }
+ /**
+ *
+ */
+ public void findTargetComponetIfNotFound(String target, InstrumentationTestCase test){
+
+ if(mCaseListIndexView.size() ==1 || targetComponetNotFound){
+ if(((WXTextView)mCaseListIndexView.get(0))
+ .getText()
+ .toString()
+ .equals("TC__Home")){
+ sleep(2000);
+ TouchUtils.dragQuarterScreenUp(test,WXPageActivity.wxPageActivityInstance );
+ mViewGroup = (ViewGroup) WXPageActivity.wxPageActivityInstance.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ }
+ sleep(2000);
+ TouchUtils.dragQuarterScreenUp(test, WXPageActivity.wxPageActivityInstance );
+ mViewGroup = (ViewGroup) WXPageActivity.wxPageActivityInstance.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ }
+ }
+
+ /**
+ *
+ */
+ public void setUpToFindComponet(String target, InstrumentationTestCase test){
+ int max = 60;
+ int count = 0;
+ while(mCaseListIndexView.size() == 0){
+
+ if (count < max){
+ TouchUtils.dragQuarterScreenUp(test, WXPageActivity.wxPageActivityInstance );
+ mViewGroup = (ViewGroup) WXPageActivity.wxPageActivityInstance.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ count ++;
+ }
+ else{
+ break;
+ }
+
+ }
+ }
+
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AHref/WeexUiTestCaseTCAHrefUpdate.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AHref/WeexUiTestCaseTCAHrefUpdate.java
new file mode 100644
index 0000000..b27e6a2
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AHref/WeexUiTestCaseTCAHrefUpdate.java
@@ -0,0 +1,318 @@
+/*
+ * 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.uitest.TC_AHref;
+
+import android.app.Activity;
+import android.app.Application;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.InstrumentationTestCase;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.WeappJsBaseTestCase;
+import com.alibaba.weex.constants.Constants;
+import com.alibaba.weex.util.ScreenShot;
+import com.alibaba.weex.util.ViewUtil;
+import com.taobao.weex.ui.view.WXTextView;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Created by admin on 16/3/23.
+ */
+public class WeexUiTestCaseTCAHrefUpdate extends ActivityInstrumentationTestCase2<WXPageActivity> {
+ public final String TAG = "TestScript_Guide==";
+ public WeappJsBaseTestCase weappApplication;
+ public WXPageActivity waTestPageActivity;
+ public WXPageActivity waTestPageActivity2;
+
+ public ViewGroup mViewGroup;
+ public Application mApplication;
+ public Instrumentation mInstrumentation;
+
+ public ArrayList<View> mCaseListIndexView = new ArrayList<View>();
+ private boolean targetComponetNotFound;
+
+ public WeexUiTestCaseTCAHrefUpdate() {
+ super(WXPageActivity.class);
+ }
+
+ public void setUp() throws Exception{
+
+ Log.e("TestScript_Guide", "setUp test!!");
+ setActivityInitialTouchMode(false);
+ weappApplication = new WeappJsBaseTestCase();
+ mInstrumentation = getInstrumentation();
+
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ waTestPageActivity = getActivity();
+// waTestPageActivity.getIntent().getData().toString();
+ Log.e(TAG, "activity1=" + waTestPageActivity.toString());
+ Thread.sleep(3000);
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ setViewGroup(mViewGroup);
+
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, "TC_");
+ setUpToFindComponet("TC_", this);
+ Thread.sleep(2000);
+ }
+
+// public void testPreConditions()
+// {
+// assertNotNull(waTestPageActivity);
+// assertNotNull(mViewGroup);
+// assertNotNull(mCaseListIndexView);
+//
+// }
+
+ public void testAherf(){
+ findTargetComponetIfNotFound("TC_", this);
+ for(final View caseView : mCaseListIndexView){
+ if (((WXTextView)caseView).getText().toString().equals("TC_A")){
+ Log.e(TAG, "TC_AHref find");
+
+ final WXTextView inputView = (WXTextView)caseView;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ }
+ });
+
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+ Log.e(TAG, "activity2 = " + activity2.toString());
+
+ ViewGroup myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ Log.e(TAG, myGroup.toString());
+
+ ArrayList<View> inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "TC_A_Update");
+ Log.e(TAG, "TC_AHref_Update size== " + inputListView.size());
+ sleep(2000);
+
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_AHref_Update clcik!");
+ }
+ });
+
+ sleep(3000);
+ Log.e(TAG, "TC_AHref_Update_01_init snap!");
+ screenShot("TC_AHref_Update_01_init");
+ sleep(3000);
+ }
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ activity2 = getActivity();
+ Log.e(TAG, "activity2 = " + activity2.toString());
+
+ myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ ArrayList<View> inputListView11 = new ArrayList<View>();
+ sleep(3000);
+
+ inputListView11 = ViewUtil.getAllChildViews(myGroup);
+
+ String aherfText = "";
+ for(View view :inputListView11){
+ if(view instanceof WXTextView){
+ aherfText = ((WXTextView) view).getText().toString();
+ if(aherfText.contains("Change href")){
+ final FrameLayout aView = (FrameLayout)view.getParent();
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ aView.requestFocus();
+ aView.performClick();
+ Log.e(TAG, "TC_AHref_Update_02_changeHref clcik!");
+
+ }
+ });
+
+ sleep(2000);
+ Log.e(TAG, "TC_AHref_Update_02_changeHref snap!");
+ screenShot("TC_AHref_Update_02_changeHref");
+ sleep(2000);
+ }
+
+ else if(aherfText.contains("Change width and height")){
+ final FrameLayout aView = (FrameLayout)view.getParent();
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ aView.requestFocus();
+ aView.performClick();
+ Log.e(TAG, "TC_AHref_Update_03_changeWH clcik!");
+
+ }
+ });
+
+ sleep(2000);
+ Log.e(TAG, "TC_AHref_Update_03_changeWH snap!");
+ screenShot("TC_AHref_Update_03_changeWH");
+ sleep(2000);
+ }
+ }
+ }
+ }
+ else{
+ targetComponetNotFound = true;
+ }
+ }
+
+ }
+
+
+
+ /**
+ * get tc list by text
+ * @param byText
+ * @return
+ * @throws InterruptedException
+ */
+ public ArrayList<View> getTestCaseListViewByText(String byText) throws InterruptedException {
+ Log.e("TestScript_Guide", "byText ==" + byText);
+
+ if(TextUtils.isEmpty(byText)){
+ return null;
+ }
+ ArrayList<View> outViews = new ArrayList<View>();
+
+ mViewGroup.findViewsWithText(outViews, byText, View.FIND_VIEWS_WITH_TEXT);
+
+ for (View view : outViews){
+ String viewText = ((WXTextView)view).getText().toString();
+ Log.e(TAG, "viewText ==" + viewText);
+
+
+ }
+ return outViews;
+ }
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(String caseText){
+ if (mCaseListIndexView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<mCaseListIndexView.size();i++){
+
+ view = (WXTextView)mCaseListIndexView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ try {
+ ScreenShot.shoot(WXPageActivity.wxPageActivityInstance, shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setViewGroup(ViewGroup viewGroup){
+ mViewGroup = viewGroup;
+ }
+
+ /**
+ *
+ */
+ public void findTargetComponetIfNotFound(String target, InstrumentationTestCase test){
+ if(mCaseListIndexView.size() ==1 || targetComponetNotFound){
+ if(((WXTextView)mCaseListIndexView.get(0))
+ .getText()
+ .toString()
+ .equals("TC__Home")){
+ sleep(2000);
+
+ TouchUtils.dragQuarterScreenUp(test,WXPageActivity.wxPageActivityInstance );
+ mViewGroup = (ViewGroup) WXPageActivity.wxPageActivityInstance.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ }
+ sleep(2000);
+
+ TouchUtils.dragQuarterScreenUp(test, WXPageActivity.wxPageActivityInstance );
+ mViewGroup = (ViewGroup) WXPageActivity.wxPageActivityInstance.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ }
+ }
+
+ /**
+ *
+ */
+ public void setUpToFindComponet(String target, InstrumentationTestCase test){
+ int max = 60;
+ int count = 0;
+ while(mCaseListIndexView.size() == 0){
+
+ if (count < max){
+ TouchUtils.dragQuarterScreenUp(test, WXPageActivity.wxPageActivityInstance );
+ mViewGroup = (ViewGroup) WXPageActivity.wxPageActivityInstance.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ count ++;
+ }
+ else{
+ targetComponetNotFound = true;
+ }
+
+ }
+ }
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Animation/.gitignore b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Animation/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Animation/.gitignore
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AppendTree/.gitignore b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AppendTree/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_AppendTree/.gitignore
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_BizComponet/.gitignore b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_BizComponet/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_BizComponet/.gitignore
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_BizModule/.gitignore b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_BizModule/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_BizModule/.gitignore
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Color/WeexUiTestCaseTcColorType.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Color/WeexUiTestCaseTcColorType.java
new file mode 100644
index 0000000..aac93de
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Color/WeexUiTestCaseTcColorType.java
@@ -0,0 +1,237 @@
+/*
+ * 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.uitest.TC_Color;
+
+import android.app.Activity;
+import android.app.Application;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.util.ScreenShot;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.WeappJsBaseTestCase;
+import com.alibaba.weex.constants.Constants;
+import com.alibaba.weex.util.ViewUtil;
+import com.taobao.weex.ui.view.WXTextView;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Created by admin on 16/3/23.
+ */
+public class WeexUiTestCaseTcColorType extends ActivityInstrumentationTestCase2<WXPageActivity> {
+ public final String TAG = "TestScript_Guide==";
+ public WeappJsBaseTestCase weappApplication;
+ public WXPageActivity waTestPageActivity;
+ public WXPageActivity waTestPageActivity2;
+
+ public ViewGroup mViewGroup;
+ public Application mApplication;
+ public Instrumentation mInstrumentation;
+
+ public ArrayList<View> mCaseListIndexView = new ArrayList<View>();
+ public WeexUiTestCaseTcColorType() {
+ super(WXPageActivity.class);
+ }
+
+ public void setUp() throws Exception{
+
+ Log.e("TestScript_Guide", "setUp test!!");
+ setActivityInitialTouchMode(false);
+ weappApplication = new WeappJsBaseTestCase();
+ mInstrumentation = getInstrumentation();
+
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ waTestPageActivity = getActivity();
+// waTestPageActivity.getIntent().getData().toString();
+ Log.e(TAG,"activity1=" + waTestPageActivity.toString() );
+ Thread.sleep(3000);
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ setViewGroup(mViewGroup);
+
+ addAllTargetView("TC_");
+ sleep(1000);
+
+
+ }
+
+// public void testPreConditions()
+// {
+// assertNotNull(waTestPageActivity);
+// assertNotNull(mViewGroup);
+// assertNotNull(mCaseListIndexView);
+//
+// }
+
+ public void testColorType(){
+
+ for(final View caseView : mCaseListIndexView){
+ if (((WXTextView)caseView).getText().toString().equals("TC_Color")){
+ Log.e(TAG, "TC_Color find");
+
+ final WXTextView inputView = (WXTextView)caseView;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ Log.e(TAG, "TC_Color click!!");
+ }
+ });
+
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+ Log.e(TAG, "activity2 = " + activity2.toString());
+
+ ViewGroup myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ Log.e(TAG, myGroup.toString());
+
+ ArrayList<View> inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "TC_Color_Type");
+
+// myGroup.findViewsWithText(inputListView, "TC_Color_Type", View.FIND_VIEWS_WITH_TEXT);
+
+ Log.e(TAG, "TC_Color_Type size== " + inputListView.size());
+ sleep(2000);
+
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Color_Type clcik!");
+
+ }
+ });
+
+ sleep(3000);
+ Log.e(TAG, "TC_Color_Type snap!");
+ screenShot("TC_Color_Type");
+ }
+ }
+ }
+
+ }
+
+
+
+ /**
+ * get tc list by text
+ * @param byText
+ * @return
+ * @throws InterruptedException
+ */
+ public ArrayList<View> getTestCaseListViewByText(String byText) throws InterruptedException {
+ Log.e("TestScript_Guide", "byText ==" + byText);
+
+ if(TextUtils.isEmpty(byText)){
+ return null;
+ }
+ ArrayList<View> outViews = new ArrayList<View>();
+
+ mViewGroup.findViewsWithText(outViews, byText, View.FIND_VIEWS_WITH_TEXT);
+ sleep(2000);
+
+ for (View view : outViews){
+ String viewText = ((WXTextView)view).getText().toString();
+ Log.e(TAG, "viewText ==" + viewText);
+
+
+ }
+ return outViews;
+ }
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(String caseText){
+ if (mCaseListIndexView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<mCaseListIndexView.size();i++){
+
+ view = (WXTextView)mCaseListIndexView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ try {
+ ScreenShot.shoot(WXPageActivity.wxPageActivityInstance, shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ sleep(3000);
+
+ }
+
+ public void setViewGroup(ViewGroup viewGroup){
+ mViewGroup = viewGroup;
+ }
+
+ public void addAllTargetView(String target){
+ int max = 6;
+ int count =0 ;
+ while (count < max){
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ mCaseListIndexView.addAll(mCaseListIndexView);
+ count ++;
+ }
+ }
+
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Color/WeexUiTestCaseTcColorUpdate.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Color/WeexUiTestCaseTcColorUpdate.java
new file mode 100644
index 0000000..ea6d7af
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Color/WeexUiTestCaseTcColorUpdate.java
@@ -0,0 +1,258 @@
+/*
+ * 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.uitest.TC_Color;
+
+import android.app.Activity;
+import android.app.Application;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.util.ScreenShot;
+import com.alibaba.weex.util.ViewUtil;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.WeappJsBaseTestCase;
+import com.alibaba.weex.constants.Constants;
+import com.taobao.weex.ui.view.WXTextView;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by admin on 16/3/23.
+ */
+public class WeexUiTestCaseTcColorUpdate extends ActivityInstrumentationTestCase2<WXPageActivity> {
+ public final String TAG = "TestScript_Guide==";
+ public WeappJsBaseTestCase weappApplication;
+ public WXPageActivity waTestPageActivity;
+ public WXPageActivity waTestPageActivity2;
+
+ public ViewGroup mViewGroup;
+ public Application mApplication;
+ public Instrumentation mInstrumentation;
+
+ public ArrayList<View> mCaseListIndexView = new ArrayList<View>();
+ public WeexUiTestCaseTcColorUpdate() {
+ super(WXPageActivity.class);
+ }
+
+ public void setUp() throws Exception{
+
+ Log.e("TestScript_Guide", "setUp test!!");
+ setActivityInitialTouchMode(false);
+ mInstrumentation = getInstrumentation();
+
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ waTestPageActivity = getActivity();
+// waTestPageActivity.getIntent().getData().toString();
+ Log.e(TAG,"activity1=" + waTestPageActivity.toString() );
+ Thread.sleep(3000);
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ setViewGroup(mViewGroup);
+
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, "TC_");
+ Thread.sleep(3000);
+ addAllTargetView("TC_");
+ }
+
+// public void testPreConditions()
+// {
+// assertNotNull(waTestPageActivity);
+// assertNotNull(mViewGroup);
+// assertNotNull(mCaseListIndexView);
+//
+// }
+
+ public void testColorUpdateType(){
+
+ for(final View caseView : mCaseListIndexView){
+ if (((WXTextView)caseView).getText().toString().equals("TC_Color")){
+ Log.e(TAG, "TC_Color find");
+
+ final WXTextView inputView = (WXTextView)caseView;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ }
+ });
+
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+ Log.e(TAG, "activity2 = " + activity2.toString());
+
+ ViewGroup myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ Log.e(TAG, myGroup.toString());
+
+ ArrayList<View> inputListView = new ArrayList<View>();
+// myGroup.findViewsWithText(inputListView, "TC_Color_Update", View.FIND_VIEWS_WITH_TEXT);
+ inputListView = ViewUtil.findViewWithText(myGroup, "TC_Color_Update");
+
+ Log.e(TAG, "TC_Color_Update size== " + inputListView.size());
+ sleep(2000);
+
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Color_Type clcik!");
+ }
+ });
+
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ ViewUtil viewContor = new ViewUtil();
+
+ sleep(1000);
+ Log.e(TAG, "TC_Color_Update_01_beforeClick snap!");
+ screenShot("TC_Color_Update_01_beforeClick");
+
+ // 开始点击
+
+ ViewGroup vg = (ViewGroup)getActivity().findViewById(R.id.container);
+ List<View> vgChildView = viewContor.getAllChildViews(vg);
+ Log.e(TAG, vgChildView.size() + " vgChildView do performClick !");
+ for(final View child : vgChildView){
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ child.requestFocus();
+ child.performClick();
+ Log.e(TAG, child.getClass().toString() + " do performClick !");
+ }
+ });
+
+ sleep(1000);
+ }
+ Log.e(TAG, "TC_Color_Update_02_afterClick snap!");
+ screenShot("TC_Color_Update_02_afterClick");
+
+ }
+ }
+ }
+
+ }
+
+
+
+ /**
+ * get tc list by text
+ * @param byText
+ * @return
+ * @throws InterruptedException
+ */
+ public ArrayList<View> getTestCaseListViewByText(String byText) throws InterruptedException {
+ Log.e("TestScript_Guide", "byText ==" + byText);
+
+ if(TextUtils.isEmpty(byText)){
+ return null;
+ }
+ ArrayList<View> outViews = new ArrayList<View>();
+
+ mViewGroup.findViewsWithText(outViews, byText, View.FIND_VIEWS_WITH_TEXT);
+
+ for (View view : outViews){
+ String viewText = ((WXTextView)view).getText().toString();
+ Log.e(TAG, "viewText ==" + viewText);
+
+
+ }
+ return outViews;
+ }
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(String caseText){
+ if (mCaseListIndexView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<mCaseListIndexView.size();i++){
+
+ view = (WXTextView)mCaseListIndexView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ sleep(2000);
+ try {
+ ScreenShot.shoot(WXPageActivity.wxPageActivityInstance, shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ sleep(3000);
+ }
+
+ public void setViewGroup(ViewGroup viewGroup){
+ mViewGroup = viewGroup;
+ }
+
+ public void addAllTargetView(String target){
+ int max = 6;
+ int count =0 ;
+ while (count < max){
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ mCaseListIndexView.addAll(mCaseListIndexView);
+ count ++;
+ }
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_DataBind/.gitignore b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_DataBind/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_DataBind/.gitignore
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Downgrade/WeexUiTestCaseTcDowngradeAppVFalse.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Downgrade/WeexUiTestCaseTcDowngradeAppVFalse.java
new file mode 100644
index 0000000..8c60d34
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Downgrade/WeexUiTestCaseTcDowngradeAppVFalse.java
@@ -0,0 +1,219 @@
+/*
+ * 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.uitest.TC_Downgrade;
+
+import android.app.Activity;
+import android.app.Application;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.util.ScreenShot;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.WeappJsBaseTestCase;
+import com.alibaba.weex.constants.Constants;
+import com.alibaba.weex.util.ViewUtil;
+import com.taobao.weex.ui.component.WXText;
+import com.taobao.weex.ui.view.WXTextView;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Created by admin on 16/3/23.
+ */
+public class WeexUiTestCaseTcDowngradeAppVFalse extends ActivityInstrumentationTestCase2<WXPageActivity>{
+ public final String TAG = "TestScript_Guide==";
+ public WeappJsBaseTestCase weappApplication;
+ public WXPageActivity waTestPageActivity;
+
+ public ViewGroup mViewGroup;
+ public Application mApplication;
+ public Instrumentation mInstrumentation;
+
+ public ArrayList<View> mCaseListIndexView = new ArrayList<View>();
+ public WeexUiTestCaseTcDowngradeAppVFalse() {
+ super(WXPageActivity.class);
+ }
+
+ public void setUp() throws Exception{
+
+ Log.e("TestScript_Guide", "setUp into!!");
+ setActivityInitialTouchMode(false);
+ mInstrumentation = getInstrumentation();
+
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ waTestPageActivity = getActivity();
+// waTestPageActivity.getIntent().getData().toString();
+ Log.e(TAG,"activity1=" + waTestPageActivity.toString() );
+ sleep(3000);
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, "TC_");
+ addAllTargetView("TC_");
+
+ Thread.sleep(3000);
+
+ }
+
+ public void testDowngrade(){
+
+ for(final View caseView : mCaseListIndexView){
+ if (((WXTextView)caseView).getText().toString().equals("TC_Downgrade")){
+ Log.e(TAG, "TC_Downgrade find");
+
+ final WXTextView inputView = (WXTextView)caseView;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ }
+ });
+
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+ Log.e(TAG, "activity2 = " + activity2.toString());
+
+ ViewGroup myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ Log.e(TAG, myGroup.toString());
+
+ ArrayList<View> inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "TC_Downgrade_appV_False");
+
+ Log.e(TAG, "TC_Downgrade_appV_False== " + inputListView.size());
+ sleep(2000);
+
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Downgrade_appV_False clcik!");
+ }
+ });
+
+ sleep(3000);
+ screenShot("TC_Downgrade_appV_False");
+// ScreenShot.takeScreenShotIncludeDialog(getActivity(), "TC_Downgrade_appV_False");
+ Log.e(TAG, "TC_Downgrade_appV_False snap!");
+ }
+ }
+ }
+
+ }
+
+
+
+ /**
+ * get tc list by text
+ * @param byText
+ * @return
+ * @throws InterruptedException
+ */
+ public ArrayList<View> getTestCaseListViewByText(String byText) throws InterruptedException {
+ Log.e("TestScript_Guide", "byText ==" + byText);
+
+ if(TextUtils.isEmpty(byText)){
+ return null;
+ }
+ ArrayList<View> outViews = new ArrayList<View>();
+
+ mViewGroup.findViewsWithText(outViews, byText, View.FIND_VIEWS_WITH_TEXT);
+ for (View view : outViews){
+ String viewText = ((WXTextView)view).getText().toString();
+ Log.e(TAG, "viewText ==" + viewText);
+
+
+ }
+ return outViews;
+ }
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(String caseText){
+ if (mCaseListIndexView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<mCaseListIndexView.size();i++){
+
+ view = (WXTextView)mCaseListIndexView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ try {
+ ScreenShot.shoot(WXPageActivity.wxPageActivityInstance, shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setViewGroup(ViewGroup viewGroup){
+ mViewGroup = viewGroup;
+ }
+ public void addAllTargetView(String target){
+ int max = 6;
+ int count =0 ;
+ while (count < max){
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ mCaseListIndexView.addAll(mCaseListIndexView);
+ count ++;
+ }
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Downgrade/WeexUiTestCaseTcDowngradeAppVTrue.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Downgrade/WeexUiTestCaseTcDowngradeAppVTrue.java
new file mode 100644
index 0000000..07637a3
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Downgrade/WeexUiTestCaseTcDowngradeAppVTrue.java
@@ -0,0 +1,226 @@
+/*
+ * 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.uitest.TC_Downgrade;
+
+import android.app.Activity;
+import android.app.Application;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.util.ScreenShot;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.constants.Constants;
+import com.alibaba.weex.util.ViewUtil;
+import com.taobao.weex.ui.view.WXTextView;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Created by admin on 16/3/23.
+ */
+public class WeexUiTestCaseTcDowngradeAppVTrue extends ActivityInstrumentationTestCase2<WXPageActivity> {
+ public final String TAG = "TestScript_Guide==";
+ public WXPageActivity waTestPageActivity;
+
+ public ViewGroup mViewGroup;
+ public Application mApplication;
+ public Instrumentation mInstrumentation;
+
+ public ArrayList<View> mCaseListIndexView = new ArrayList<View>();
+ public WeexUiTestCaseTcDowngradeAppVTrue() {
+ super(WXPageActivity.class);
+ }
+
+ public void setUp() throws Exception{
+
+ Log.e("TestScript_Guide", "setUp into!!");
+ setActivityInitialTouchMode(false);
+ mInstrumentation = getInstrumentation();
+
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ waTestPageActivity = getActivity();
+// waTestPageActivity.getIntent().getData().toString();
+ Log.e(TAG,"activity1=" + waTestPageActivity.toString() );
+ sleep(3000);
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, "TC_");
+ addAllTargetView("TC_");
+
+ Thread.sleep(3000);
+
+ }
+
+// public void testPreConditions()
+// {
+// assertNotNull(waTestPageActivity);
+// assertNotNull(mViewGroup);
+// assertNotNull(mCaseListIndexView);
+//
+// }
+
+ public void testDowngrade(){
+
+ for(final View caseView : mCaseListIndexView){
+ if (((WXTextView)caseView).getText().toString().equals("TC_Downgrade")){
+ Log.e(TAG, "TC_Downgrade find");
+
+ final WXTextView inputView = (WXTextView)caseView;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ }
+ });
+
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+
+ ViewGroup myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ ArrayList<View> inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "TC_Downgrade_appV_True");
+
+// myGroup.findViewsWithText(inputListView, "TC_Downgrade_appV_True", View.FIND_VIEWS_WITH_TEXT);
+
+ Log.e(TAG, "TC_Downgrade_appV_True== " + inputListView.size());
+ sleep(2000);
+
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Downgrade_appV_True clcik!");
+
+ }
+ });
+
+ sleep(2000);
+ Log.e(TAG, "TC_Downgrade_appV_True snap!");
+// screenShot("TC_Downgrade_appV_True");
+ ScreenShot.takeScreenShotIncludeDialog(getActivity(), "TC_Downgrade_appV_True");
+
+ sleep(2000);
+
+ }
+ }
+ }
+
+ }
+
+
+
+ /**
+ * get tc list by text
+ * @param byText
+ * @return
+ * @throws InterruptedException
+ */
+ public ArrayList<View> getTestCaseListViewByText(String byText) throws InterruptedException {
+ Log.e("TestScript_Guide", "byText ==" + byText);
+
+ if(TextUtils.isEmpty(byText)){
+ return null;
+ }
+ ArrayList<View> outViews = new ArrayList<View>();
+
+ mViewGroup.findViewsWithText(outViews, byText, View.FIND_VIEWS_WITH_TEXT);
+ for (View view : outViews){
+ String viewText = ((WXTextView)view).getText().toString();
+ Log.e(TAG, "viewText ==" + viewText);
+
+
+ }
+ return outViews;
+ }
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(String caseText){
+ if (mCaseListIndexView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<mCaseListIndexView.size();i++){
+
+ view = (WXTextView)mCaseListIndexView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ try {
+ ScreenShot.shoot(WXPageActivity.wxPageActivityInstance, shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setViewGroup(ViewGroup viewGroup){
+ mViewGroup = viewGroup;
+ }
+ public void addAllTargetView(String target){
+ int max = 6;
+ int count =0 ;
+ while (count < max){
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ mCaseListIndexView.addAll(mCaseListIndexView);
+ count ++;
+ }
+ }
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Downgrade/WeexUiTestCaseTcDowngradeDevMFalse.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Downgrade/WeexUiTestCaseTcDowngradeDevMFalse.java
new file mode 100644
index 0000000..d5ca5f9
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Downgrade/WeexUiTestCaseTcDowngradeDevMFalse.java
@@ -0,0 +1,226 @@
+/*
+ * 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.uitest.TC_Downgrade;
+
+import android.app.Activity;
+import android.app.Application;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.util.ScreenShot;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.constants.Constants;
+import com.alibaba.weex.util.ViewUtil;
+import com.taobao.weex.ui.view.WXTextView;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Created by admin on 16/3/23.
+ */
+public class WeexUiTestCaseTcDowngradeDevMFalse extends ActivityInstrumentationTestCase2<WXPageActivity> {
+ public final String TAG = "TestScript_Guide==";
+ public WXPageActivity waTestPageActivity;
+
+ public ViewGroup mViewGroup;
+ public Application mApplication;
+ public Instrumentation mInstrumentation;
+
+ public ArrayList<View> mCaseListIndexView = new ArrayList<View>();
+ public WeexUiTestCaseTcDowngradeDevMFalse() {
+ super(WXPageActivity.class);
+ }
+
+ public void setUp() throws Exception{
+
+ Log.e("TestScript_Guide", "setUp into!!");
+ setActivityInitialTouchMode(false);
+ mInstrumentation = getInstrumentation();
+
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ waTestPageActivity = getActivity();
+// waTestPageActivity.getIntent().getData().toString();
+ Log.e(TAG,"activity1=" + waTestPageActivity.toString() );
+ sleep(3000);
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, "TC_");
+ addAllTargetView("TC_");
+
+ Thread.sleep(3000);
+
+ }
+
+// public void testPreConditions()
+// {
+// assertNotNull(waTestPageActivity);
+// assertNotNull(mViewGroup);
+// assertNotNull(mCaseListIndexView);
+//
+// }
+
+ public void testDowngrade(){
+
+ for(final View caseView : mCaseListIndexView){
+ if (((WXTextView)caseView).getText().toString().equals("TC_Downgrade")){
+ Log.e(TAG, "TC_Downgrade find");
+
+ final WXTextView inputView = (WXTextView)caseView;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ }
+ });
+
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+
+ ViewGroup myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ ArrayList<View> inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "TC_Downgrade_devM_False");
+
+// myGroup.findViewsWithText(inputListView, "TC_Downgrade_devM_False", View.FIND_VIEWS_WITH_TEXT);
+
+ Log.e(TAG, "TC_Downgrade_devM_False== " + inputListView.size());
+ sleep(2000);
+
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Downgrade_devM_False clcik!");
+
+ }
+ });
+
+ sleep(2000);
+ Log.e(TAG, "TC_Downgrade_devM_False snap!");
+ screenShot("TC_Downgrade_devM_False");
+// ScreenShot.takeScreenShotIncludeDialog(getActivity(), "TC_Downgrade_devM_False");
+
+ sleep(2000);
+
+ }
+ }
+ }
+
+ }
+
+
+
+ /**
+ * get tc list by text
+ * @param byText
+ * @return
+ * @throws InterruptedException
+ */
+ public ArrayList<View> getTestCaseListViewByText(String byText) throws InterruptedException {
+ Log.e("TestScript_Guide", "byText ==" + byText);
+
+ if(TextUtils.isEmpty(byText)){
+ return null;
+ }
+ ArrayList<View> outViews = new ArrayList<View>();
+
+ mViewGroup.findViewsWithText(outViews, byText, View.FIND_VIEWS_WITH_TEXT);
+ for (View view : outViews){
+ String viewText = ((WXTextView)view).getText().toString();
+ Log.e(TAG, "viewText ==" + viewText);
+
+
+ }
+ return outViews;
+ }
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(String caseText){
+ if (mCaseListIndexView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<mCaseListIndexView.size();i++){
+
+ view = (WXTextView)mCaseListIndexView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ try {
+ ScreenShot.shoot(WXPageActivity.wxPageActivityInstance, shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setViewGroup(ViewGroup viewGroup){
+ mViewGroup = viewGroup;
+ }
+ public void addAllTargetView(String target){
+ int max = 6;
+ int count =0 ;
+ while (count < max){
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ mCaseListIndexView.addAll(mCaseListIndexView);
+ count ++;
+ }
+ }
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Downgrade/WeexUiTestCaseTcDowngradeDevMTrue.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Downgrade/WeexUiTestCaseTcDowngradeDevMTrue.java
new file mode 100644
index 0000000..0ad3f6b
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Downgrade/WeexUiTestCaseTcDowngradeDevMTrue.java
@@ -0,0 +1,225 @@
+/*
+ * 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.uitest.TC_Downgrade;
+
+import android.app.Activity;
+import android.app.Application;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.util.ScreenShot;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.constants.Constants;
+import com.alibaba.weex.util.ViewUtil;
+import com.taobao.weex.ui.view.WXTextView;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Created by admin on 16/3/23.
+ */
+public class WeexUiTestCaseTcDowngradeDevMTrue extends ActivityInstrumentationTestCase2<WXPageActivity> {
+ public final String TAG = "TestScript_Guide==";
+ public WXPageActivity waTestPageActivity;
+
+ public ViewGroup mViewGroup;
+ public Application mApplication;
+ public Instrumentation mInstrumentation;
+
+ public ArrayList<View> mCaseListIndexView = new ArrayList<View>();
+ public WeexUiTestCaseTcDowngradeDevMTrue() {
+ super(WXPageActivity.class);
+ }
+
+ public void setUp() throws Exception{
+
+ Log.e("TestScript_Guide", "setUp into!!");
+ setActivityInitialTouchMode(false);
+ mInstrumentation = getInstrumentation();
+
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ waTestPageActivity = getActivity();
+// waTestPageActivity.getIntent().getData().toString();
+ Log.e(TAG,"activity1=" + waTestPageActivity.toString() );
+ sleep(3000);
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, "TC_");
+ addAllTargetView("TC_");
+
+ Thread.sleep(3000);
+
+ }
+
+// public void testPreConditions()
+// {
+// assertNotNull(waTestPageActivity);
+// assertNotNull(mViewGroup);
+// assertNotNull(mCaseListIndexView);
+//
+// }
+
+ public void testDowngrade(){
+
+ for(final View caseView : mCaseListIndexView){
+ if (((WXTextView)caseView).getText().toString().equals("TC_Downgrade")){
+ Log.e(TAG, "TC_Downgrade find");
+
+ final WXTextView inputView = (WXTextView)caseView;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ }
+ });
+
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+
+ ViewGroup myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ ArrayList<View> inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "TC_Downgrade_devM_True");
+// myGroup.findViewsWithText(inputListView, "TC_Downgrade_devM_True", View.FIND_VIEWS_WITH_TEXT);
+
+ Log.e(TAG, "TC_Downgrade_devM_True== " + inputListView.size());
+ sleep(2000);
+
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Downgrade_devM_True clcik!");
+
+ }
+ });
+
+ sleep(2000);
+ Log.e(TAG, "TC_Downgrade_devM_True snap!");
+// screenShot("TC_Downgrade_appV_True");
+ ScreenShot.takeScreenShotIncludeDialog(getActivity(), "TC_Downgrade_devM_True");
+
+ sleep(2000);
+
+ }
+ }
+ }
+
+ }
+
+
+
+ /**
+ * get tc list by text
+ * @param byText
+ * @return
+ * @throws InterruptedException
+ */
+ public ArrayList<View> getTestCaseListViewByText(String byText) throws InterruptedException {
+ Log.e("TestScript_Guide", "byText ==" + byText);
+
+ if(TextUtils.isEmpty(byText)){
+ return null;
+ }
+ ArrayList<View> outViews = new ArrayList<View>();
+
+ mViewGroup.findViewsWithText(outViews, byText, View.FIND_VIEWS_WITH_TEXT);
+ for (View view : outViews){
+ String viewText = ((WXTextView)view).getText().toString();
+ Log.e(TAG, "viewText ==" + viewText);
+
+
+ }
+ return outViews;
+ }
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(String caseText){
+ if (mCaseListIndexView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<mCaseListIndexView.size();i++){
+
+ view = (WXTextView)mCaseListIndexView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ try {
+ ScreenShot.shoot(WXPageActivity.wxPageActivityInstance, shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setViewGroup(ViewGroup viewGroup){
+ mViewGroup = viewGroup;
+ }
+ public void addAllTargetView(String target){
+ int max = 6;
+ int count =0 ;
+ while (count < max){
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ mCaseListIndexView.addAll(mCaseListIndexView);
+ count ++;
+ }
+ }
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Downgrade/WeexUiTestCaseTcDowngradeOSVFalse.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Downgrade/WeexUiTestCaseTcDowngradeOSVFalse.java
new file mode 100644
index 0000000..4494bcb
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Downgrade/WeexUiTestCaseTcDowngradeOSVFalse.java
@@ -0,0 +1,225 @@
+/*
+ * 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.uitest.TC_Downgrade;
+
+import android.app.Activity;
+import android.app.Application;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.util.ScreenShot;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.constants.Constants;
+import com.alibaba.weex.util.ViewUtil;
+import com.taobao.weex.ui.view.WXTextView;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Created by admin on 16/3/23.
+ */
+public class WeexUiTestCaseTcDowngradeOSVFalse extends ActivityInstrumentationTestCase2<WXPageActivity> {
+ public final String TAG = "TestScript_Guide==";
+ public WXPageActivity waTestPageActivity;
+
+ public ViewGroup mViewGroup;
+ public Application mApplication;
+ public Instrumentation mInstrumentation;
+
+ public ArrayList<View> mCaseListIndexView = new ArrayList<View>();
+ public WeexUiTestCaseTcDowngradeOSVFalse() {
+ super(WXPageActivity.class);
+ }
+
+ public void setUp() throws Exception{
+
+ Log.e("TestScript_Guide", "setUp into!!");
+ setActivityInitialTouchMode(false);
+ mInstrumentation = getInstrumentation();
+
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ waTestPageActivity = getActivity();
+// waTestPageActivity.getIntent().getData().toString();
+ Log.e(TAG,"activity1=" + waTestPageActivity.toString() );
+ sleep(3000);
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, "TC_");
+ addAllTargetView("TC_");
+
+ Thread.sleep(3000);
+
+ }
+
+// public void testPreConditions()
+// {
+// assertNotNull(waTestPageActivity);
+// assertNotNull(mViewGroup);
+// assertNotNull(mCaseListIndexView);
+//
+// }
+
+ public void testDowngrade(){
+
+ for(final View caseView : mCaseListIndexView){
+ if (((WXTextView)caseView).getText().toString().equals("TC_Downgrade")){
+ Log.e(TAG, "TC_Downgrade find");
+
+ final WXTextView inputView = (WXTextView)caseView;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ }
+ });
+
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+
+ ViewGroup myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ ArrayList<View> inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "TC_Downgrade_osV_False");
+// myGroup.findViewsWithText(inputListView, "TC_Downgrade_osV_False", View.FIND_VIEWS_WITH_TEXT);
+
+ Log.e(TAG, "TC_Downgrade_osV_False== " + inputListView.size());
+ sleep(2000);
+
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Downgrade_osV_False clcik!");
+
+ }
+ });
+
+ sleep(2000);
+ Log.e(TAG, "TC_Downgrade_osV_False snap!");
+ screenShot("TC_Downgrade_osV_False");
+// ScreenShot.takeScreenShotIncludeDialog(getActivity(), "TC_Downgrade_osV_False");
+
+ sleep(2000);
+
+ }
+ }
+ }
+
+ }
+
+
+
+ /**
+ * get tc list by text
+ * @param byText
+ * @return
+ * @throws InterruptedException
+ */
+ public ArrayList<View> getTestCaseListViewByText(String byText) throws InterruptedException {
+ Log.e("TestScript_Guide", "byText ==" + byText);
+
+ if(TextUtils.isEmpty(byText)){
+ return null;
+ }
+ ArrayList<View> outViews = new ArrayList<View>();
+
+ mViewGroup.findViewsWithText(outViews, byText, View.FIND_VIEWS_WITH_TEXT);
+ for (View view : outViews){
+ String viewText = ((WXTextView)view).getText().toString();
+ Log.e(TAG, "viewText ==" + viewText);
+
+
+ }
+ return outViews;
+ }
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(String caseText){
+ if (mCaseListIndexView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<mCaseListIndexView.size();i++){
+
+ view = (WXTextView)mCaseListIndexView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ try {
+ ScreenShot.shoot(WXPageActivity.wxPageActivityInstance, shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setViewGroup(ViewGroup viewGroup){
+ mViewGroup = viewGroup;
+ }
+ public void addAllTargetView(String target){
+ int max = 6;
+ int count =0 ;
+ while (count < max){
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ mCaseListIndexView.addAll(mCaseListIndexView);
+ count ++;
+ }
+ }
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Downgrade/WeexUiTestCaseTcDowngradeOSVTrue.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Downgrade/WeexUiTestCaseTcDowngradeOSVTrue.java
new file mode 100644
index 0000000..7aabbd5
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Downgrade/WeexUiTestCaseTcDowngradeOSVTrue.java
@@ -0,0 +1,226 @@
+/*
+ * 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.uitest.TC_Downgrade;
+
+import android.app.Activity;
+import android.app.Application;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.util.ScreenShot;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.constants.Constants;
+import com.alibaba.weex.util.ViewUtil;
+import com.taobao.weex.ui.view.WXTextView;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Created by admin on 16/3/23.
+ */
+public class WeexUiTestCaseTcDowngradeOSVTrue extends ActivityInstrumentationTestCase2<WXPageActivity> {
+ public final String TAG = "TestScript_Guide==";
+ public WXPageActivity waTestPageActivity;
+
+ public ViewGroup mViewGroup;
+ public Application mApplication;
+ public Instrumentation mInstrumentation;
+
+ public ArrayList<View> mCaseListIndexView = new ArrayList<View>();
+ public WeexUiTestCaseTcDowngradeOSVTrue() {
+ super(WXPageActivity.class);
+ }
+
+ public void setUp() throws Exception{
+
+ Log.e("TestScript_Guide", "setUp into!!");
+ setActivityInitialTouchMode(false);
+ mInstrumentation = getInstrumentation();
+
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ waTestPageActivity = getActivity();
+// waTestPageActivity.getIntent().getData().toString();
+ Log.e(TAG,"activity1=" + waTestPageActivity.toString() );
+ sleep(3000);
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, "TC_");
+ addAllTargetView("TC_");
+
+ Thread.sleep(3000);
+
+ }
+
+// public void testPreConditions()
+// {
+// assertNotNull(waTestPageActivity);
+// assertNotNull(mViewGroup);
+// assertNotNull(mCaseListIndexView);
+//
+// }
+
+ public void testDowngrade(){
+
+ for(final View caseView : mCaseListIndexView){
+ if (((WXTextView)caseView).getText().toString().equals("TC_Downgrade")){
+ Log.e(TAG, "TC_Downgrade find");
+
+ final WXTextView inputView = (WXTextView)caseView;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ }
+ });
+
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+
+ ViewGroup myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ ArrayList<View> inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "TC_Downgrade_osV_True");
+
+// myGroup.findViewsWithText(inputListView, "TC_Downgrade_osV_True", View.FIND_VIEWS_WITH_TEXT);
+
+ Log.e(TAG, "TC_Downgrade_osV_True== " + inputListView.size());
+ sleep(2000);
+
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Downgrade_osV_True clcik!");
+
+ }
+ });
+
+ sleep(2000);
+ Log.e(TAG, "TC_Downgrade_osV_True snap!");
+// screenShot("TC_Downgrade_appV_True");
+ ScreenShot.takeScreenShotIncludeDialog(getActivity(), "TC_Downgrade_osV_True");
+
+ sleep(2000);
+
+ }
+ }
+ }
+
+ }
+
+
+
+ /**
+ * get tc list by text
+ * @param byText
+ * @return
+ * @throws InterruptedException
+ */
+ public ArrayList<View> getTestCaseListViewByText(String byText) throws InterruptedException {
+ Log.e("TestScript_Guide", "byText ==" + byText);
+
+ if(TextUtils.isEmpty(byText)){
+ return null;
+ }
+ ArrayList<View> outViews = new ArrayList<View>();
+
+ mViewGroup.findViewsWithText(outViews, byText, View.FIND_VIEWS_WITH_TEXT);
+ for (View view : outViews){
+ String viewText = ((WXTextView)view).getText().toString();
+ Log.e(TAG, "viewText ==" + viewText);
+
+
+ }
+ return outViews;
+ }
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(String caseText){
+ if (mCaseListIndexView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<mCaseListIndexView.size();i++){
+
+ view = (WXTextView)mCaseListIndexView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ try {
+ ScreenShot.shoot(WXPageActivity.wxPageActivityInstance, shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setViewGroup(ViewGroup viewGroup){
+ mViewGroup = viewGroup;
+ }
+ public void addAllTargetView(String target){
+ int max = 6;
+ int count =0 ;
+ while (count < max){
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ mCaseListIndexView.addAll(mCaseListIndexView);
+ count ++;
+ }
+ }
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Downgrade/WeexUiTestCaseTcDowngradeWeexVFalse.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Downgrade/WeexUiTestCaseTcDowngradeWeexVFalse.java
new file mode 100644
index 0000000..a8d5147
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Downgrade/WeexUiTestCaseTcDowngradeWeexVFalse.java
@@ -0,0 +1,225 @@
+/*
+ * 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.uitest.TC_Downgrade;
+
+import android.app.Activity;
+import android.app.Application;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.util.ScreenShot;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.constants.Constants;
+import com.alibaba.weex.util.ViewUtil;
+import com.taobao.weex.ui.view.WXTextView;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Created by admin on 16/3/23.
+ */
+public class WeexUiTestCaseTcDowngradeWeexVFalse extends ActivityInstrumentationTestCase2<WXPageActivity> {
+ public final String TAG = "TestScript_Guide==";
+ public WXPageActivity waTestPageActivity;
+
+ public ViewGroup mViewGroup;
+ public Application mApplication;
+ public Instrumentation mInstrumentation;
+
+ public ArrayList<View> mCaseListIndexView = new ArrayList<View>();
+ public WeexUiTestCaseTcDowngradeWeexVFalse() {
+ super(WXPageActivity.class);
+ }
+
+ public void setUp() throws Exception{
+
+ Log.e("TestScript_Guide", "setUp into!!");
+ setActivityInitialTouchMode(false);
+ mInstrumentation = getInstrumentation();
+
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ waTestPageActivity = getActivity();
+// waTestPageActivity.getIntent().getData().toString();
+ Log.e(TAG,"activity1=" + waTestPageActivity.toString() );
+ sleep(3000);
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, "TC_");
+ addAllTargetView("TC_");
+
+ Thread.sleep(3000);
+
+ }
+
+// public void testPreConditions()
+// {
+// assertNotNull(waTestPageActivity);
+// assertNotNull(mViewGroup);
+// assertNotNull(mCaseListIndexView);
+//
+// }
+
+ public void testDowngrade(){
+
+ for(final View caseView : mCaseListIndexView){
+ if (((WXTextView)caseView).getText().toString().equals("TC_Downgrade")){
+ Log.e(TAG, "TC_Downgrade find");
+
+ final WXTextView inputView = (WXTextView)caseView;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ }
+ });
+
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+
+ ViewGroup myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ ArrayList<View> inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "TC_Downgrade_weexV_False");
+// myGroup.findViewsWithText(inputListView, "TC_Downgrade_weexV_False", View.FIND_VIEWS_WITH_TEXT);
+
+ Log.e(TAG, "TC_Downgrade_weexV_False== " + inputListView.size());
+ sleep(2000);
+
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Downgrade_weexV_False clcik!");
+
+ }
+ });
+
+ sleep(2000);
+ Log.e(TAG, "TC_Downgrade_weexV_False snap!");
+ screenShot("TC_Downgrade_weexV_False");
+// ScreenShot.takeScreenShotIncludeDialog(getActivity(), "TC_Downgrade_weexV_False");
+
+ sleep(2000);
+
+ }
+ }
+ }
+
+ }
+
+
+
+ /**
+ * get tc list by text
+ * @param byText
+ * @return
+ * @throws InterruptedException
+ */
+ public ArrayList<View> getTestCaseListViewByText(String byText) throws InterruptedException {
+ Log.e("TestScript_Guide", "byText ==" + byText);
+
+ if(TextUtils.isEmpty(byText)){
+ return null;
+ }
+ ArrayList<View> outViews = new ArrayList<View>();
+
+ mViewGroup.findViewsWithText(outViews, byText, View.FIND_VIEWS_WITH_TEXT);
+ for (View view : outViews){
+ String viewText = ((WXTextView)view).getText().toString();
+ Log.e(TAG, "viewText ==" + viewText);
+
+
+ }
+ return outViews;
+ }
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(String caseText){
+ if (mCaseListIndexView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<mCaseListIndexView.size();i++){
+
+ view = (WXTextView)mCaseListIndexView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ try {
+ ScreenShot.shoot(WXPageActivity.wxPageActivityInstance, shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setViewGroup(ViewGroup viewGroup){
+ mViewGroup = viewGroup;
+ }
+ public void addAllTargetView(String target){
+ int max = 6;
+ int count =0 ;
+ while (count < max){
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ mCaseListIndexView.addAll(mCaseListIndexView);
+ count ++;
+ }
+ }
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Downgrade/WeexUiTestCaseTcDowngradeWeexVTrue.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Downgrade/WeexUiTestCaseTcDowngradeWeexVTrue.java
new file mode 100644
index 0000000..9aecc9a
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Downgrade/WeexUiTestCaseTcDowngradeWeexVTrue.java
@@ -0,0 +1,224 @@
+/*
+ * 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.uitest.TC_Downgrade;
+
+import android.app.Activity;
+import android.app.Application;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.util.ScreenShot;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.constants.Constants;
+import com.alibaba.weex.util.ViewUtil;
+import com.taobao.weex.ui.view.WXTextView;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Created by admin on 16/3/23.
+ */
+public class WeexUiTestCaseTcDowngradeWeexVTrue extends ActivityInstrumentationTestCase2<WXPageActivity> {
+ public final String TAG = "TestScript_Guide==";
+ public WXPageActivity waTestPageActivity;
+
+ public ViewGroup mViewGroup;
+ public Application mApplication;
+ public Instrumentation mInstrumentation;
+
+ public ArrayList<View> mCaseListIndexView = new ArrayList<View>();
+ public WeexUiTestCaseTcDowngradeWeexVTrue() {
+ super(WXPageActivity.class);
+ }
+
+ public void setUp() throws Exception{
+
+ Log.e("TestScript_Guide", "setUp into!!");
+ setActivityInitialTouchMode(false);
+ mInstrumentation = getInstrumentation();
+
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ waTestPageActivity = getActivity();
+// waTestPageActivity.getIntent().getData().toString();
+ Log.e(TAG,"activity1=" + waTestPageActivity.toString() );
+ sleep(3000);
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, "TC_");
+ addAllTargetView("TC_");
+
+ Thread.sleep(3000);
+
+ }
+
+// public void testPreConditions()
+// {
+// assertNotNull(waTestPageActivity);
+// assertNotNull(mViewGroup);
+// assertNotNull(mCaseListIndexView);
+//
+// }
+
+ public void testDowngrade(){
+
+ for(final View caseView : mCaseListIndexView){
+ if (((WXTextView)caseView).getText().toString().equals("TC_Downgrade")){
+ Log.e(TAG, "TC_Downgrade find");
+
+ final WXTextView inputView = (WXTextView)caseView;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ }
+ });
+
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+
+ ViewGroup myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ ArrayList<View> inputListView = new ArrayList<View>();
+// myGroup.findViewsWithText(inputListView, "TC_Downgrade_weexV_True", View.FIND_VIEWS_WITH_TEXT);
+ inputListView = ViewUtil.findViewWithText(myGroup, "TC_Downgrade_weexV_True");
+ Log.e(TAG, "TC_Downgrade_weexV_True== " + inputListView.size());
+ sleep(2000);
+
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Downgrade_weexV_True clcik!");
+
+ }
+ });
+
+ sleep(2000);
+ Log.e(TAG, "TC_Downgrade_weexV_True snap!");
+// screenShot("TC_Downgrade_appV_True");
+ ScreenShot.takeScreenShotIncludeDialog(getActivity(), "TC_Downgrade_weexV_True");
+
+ sleep(2000);
+
+ }
+ }
+ }
+
+ }
+
+
+
+ /**
+ * get tc list by text
+ * @param byText
+ * @return
+ * @throws InterruptedException
+ */
+ public ArrayList<View> getTestCaseListViewByText(String byText) throws InterruptedException {
+ Log.e("TestScript_Guide", "byText ==" + byText);
+
+ if(TextUtils.isEmpty(byText)){
+ return null;
+ }
+ ArrayList<View> outViews = new ArrayList<View>();
+
+ mViewGroup.findViewsWithText(outViews, byText, View.FIND_VIEWS_WITH_TEXT);
+ for (View view : outViews){
+ String viewText = ((WXTextView)view).getText().toString();
+ Log.e(TAG, "viewText ==" + viewText);
+
+
+ }
+ return outViews;
+ }
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(String caseText){
+ if (mCaseListIndexView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<mCaseListIndexView.size();i++){
+
+ view = (WXTextView)mCaseListIndexView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ try {
+ ScreenShot.shoot(WXPageActivity.wxPageActivityInstance, shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setViewGroup(ViewGroup viewGroup){
+ mViewGroup = viewGroup;
+ }
+ public void addAllTargetView(String target){
+ int max = 6;
+ int count =0 ;
+ while (count < max){
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ mCaseListIndexView.addAll(mCaseListIndexView);
+ count ++;
+ }
+ }
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Gesture/.gitignore b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Gesture/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Gesture/.gitignore
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Image/WeexUiTestCaseTcImageUpdate.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Image/WeexUiTestCaseTcImageUpdate.java
new file mode 100644
index 0000000..0e06e36
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Image/WeexUiTestCaseTcImageUpdate.java
@@ -0,0 +1,572 @@
+/*
+ * 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.uitest.TC_Image;
+
+import android.app.Activity;
+import android.app.Application;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.WeappJsBaseTestCase;
+import com.alibaba.weex.util.ScreenShot;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.constants.Constants;
+import com.alibaba.weex.util.ViewUtil;
+import com.taobao.weex.ui.view.WXTextView;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Created by admin on 16/3/23.
+ */
+public class WeexUiTestCaseTcImageUpdate extends ActivityInstrumentationTestCase2<WXPageActivity> {
+ public final String TAG = "TestScript_Guide==";
+ public WXPageActivity waTestPageActivity;
+ public WeappJsBaseTestCase weappApplication;
+
+
+ public ViewGroup mViewGroup;
+ public Application mApplication;
+ public Instrumentation mInstrumentation;
+
+ public ArrayList<View> mCaseListIndexView = new ArrayList<View>();
+ public WeexUiTestCaseTcImageUpdate() {
+ super(WXPageActivity.class);
+ }
+
+ public void setUp() throws Exception{
+
+ Log.e("TestScript_Guide", "setUp into!!");
+ setActivityInitialTouchMode(false);
+ weappApplication = new WeappJsBaseTestCase();
+ mInstrumentation = getInstrumentation();
+
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ waTestPageActivity = getActivity();
+// waTestPageActivity.getIntent().getData().toString();
+ Log.e(TAG,"activity1=" + waTestPageActivity.toString() );
+ sleep(3000);
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ setViewGroup(mViewGroup);
+
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, "TC_");
+ addAllTargetView("TC_");
+
+ Thread.sleep(3000);
+
+ }
+
+// public void testPreConditions()
+// {
+// assertNotNull(waTestPageActivity);
+// assertNotNull(mViewGroup);
+// assertNotNull(mCaseListIndexView);
+//
+// }
+
+ public void testImageUpdate(){
+
+ for(final View caseView : mCaseListIndexView){
+ if (((WXTextView)caseView).getText().toString().equals("TC_Image")){
+ Log.e(TAG, "TC_Image find");
+
+ final WXTextView inputView = (WXTextView)caseView;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ }
+ });
+
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+
+ ViewGroup myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ ArrayList<View> inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "TC_Image_Update");
+// myGroup.findViewsWithText(inputListView, "TC_Image_Update", View.FIND_VIEWS_WITH_TEXT);
+ sleep(3000);
+ Log.e(TAG, "TC_Image_Update== " + inputListView.size());
+
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+ Log.e(TAG, "inputTypeView text == " +inputTypeView.getText().toString());
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Image_Update clcik!");
+
+ }
+ });
+
+ sleep(2000);
+ Log.e(TAG, "TC_Image_Update_01_init snap!");
+ screenShot("TC_Image_Update_01_init");
+// ScreenShot.takeScreenShotIncludeDialog(getActivity(), "TC_Downgrade_osV_False");
+ sleep(2000);
+ }
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ activity2 = getActivity();
+
+ myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "error src");
+// myGroup.findViewsWithText(inputListView, "点击我,图片无法显示", View.FIND_VIEWS_WITH_TEXT);
+ sleep(2000);
+
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+ Log.e(TAG, "inputTypeView text == " +inputTypeView.getText().toString());
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Image_Update_02_errorSrc clcik!");
+
+ }
+ });
+
+ sleep(2000);
+ Log.e(TAG, "TC_Image_Update_02_errorSrc snap!");
+ screenShot("TC_Image_Update_02_errorSrc");
+// ScreenShot.takeScreenShotIncludeDialog(getActivity(), "TC_Downgrade_osV_False");
+
+ sleep(2000);
+
+ }
+
+ inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "change src");
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+ Log.e(TAG, "inputTypeView text == " +inputTypeView.getText().toString());
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Image_Update_03_changeSrc clcik!");
+
+ }
+ });
+
+ sleep(2000);
+ Log.e(TAG, "TC_Image_Update_03_changeSrc snap!");
+ screenShot("TC_Image_Update_03_changeSrc");
+// ScreenShot.takeScreenShotIncludeDialog(getActivity(), "TC_Downgrade_osV_False");
+
+ sleep(2000);
+
+ }
+
+ inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "origin src");
+// myGroup.findViewsWithText(inputListView, "点击我,图片正常显示", View.FIND_VIEWS_WITH_TEXT);
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Image_Update_04_normalSrc clcik!");
+
+ }
+ });
+
+ sleep(2000);
+ Log.e(TAG, "TC_Image_Update_04_normalSrc snap!");
+ screenShot("TC_Image_Update_04_normalSrc");
+// ScreenShot.takeScreenShotIncludeDialog(getActivity(), "TC_Downgrade_osV_False");
+
+ sleep(2000);
+
+ }
+
+ inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "pic opacity");
+
+// myGroup.findViewsWithText(inputListView, "点击我,图片设置不透明", View.FIND_VIEWS_WITH_TEXT);
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Image_Update_05_notTransparent clcik!");
+
+ }
+ });
+
+ sleep(2000);
+ Log.e(TAG, "TC_Image_Update_05_notTransparent snap!");
+ screenShot("TC_Image_Update_05_notTransparent");
+// ScreenShot.takeScreenShotIncludeDialog(getActivity(), "TC_Downgrade_osV_False");
+
+ sleep(2000);
+
+ }
+
+ inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "pic transparency");
+
+// myGroup.findViewsWithText(inputListView, "点击我,图片设置透明", View.FIND_VIEWS_WITH_TEXT);
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Image_Update_06_transparent clcik!");
+
+ }
+ });
+
+ sleep(2000);
+ Log.e(TAG, "TC_Image_Update_06_transparent snap!");
+ screenShot("TC_Image_Update_06_transparent");
+// ScreenShot.takeScreenShotIncludeDialog(getActivity(), "TC_Downgrade_osV_False");
+
+ sleep(2000);
+
+ }
+
+ inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "width large");
+
+// myGroup.findViewsWithText(inputListView, "点击我,图片宽度变大", View.FIND_VIEWS_WITH_TEXT);
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Image_Update_07_largeWidth clcik!");
+
+ }
+ });
+
+ sleep(2000);
+ Log.e(TAG, "TC_Image_Update_07_largeWidth snap!");
+ screenShot("TC_Image_Update_07_largeWidth");
+// ScreenShot.takeScreenShotIncludeDialog(getActivity(), "TC_Downgrade_osV_False");
+
+ sleep(2000);
+
+ }
+
+ inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "width less");
+
+// myGroup.findViewsWithText(inputListView, "点击我,图片宽度变小", View.FIND_VIEWS_WITH_TEXT);
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Image_Update_08_smallWidth clcik!");
+
+ }
+ });
+
+ sleep(2000);
+ Log.e(TAG, "TC_Image_Update_08_smallWidth snap!");
+ screenShot("TC_Image_Update_08_smallWidth");
+// ScreenShot.takeScreenShotIncludeDialog(getActivity(), "TC_Downgrade_osV_False");
+
+ sleep(2000);
+
+ }
+
+ inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "height large");
+
+// myGroup.findViewsWithText(inputListView, "点击我,图片高度变大", View.FIND_VIEWS_WITH_TEXT);
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Image_Update_09_largeHeight clcik!");
+
+ }
+ });
+
+ sleep(2000);
+ Log.e(TAG, "TC_Image_Update_09_largeHeight snap!");
+ screenShot("TC_Image_Update_09_largeHeight");
+// ScreenShot.takeScreenShotIncludeDialog(getActivity(), "TC_Downgrade_osV_False");
+
+ sleep(2000);
+
+ }
+
+ inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "height less");
+
+// myGroup.findViewsWithText(inputListView, "点击我,图片高度变小", View.FIND_VIEWS_WITH_TEXT);
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Image_Update_10_smallHeight clcik!");
+
+ }
+ });
+
+ sleep(2000);
+ Log.e(TAG, "TC_Image_Update_10_smallHeight snap!");
+ screenShot("TC_Image_Update_10_smallHeight");
+// ScreenShot.takeScreenShotIncludeDialog(getActivity(), "TC_Downgrade_osV_False");
+
+ sleep(2000);
+
+ }
+
+ inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "scale large");
+
+// myGroup.findViewsWithText(inputListView, "点击我,图片等比例放大", View.FIND_VIEWS_WITH_TEXT);
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Image_Update_11_largeScale clcik!");
+
+ }
+ });
+
+ sleep(2000);
+ Log.e(TAG, "TC_Image_Update_11_largeScale snap!");
+ screenShot("TC_Image_Update_11_largeScale");
+// ScreenShot.takeScreenShotIncludeDialog(getActivity(), "TC_Downgrade_osV_False");
+
+ sleep(2000);
+
+ }
+
+ inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "scale smaller");
+
+// myGroup.findViewsWithText(inputListView, "点击我,图片等比例缩小", View.FIND_VIEWS_WITH_TEXT);
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Image_Update_12_smallScale clcik!");
+
+ }
+ });
+
+ sleep(2000);
+ Log.e(TAG, "TC_Image_Update_12_smallScale snap!");
+ screenShot("TC_Image_Update_12_smallScale");
+// ScreenShot.takeScreenShotIncludeDialog(getActivity(), "TC_Downgrade_osV_False");
+
+ sleep(2000);
+
+ }
+
+ inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "resize cover");
+
+// myGroup.findViewsWithText(inputListView, "点击我,恢复默认", View.FIND_VIEWS_WITH_TEXT);
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Image_Update_13_recover clcik!");
+
+ }
+ });
+
+ sleep(2000);
+ Log.e(TAG, "TC_Image_Update_13_recover snap!");
+ screenShot("TC_Image_Update_13_recover");
+// ScreenShot.takeScreenShotIncludeDialog(getActivity(), "TC_Downgrade_osV_False");
+
+ sleep(2000);
+
+ }
+
+ inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "resize contain");
+
+// myGroup.findViewsWithText(inputListView, "点击我,恢复默认", View.FIND_VIEWS_WITH_TEXT);
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Image_Update_14_contain clcik!");
+
+ }
+ });
+
+ sleep(2000);
+ Log.e(TAG, "TC_Image_Update_14_contain snap!");
+ screenShot("TC_Image_Update_14_contain");
+// ScreenShot.takeScreenShotIncludeDialog(getActivity(), "TC_Downgrade_osV_False");
+
+ sleep(2000);
+
+ }
+
+ }
+ }
+
+ }
+
+
+
+ /**
+ * get tc list by text
+ * @param byText
+ * @return
+ * @throws InterruptedException
+ */
+ public ArrayList<View> getTestCaseListViewByText(String byText) throws InterruptedException {
+ Log.e("TestScript_Guide", "byText ==" + byText);
+
+ if(TextUtils.isEmpty(byText)){
+ return null;
+ }
+ ArrayList<View> outViews = new ArrayList<View>();
+
+ mViewGroup.findViewsWithText(outViews, byText, View.FIND_VIEWS_WITH_TEXT);
+ for (View view : outViews){
+ String viewText = ((WXTextView)view).getText().toString();
+ Log.e(TAG, "viewText ==" + viewText);
+
+
+ }
+ return outViews;
+ }
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(String caseText){
+ if (mCaseListIndexView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<mCaseListIndexView.size();i++){
+
+ view = (WXTextView)mCaseListIndexView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ try {
+ ScreenShot.shoot(WXPageActivity.wxPageActivityInstance, shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setViewGroup(ViewGroup viewGroup){
+ mViewGroup = viewGroup;
+ }
+ public void addAllTargetView(String target){
+ int max = 6;
+ int count =0 ;
+ while (count < max){
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ mCaseListIndexView.addAll(mCaseListIndexView);
+ count ++;
+ }
+ }
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Input/WeexUiTestCaseTcInputEvent.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Input/WeexUiTestCaseTcInputEvent.java
new file mode 100644
index 0000000..a993a8f
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Input/WeexUiTestCaseTcInputEvent.java
@@ -0,0 +1,393 @@
+/*
+ * 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.uitest.TC_Input;
+
+import android.app.Activity;
+import android.app.Application;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.EditText;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.util.ScreenShot;
+import com.alibaba.weex.util.ViewUtil;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.WeappJsBaseTestCase;
+import com.alibaba.weex.constants.Constants;
+import com.taobao.weex.ui.view.WXTextView;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Created by admin on 16/3/23.
+ */
+public class WeexUiTestCaseTcInputEvent extends ActivityInstrumentationTestCase2<WXPageActivity> {
+ public final String TAG = "TestScript_Guide==";
+ public WeappJsBaseTestCase weappApplication;
+ public WXPageActivity waTestPageActivity;
+ public WXPageActivity waTestPageActivity2;
+
+ public ViewGroup mViewGroup;
+ public Application mApplication;
+ public Instrumentation mInstrumentation;
+
+ public ArrayList<View> mCaseListIndexView = new ArrayList<View>();
+ public WeexUiTestCaseTcInputEvent() {
+ super(WXPageActivity.class);
+ }
+
+ public void setUp() throws Exception{
+
+ Log.e("TestScript_Guide", "setUp test!!");
+ setActivityInitialTouchMode(false);
+ weappApplication = new WeappJsBaseTestCase();
+ mInstrumentation = getInstrumentation();
+
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ waTestPageActivity = getActivity();
+// waTestPageActivity.getIntent().getData().toString();
+ Log.e(TAG, "activity1=" + waTestPageActivity.toString());
+ Thread.sleep(3000);
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ setViewGroup(mViewGroup);
+
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, "TC_");
+ addAllTargetView("TC_");
+
+ Thread.sleep(3000);
+ }
+
+// public void testPreConditions()
+// {
+// assertNotNull(waTestPageActivity);
+// assertNotNull(mViewGroup);
+// assertNotNull(mCaseListIndexView);
+//
+// }
+
+ public void testInputEvent(){
+
+ for(final View caseView : mCaseListIndexView){
+ if (((WXTextView)caseView).getText().toString().equals("TC_Input")){
+ Log.e(TAG, "TC_Input find");
+
+ final WXTextView inputView = (WXTextView)caseView;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ }
+ });
+
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+ Log.e(TAG, "activity2 = " + activity2.toString());
+
+ ViewGroup myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ Log.e(TAG, myGroup.toString());
+
+ ArrayList<View> inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "TC_Input_Event");
+
+// myGroup.findViewsWithText(inputListView, "TC_Input_Event", View.FIND_VIEWS_WITH_TEXT);
+
+ Log.e(TAG, "TC_Input_Event size== " + inputListView.size());
+ sleep(2000);
+ EditText inputTypeViewLoseFocus =null ;
+ sleep(2000);
+
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Input_Event clcik!");
+ }
+ });
+
+ sleep(3000);
+ Log.e(TAG, "TC_Input_Event_01_init snap!");
+ screenShot("TC_Input_Event_01_init");
+ sleep(3000);
+ }
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ activity2 = getActivity();
+ Log.e(TAG, "activity2 = " + activity2.toString());
+
+ myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ ArrayList<View> inputListView11 = new ArrayList<View>();
+ sleep(3000);
+
+ inputListView11 = ViewUtil.getAllChildViews(myGroup);
+ ArrayList<View> listEventView = new ArrayList<View>();
+
+ for(View view :inputListView11){
+ if(view instanceof android.support.v7.widget.RecyclerView){
+ android.support.v7.widget.RecyclerView listView =
+ (android.support.v7.widget.RecyclerView) view;
+ int count = listView.getChildCount();
+ Log.e(TAG, "listView count" + count);
+ listEventView = ViewUtil.getAllChildViews(listView);
+ }
+
+ }
+ Log.e(TAG, "listEventView size== " + listEventView.size());
+ if(listEventView.size()!=0){
+
+ for(View view :listEventView){
+// if (view instanceof WXTextView && null != view){
+// Log.e(TAG, "WXTextView get = " + ((WXTextView) view).getText().toString());
+// }
+
+ String hintText = "";
+
+ if (view instanceof EditText){
+ hintText = ((EditText) view).getHint().toString();
+ Log.e(TAG, "EditText hint text = " + hintText);
+ if(hintText.equals("onclick")){
+
+ final EditText inputTypeView = (EditText)view;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "EditText onclick clcik!");
+ }
+ });
+ sleep(3000);
+
+ }
+ else if(hintText.equals("oninput")){
+
+ final EditText inputTypeView = (EditText)view;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ inputTypeView.setText("input");
+ Log.e(TAG, "EditText input clcik!");
+
+ }
+ });
+
+ sleep(1000);
+ screenShot("TC_Input_Event_02_input");
+ Log.e(TAG, "TC_Input_Event_02_input snap!");
+ sleep(1000);
+
+ }
+
+ else if(hintText.equals("onchange")){
+
+ final EditText inputTypeView = (EditText)view;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ inputTypeView.setText("change");
+ Log.e(TAG, "EditText change clcik!");
+
+ }
+ });
+
+ sleep(1000);
+ }
+
+ else if(hintText.equals("失焦用途")){
+
+ inputTypeViewLoseFocus = (EditText)view;
+ final EditText inputTypeView = inputTypeViewLoseFocus;
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "失焦用途 clcik!");
+
+ }
+ });
+
+ sleep(1000);
+ }
+ else if(hintText.equals("onfocus")){
+
+ final EditText inputTypeView = (EditText)view;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "onfocus clcik!");
+
+ }
+ });
+
+ sleep(1000);
+ }
+
+ else if(hintText.equals("onblur")){
+
+ final EditText inputTypeView = (EditText)view;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "onblur clcik!");
+
+ }
+ });
+
+ sleep(1000);
+ }
+
+ }
+
+ }
+ if(null != inputTypeViewLoseFocus){
+ final EditText inputTypeView1 = inputTypeViewLoseFocus;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView1.requestFocus();
+ inputTypeView1.performClick();
+ Log.e(TAG, "失焦用途 clcik22!");
+
+ }
+ });
+
+ sleep(2000);
+ screenShot("TC_Input_Event_03_finish");
+ Log.e(TAG, "TC_Input_Event_03_finish snap!");
+ sleep(2000);
+
+ }
+ }
+ }
+ }
+
+ }
+
+
+
+ /**
+ * get tc list by text
+ * @param byText
+ * @return
+ * @throws InterruptedException
+ */
+ public ArrayList<View> getTestCaseListViewByText(String byText) throws InterruptedException {
+ Log.e("TestScript_Guide", "byText ==" + byText);
+
+ if(TextUtils.isEmpty(byText)){
+ return null;
+ }
+ ArrayList<View> outViews = new ArrayList<View>();
+
+ mViewGroup.findViewsWithText(outViews, byText, View.FIND_VIEWS_WITH_TEXT);
+
+ for (View view : outViews){
+ String viewText = ((WXTextView)view).getText().toString();
+ Log.e(TAG, "viewText ==" + viewText);
+
+
+ }
+ return outViews;
+ }
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(String caseText){
+ if (mCaseListIndexView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<mCaseListIndexView.size();i++){
+
+ view = (WXTextView)mCaseListIndexView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ try {
+ ScreenShot.shoot(WXPageActivity.wxPageActivityInstance, shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setViewGroup(ViewGroup viewGroup){
+ mViewGroup = viewGroup;
+ }
+ public void addAllTargetView(String target){
+ int max = 6;
+ int count =0 ;
+ while (count < max){
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ mCaseListIndexView.addAll(mCaseListIndexView);
+ count ++;
+ }
+ }
+
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Input/WeexUiTestCaseTcInputPlaceholder.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Input/WeexUiTestCaseTcInputPlaceholder.java
new file mode 100644
index 0000000..03f6c68
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Input/WeexUiTestCaseTcInputPlaceholder.java
@@ -0,0 +1,235 @@
+/*
+ * 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.uitest.TC_Input;
+
+import android.app.Activity;
+import android.app.Application;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.util.ScreenShot;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.WeappJsBaseTestCase;
+import com.alibaba.weex.constants.Constants;
+import com.alibaba.weex.util.ViewUtil;
+import com.taobao.weex.ui.view.WXTextView;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Created by admin on 16/3/23.
+ */
+public class WeexUiTestCaseTcInputPlaceholder extends ActivityInstrumentationTestCase2<WXPageActivity> {
+ public final String TAG = "TestScript_Guide==";
+ public WeappJsBaseTestCase weappApplication;
+ public WXPageActivity waTestPageActivity;
+ public WXPageActivity waTestPageActivity2;
+
+ public ViewGroup mViewGroup;
+ public Application mApplication;
+ public Instrumentation mInstrumentation;
+
+ public ArrayList<View> mCaseListIndexView = new ArrayList<View>();
+ public WeexUiTestCaseTcInputPlaceholder() {
+ super(WXPageActivity.class);
+ }
+
+ public void setUp() throws Exception{
+
+ Log.e("TestScript_Guide", "setUp test!!");
+ setActivityInitialTouchMode(false);
+ weappApplication = new WeappJsBaseTestCase();
+ mInstrumentation = getInstrumentation();
+
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ waTestPageActivity = getActivity();
+// waTestPageActivity.getIntent().getData().toString();
+ Log.e(TAG,"activity1=" + waTestPageActivity.toString() );
+ Thread.sleep(3000);//因为太快
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ setViewGroup(mViewGroup);
+
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, "TC_");
+ addAllTargetView("TC_");
+
+ Thread.sleep(3000);
+ }
+
+// public void testPreConditions()
+// {
+// assertNotNull(waTestPageActivity);
+// assertNotNull(mViewGroup);
+// assertNotNull(mCaseListIndexView);
+//
+// }
+
+ public void testInputPlaceholder(){
+
+ for(final View caseView : mCaseListIndexView){
+ if (((WXTextView)caseView).getText().toString().equals("TC_Input")){
+ Log.e(TAG, "TC_Input find");
+
+ final WXTextView inputView = (WXTextView)caseView;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ }
+ });
+
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+ Log.e(TAG, "activity2 = " + activity2.toString());
+
+ ViewGroup myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ Log.e(TAG, myGroup.toString());
+
+ ArrayList<View> inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "TC_Input_Placeholder");
+ sleep(2000);
+// myGroup.findViewsWithText(inputListView, "TC_Input_Placeholder", View.FIND_VIEWS_WITH_TEXT);
+
+ Log.e(TAG, "TC_Input_Placeholder size== " + inputListView.size());
+
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Input_Placeholder clcik!");
+
+
+// screenShot("TC_Input_Type");
+ }
+ });
+
+
+ sleep(3000);
+ Log.e(TAG, "TC_Input_Placeholder snap!");
+ screenShot("TC_Input_Placeholder");
+
+ }
+ }
+ }
+
+ }
+
+
+
+ /**
+ * get tc list by text
+ * @param byText
+ * @return
+ * @throws InterruptedException
+ */
+ public ArrayList<View> getTestCaseListViewByText(String byText) throws InterruptedException {
+ Log.e("TestScript_Guide", "byText ==" + byText);
+
+ if(TextUtils.isEmpty(byText)){
+ return null;
+ }
+ ArrayList<View> outViews = new ArrayList<View>();
+
+ mViewGroup.findViewsWithText(outViews, byText, View.FIND_VIEWS_WITH_TEXT);
+
+ for (View view : outViews){
+ String viewText = ((WXTextView)view).getText().toString();
+ Log.e(TAG, "viewText ==" + viewText);
+
+
+ }
+ return outViews;
+ }
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(String caseText){
+ if (mCaseListIndexView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<mCaseListIndexView.size();i++){
+
+ view = (WXTextView)mCaseListIndexView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ try {
+ ScreenShot.shoot(WXPageActivity.wxPageActivityInstance, shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setViewGroup(ViewGroup viewGroup){
+ mViewGroup = viewGroup;
+ }
+ public void addAllTargetView(String target){
+ int max = 6;
+ int count =0 ;
+ while (count < max){
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ mCaseListIndexView.addAll(mCaseListIndexView);
+ count ++;
+ }
+ }
+
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Input/WeexUiTestCaseTcInputStyle.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Input/WeexUiTestCaseTcInputStyle.java
new file mode 100644
index 0000000..c5904a9
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Input/WeexUiTestCaseTcInputStyle.java
@@ -0,0 +1,236 @@
+/*
+ * 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.uitest.TC_Input;
+
+import android.app.Activity;
+import android.app.Application;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.util.ScreenShot;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.WeappJsBaseTestCase;
+import com.alibaba.weex.constants.Constants;
+import com.alibaba.weex.util.ViewUtil;
+import com.taobao.weex.ui.view.WXTextView;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Created by admin on 16/3/23.
+ */
+public class WeexUiTestCaseTcInputStyle extends ActivityInstrumentationTestCase2<WXPageActivity> {
+ public final String TAG = "TestScript_Guide==";
+ public WeappJsBaseTestCase weappApplication;
+ public WXPageActivity waTestPageActivity;
+ public WXPageActivity waTestPageActivity2;
+
+ public ViewGroup mViewGroup;
+ public Application mApplication;
+ public Instrumentation mInstrumentation;
+
+ public ArrayList<View> mCaseListIndexView = new ArrayList<View>();
+ public WeexUiTestCaseTcInputStyle() {
+ super(WXPageActivity.class);
+ }
+
+ public void setUp() throws Exception{
+
+ Log.e("TestScript_Guide", "setUp test!!");
+ setActivityInitialTouchMode(false);
+ weappApplication = new WeappJsBaseTestCase();
+ mInstrumentation = getInstrumentation();
+
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ waTestPageActivity = getActivity();
+// waTestPageActivity.getIntent().getData().toString();
+ Log.e(TAG,"activity1=" + waTestPageActivity.toString() );
+ Thread.sleep(3000);
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ setViewGroup(mViewGroup);
+
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, "TC_");
+ addAllTargetView("TC_");
+
+ Thread.sleep(3000);
+ }
+
+// public void testPreConditions()
+// {
+// assertNotNull(waTestPageActivity);
+// assertNotNull(mViewGroup);
+// assertNotNull(mCaseListIndexView);
+//
+// }
+
+ public void testInputStyle(){
+
+ for(final View caseView : mCaseListIndexView){
+ if (((WXTextView)caseView).getText().toString().equals("TC_Input")){
+ Log.e(TAG, "TC_Input find");
+
+ final WXTextView inputView = (WXTextView)caseView;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ }
+ });
+
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+ Log.e(TAG, "activity2 = " + activity2.toString());
+
+ ViewGroup myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ Log.e(TAG, myGroup.toString());
+
+ ArrayList<View> inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "TC_Input_Style");
+
+// myGroup.findViewsWithText(inputListView, "TC_Input_Style", View.FIND_VIEWS_WITH_TEXT);
+
+ Log.e(TAG, "TC_Input_Style size== " + inputListView.size());
+ sleep(2000);
+
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Input_Style clcik!");
+
+
+// screenShot("TC_Input_Type");
+ }
+ });
+
+
+ sleep(3000);
+ Log.e(TAG, "TC_Input_Style snap!");
+ screenShot("TC_Input_Style");
+
+ }
+ }
+ }
+
+ }
+
+
+
+ /**
+ * get tc list by text
+ * @param byText
+ * @return
+ * @throws InterruptedException
+ */
+ public ArrayList<View> getTestCaseListViewByText(String byText) throws InterruptedException {
+ Log.e("TestScript_Guide", "byText ==" + byText);
+
+ if(TextUtils.isEmpty(byText)){
+ return null;
+ }
+ ArrayList<View> outViews = new ArrayList<View>();
+
+ mViewGroup.findViewsWithText(outViews, byText, View.FIND_VIEWS_WITH_TEXT);
+
+ for (View view : outViews){
+ String viewText = ((WXTextView)view).getText().toString();
+ Log.e(TAG, "viewText ==" + viewText);
+
+
+ }
+ return outViews;
+ }
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(String caseText){
+ if (mCaseListIndexView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<mCaseListIndexView.size();i++){
+
+ view = (WXTextView)mCaseListIndexView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ try {
+ ScreenShot.shoot(WXPageActivity.wxPageActivityInstance, shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setViewGroup(ViewGroup viewGroup){
+ mViewGroup = viewGroup;
+ }
+ public void addAllTargetView(String target){
+ int max = 6;
+ int count =0 ;
+ while (count < max){
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ mCaseListIndexView.addAll(mCaseListIndexView);
+ count ++;
+ }
+ }
+
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Input/WeexUiTestCaseTcInputType.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Input/WeexUiTestCaseTcInputType.java
new file mode 100644
index 0000000..e6fba81
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Input/WeexUiTestCaseTcInputType.java
@@ -0,0 +1,236 @@
+/*
+ * 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.uitest.TC_Input;
+
+import android.app.Activity;
+import android.app.Application;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.util.ScreenShot;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.WeappJsBaseTestCase;
+import com.alibaba.weex.constants.Constants;
+import com.alibaba.weex.util.ViewUtil;
+import com.taobao.weex.ui.view.WXTextView;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Created by admin on 16/3/23.
+ */
+public class WeexUiTestCaseTcInputType extends ActivityInstrumentationTestCase2<WXPageActivity> {
+ public final String TAG = "TestScript_Guide==";
+ public WeappJsBaseTestCase weappApplication;
+ public WXPageActivity waTestPageActivity;
+ public WXPageActivity waTestPageActivity2;
+
+ public ViewGroup mViewGroup;
+ public Application mApplication;
+ public Instrumentation mInstrumentation;
+
+ public ArrayList<View> mCaseListIndexView = new ArrayList<View>();
+ public WeexUiTestCaseTcInputType() {
+ super(WXPageActivity.class);
+ }
+
+ public void setUp() throws Exception{
+
+ Log.e("TestScript_Guide", "setUp test!!");
+ setActivityInitialTouchMode(false);
+ weappApplication = new WeappJsBaseTestCase();
+ mInstrumentation = getInstrumentation();
+
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ waTestPageActivity = getActivity();
+// waTestPageActivity.getIntent().getData().toString();
+ Log.e(TAG,"activity1=" + waTestPageActivity.toString() );
+ Thread.sleep(3000);
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ setViewGroup(mViewGroup);
+
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, "TC_");
+ addAllTargetView("TC_");
+
+ Thread.sleep(3000);
+ }
+
+// public void testPreConditions()
+// {
+// assertNotNull(waTestPageActivity);
+// assertNotNull(mViewGroup);
+// assertNotNull(mCaseListIndexView);
+//
+// }
+
+ public void testInputType(){
+
+ for(final View caseView : mCaseListIndexView){
+ if (((WXTextView)caseView).getText().toString().equals("TC_Input")){
+ Log.e(TAG, "TC_Input find");
+
+ final WXTextView inputView = (WXTextView)caseView;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ }
+ });
+
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+ Log.e(TAG, "activity2 = " + activity2.toString());
+
+ ViewGroup myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ Log.e(TAG, myGroup.toString());
+
+ ArrayList<View> inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "TC_Input_Type");
+
+// myGroup.findViewsWithText(inputListView, "TC_Input_Type", View.FIND_VIEWS_WITH_TEXT);
+
+ Log.e(TAG, "TC_Input_Type size== " + inputListView.size());
+ sleep(2000);
+
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "inputTypeView clcik!");
+
+
+// screenShot("TC_Input_Type");
+ }
+ });
+
+
+ sleep(3000);
+ Log.e(TAG, "TC_Input_Type snap!");
+ screenShot("TC_Input_Type");
+
+ }
+ }
+ }
+
+ }
+
+
+
+ /**
+ * get tc list by text
+ * @param byText
+ * @return
+ * @throws InterruptedException
+ */
+ public ArrayList<View> getTestCaseListViewByText(String byText) throws InterruptedException {
+ Log.e("TestScript_Guide", "byText ==" + byText);
+
+ if(TextUtils.isEmpty(byText)){
+ return null;
+ }
+ ArrayList<View> outViews = new ArrayList<View>();
+
+ mViewGroup.findViewsWithText(outViews, byText, View.FIND_VIEWS_WITH_TEXT);
+
+ for (View view : outViews){
+ String viewText = ((WXTextView)view).getText().toString();
+ Log.e(TAG, "viewText ==" + viewText);
+
+
+ }
+ return outViews;
+ }
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(String caseText){
+ if (mCaseListIndexView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<mCaseListIndexView.size();i++){
+
+ view = (WXTextView)mCaseListIndexView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ try {
+ ScreenShot.shoot(WXPageActivity.wxPageActivityInstance, shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setViewGroup(ViewGroup viewGroup){
+ mViewGroup = viewGroup;
+ }
+ public void addAllTargetView(String target){
+ int max = 6;
+ int count =0 ;
+ while (count < max){
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ mCaseListIndexView.addAll(mCaseListIndexView);
+ count ++;
+ }
+ }
+
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_List/.gitignore b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_List/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_List/.gitignore
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Monitor/.gitignore b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Monitor/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Monitor/.gitignore
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_PopBox/.gitignore b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_PopBox/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_PopBox/.gitignore
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Scroller/.gitignore b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Scroller/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Scroller/.gitignore
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Select/.gitignore b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Select/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Select/.gitignore
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Slider/WeexUiTestCaseTcSlider.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Slider/WeexUiTestCaseTcSlider.java
new file mode 100644
index 0000000..55ddbc4
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Slider/WeexUiTestCaseTcSlider.java
@@ -0,0 +1,284 @@
+/*
+ * 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.uitest.TC_Slider;
+
+import android.app.Activity;
+import android.app.Application;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.util.ScreenShot;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.WeappJsBaseTestCase;
+import com.alibaba.weex.constants.Constants;
+import com.alibaba.weex.util.ViewUtil;
+import com.taobao.weex.ui.view.WXTextView;
+
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Created by admin on 16/3/23.
+ */
+public class WeexUiTestCaseTcSlider extends ActivityInstrumentationTestCase2<WXPageActivity> {
+ public final String TAG = "TestScript_Guide==";
+ public WeappJsBaseTestCase weappApplication;
+ public WXPageActivity waTestPageActivity;
+ public ViewGroup mViewGroup;
+ public Application mApplication;
+ // private int childViewCount;
+// private int viewGroupHeight;
+ public Instrumentation mInstrumentation;
+
+ public ArrayList<View> mCaseListIndexView = new ArrayList<View>();
+
+
+ public WeexUiTestCaseTcSlider() {
+ super(WXPageActivity.class);
+ }
+
+ public void setUp() throws Exception{
+
+ Log.e("TestScript_Guide", "setUp test!!");
+ setActivityInitialTouchMode(false);
+ weappApplication = new WeappJsBaseTestCase();
+ mInstrumentation = getInstrumentation();
+
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ waTestPageActivity = getActivity();
+ Thread.sleep(3000);
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ setViewGroup(mViewGroup);
+
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, "TC_");
+ addAllTargetView("TC_");
+
+ Thread.sleep(3000);
+ }
+
+
+// public void testPreConditions()
+// {
+// assertNotNull(waTestPageActivity);
+// assertNotNull(mViewGroup);
+// assertNotNull(mCaseListIndexView);
+//
+// }
+
+
+ //不会执行 如果不用@Test
+ public void testSlider(){
+ // Todo nothing
+
+ }
+ public void Slider(){
+
+ for(final View caseView : mCaseListIndexView){
+ if (((WXTextView)caseView).getText().toString().equals("TC_Slider")){
+ Log.e(TAG, "TC_Slider find");
+
+ final WXTextView inputView = (WXTextView)caseView;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ }
+ });
+
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+ Log.e(TAG, "activity2 = " + activity2.toString());
+
+ ViewGroup myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ Log.e(TAG, myGroup.toString());
+
+ ArrayList<View> inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "TC_Slider_Event");
+
+// myGroup.findViewsWithText(inputListView, "TC_Input_Style", View.FIND_VIEWS_WITH_TEXT);
+
+ Log.e(TAG, "TC_Slider_Event size== " + inputListView.size());
+
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Slider_Event clcik!");
+
+
+// screenShot("TC_Input_Type");
+ }
+ });
+
+
+ sleep(3000);
+ Log.e(TAG, "TC_Slider_Event snap!");
+ screenShot("TC_Slider_Event");
+
+ }
+ }
+ }
+ }
+
+ /**
+ * get tc list by text
+ * @param byText
+ * @return
+ * @throws InterruptedException
+ */
+ public ArrayList<View> getTestCaseListViewByText(String byText) throws InterruptedException {
+ Log.e("TestScript_Guide", "byText ==" + byText);
+
+ if(TextUtils.isEmpty(byText)){
+ return null;
+ }
+
+// mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+// setViewGroup(mViewGroup);
+ ArrayList<View> outViews = new ArrayList<View>();
+
+ // 寻找 TC_测试
+ for(int i=0 ; i<mViewGroup.getChildCount(); i++){
+
+ View childView = mViewGroup.getChildAt(i);
+ if(childView.getClass().isAssignableFrom(WXTextView.class)){
+ Log.e(TAG, "Current View====" + ((WXTextView) childView).getText().toString());
+ }
+
+ }
+
+ outViews = ViewUtil.findViewWithText(mViewGroup, "TC_Input_Type");
+
+// mViewGroup.findViewsWithText(outViews, byText, View.FIND_VIEWS_WITH_TEXT);
+
+ for (View view : outViews){
+ String viewText = ((WXTextView)view).getText().toString();
+ Log.e(TAG, "viewText ==" + viewText);
+
+ if(viewText.equals("TC_Slider")){
+ final View tcSlider = view;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ tcSlider.requestFocus();
+ tcSlider.performClick();
+ }
+ });
+ screenShot("TC_Slider");
+ }
+
+ }
+ return outViews;
+ }
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ try {
+ ScreenShot.shoot(waTestPageActivity, shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(String caseText){
+ if (mCaseListIndexView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<mCaseListIndexView.size();i++){
+
+ view = (WXTextView)mCaseListIndexView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(ArrayList<View> fatherView, String caseText){
+ if (fatherView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<fatherView.size();i++){
+
+ view = (WXTextView)fatherView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setViewGroup(ViewGroup viewGroup){
+ mViewGroup = viewGroup;
+ }
+ public void addAllTargetView(String target){
+ int max = 6;
+ int count =0 ;
+ while (count < max){
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ mCaseListIndexView.addAll(mCaseListIndexView);
+ count ++;
+ }
+ }
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Style/.gitignore b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Style/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Style/.gitignore
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Switch/.gitignore b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Switch/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Switch/.gitignore
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Text/WeexUiTestCaseTcTextStyleColumn.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Text/WeexUiTestCaseTcTextStyleColumn.java
new file mode 100644
index 0000000..f404050
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Text/WeexUiTestCaseTcTextStyleColumn.java
@@ -0,0 +1,266 @@
+/*
+ * 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.uitest.TC_Text;
+
+import android.app.Activity;
+import android.app.Application;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.util.ScreenShot;
+import com.alibaba.weex.util.ViewUtil;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.WeappJsBaseTestCase;
+import com.alibaba.weex.constants.Constants;
+import com.taobao.weex.ui.view.WXTextView;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Created by admin on 16/3/23.
+ */
+public class WeexUiTestCaseTcTextStyleColumn extends ActivityInstrumentationTestCase2<WXPageActivity> {
+ public final String TAG = "TestScript_Guide==";
+ public WeappJsBaseTestCase weappApplication;
+ public WXPageActivity waTestPageActivity;
+ public WXPageActivity waTestPageActivity2;
+
+ public ViewGroup mViewGroup;
+ public Application mApplication;
+ public Instrumentation mInstrumentation;
+
+ public ArrayList<View> mCaseListIndexView = new ArrayList<View>();
+ public WeexUiTestCaseTcTextStyleColumn() {
+ super(WXPageActivity.class);
+ }
+
+ public void setUp() throws Exception{
+
+ Log.e("TestScript_Guide", "setUp test!!");
+ setActivityInitialTouchMode(false);
+ weappApplication = new WeappJsBaseTestCase();
+ mInstrumentation = getInstrumentation();
+
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ waTestPageActivity = getActivity();
+// waTestPageActivity.getIntent().getData().toString();
+ Log.e(TAG,"activity1=" + waTestPageActivity.toString() );
+ Thread.sleep(3000);
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ setViewGroup(mViewGroup);
+
+ Thread.sleep(2000);
+
+ TouchUtils.scrollToBottom(this, waTestPageActivity, mViewGroup);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, "TC_");
+ addAllTargetView("TC_");
+
+ Thread.sleep(3000);
+ }
+
+// public void testPreConditions()
+// {
+// assertNotNull(waTestPageActivity);
+// assertNotNull(mViewGroup);
+// assertNotNull(mCaseListIndexView);
+//
+// }
+
+ public void testTextStyleColumn(){
+
+ for(final View caseView : mCaseListIndexView){
+ String caseViewText = new String("");
+ caseViewText = ((WXTextView)caseView).getText().toString();
+ Log.e(TAG, "caseView==" + caseViewText);
+ if (((WXTextView)caseView).getText().toString().equals("TC_Text")){
+ Log.e(TAG, "TC_Text find");
+
+ final WXTextView inputView = (WXTextView)caseView;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ }
+ });
+
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+ Log.e(TAG, "activity2 = " + activity2.toString());
+
+ ViewGroup myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ Log.e(TAG, myGroup.toString());
+
+ ArrayList<View> inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "TC_Text_Style_Column");
+// myGroup.findViewsWithText(inputListView, "TC_Text_Style_Column", View.FIND_VIEWS_WITH_TEXT);
+
+ Log.e(TAG, "TC_Text_Style_Column size== " + inputListView.size());
+
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Text_Style_Column clcik!");
+
+
+// screenShot("TC_Input_Type");
+ }
+ });
+
+
+ sleep(2000);
+ Log.e(TAG, "TC_Text_Style_Column_01_beforeClick snap!");
+ screenShot("TC_Text_Style_Column_01_beforeClick");
+ sleep(2000);
+ }
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ activity2 = getActivity();
+ Log.e(TAG, "activity2 = " + activity2.toString());
+
+ myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ Log.e(TAG, myGroup.toString());
+
+ inputListView = ViewUtil.getAllChildViews(myGroup);
+ for(View view :inputListView) {
+ if (view instanceof WXTextView || view instanceof WXTextView) {
+ final WXTextView inputTypeView = (WXTextView) view;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Text_Style_Column_02_afterClick_text = " + inputTypeView.getText() + " clcik!");
+ }
+ });
+
+ sleep(2000);
+ }
+ }
+ Log.e(TAG, "TC_Text_Style_Column_02_afterClick snap!");
+ screenShot("TC_Text_Style_Column_02_afterClick");
+ sleep(2000);
+
+ }
+ }
+
+ }
+
+
+
+ /**
+ * get tc list by text
+ * @param byText
+ * @return
+ * @throws InterruptedException
+ */
+ public ArrayList<View> getTestCaseListViewByText(String byText) throws InterruptedException {
+ Log.e("TestScript_Guide", "byText ==" + byText);
+
+ if(TextUtils.isEmpty(byText)){
+ return null;
+ }
+ ArrayList<View> outViews = new ArrayList<View>();
+
+ mViewGroup.findViewsWithText(outViews, byText, View.FIND_VIEWS_WITH_TEXT);
+
+ for (View view : outViews){
+ String viewText = ((WXTextView)view).getText().toString();
+ Log.e(TAG, "viewText ==" + viewText);
+
+
+ }
+ return outViews;
+ }
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(String caseText){
+ if (mCaseListIndexView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<mCaseListIndexView.size();i++){
+
+ view = (WXTextView)mCaseListIndexView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ try {
+ ScreenShot.shoot(WXPageActivity.wxPageActivityInstance, shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setViewGroup(ViewGroup viewGroup){
+ mViewGroup = viewGroup;
+ }
+ public void addAllTargetView(String target){
+ int max = 6;
+ int count =0 ;
+ while (count < max){
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ mCaseListIndexView.addAll(mCaseListIndexView);
+ count ++;
+ }
+ }
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Text/WeexUiTestCaseTcTextStyleOwn.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Text/WeexUiTestCaseTcTextStyleOwn.java
new file mode 100644
index 0000000..0d8c508
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Text/WeexUiTestCaseTcTextStyleOwn.java
@@ -0,0 +1,236 @@
+/*
+ * 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.uitest.TC_Text;
+
+import android.app.Activity;
+import android.app.Application;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.util.ScreenShot;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.WeappJsBaseTestCase;
+import com.alibaba.weex.constants.Constants;
+import com.alibaba.weex.util.ViewUtil;
+import com.taobao.weex.ui.view.WXTextView;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Created by admin on 16/3/23.
+ */
+public class WeexUiTestCaseTcTextStyleOwn extends ActivityInstrumentationTestCase2<WXPageActivity> {
+ public final String TAG = "TestScript_Guide==";
+ public WeappJsBaseTestCase weappApplication;
+ public WXPageActivity waTestPageActivity;
+ public ViewGroup mViewGroup;
+ public Application mApplication;
+ public Instrumentation mInstrumentation;
+
+ public ArrayList<View> mCaseListIndexView = new ArrayList<View>();
+ public WeexUiTestCaseTcTextStyleOwn() {
+ super(WXPageActivity.class);
+ }
+
+ public void setUp() throws Exception{
+
+ Log.e("TestScript_Guide", "setUp test!!");
+ setActivityInitialTouchMode(false);
+ weappApplication = new WeappJsBaseTestCase();
+ mInstrumentation = getInstrumentation();
+
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ waTestPageActivity = getActivity();
+// waTestPageActivity.getIntent().getData().toString();
+ Log.e(TAG,"activity1=" + waTestPageActivity.toString() );
+ Thread.sleep(3000);
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ setViewGroup(mViewGroup);
+
+ Thread.sleep(2000);
+
+ TouchUtils.scrollToBottom(this, waTestPageActivity, mViewGroup);
+
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, "TC_");
+ addAllTargetView("TC_");
+
+ Thread.sleep(3000);
+ }
+
+// public void testPreConditions()
+// {
+// assertNotNull(waTestPageActivity);
+// assertNotNull(mViewGroup);
+// assertNotNull(mCaseListIndexView);
+//
+// }
+
+ public void testTextType(){
+
+ for(final View caseView : mCaseListIndexView){
+ if (((WXTextView)caseView).getText().toString().equals("TC_Text")){
+ Log.e(TAG, "TC_Text find");
+
+ final WXTextView inputView = (WXTextView)caseView;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ }
+ });
+
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+ Log.e(TAG, "activity2 = " + activity2.toString());
+
+ ViewGroup myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ Log.e(TAG, myGroup.toString());
+
+ ArrayList<View> inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "TC_Text_Style_Own");
+
+// myGroup.findViewsWithText(inputListView, "TC_Text_Style_Own", View.FIND_VIEWS_WITH_TEXT);
+
+ Log.e(TAG, "TC_Text_Style_Own size== " + inputListView.size());
+
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Text_Style_Own clcik!");
+
+
+// screenShot("TC_Input_Type");
+ }
+ });
+
+ sleep(1000);
+ Log.e(TAG, "TC_Text_Style_Own snap!");
+ screenShot("TC_Text_Style_Own");
+ sleep(2000);
+ }
+ }
+ }
+
+ }
+
+
+
+ /**
+ * get tc list by text
+ * @param byText
+ * @return
+ * @throws InterruptedException
+ */
+ public ArrayList<View> getTestCaseListViewByText(String byText) throws InterruptedException {
+ Log.e("TestScript_Guide", "byText ==" + byText);
+
+ if(TextUtils.isEmpty(byText)){
+ return null;
+ }
+ ArrayList<View> outViews = new ArrayList<View>();
+
+ mViewGroup.findViewsWithText(outViews, byText, View.FIND_VIEWS_WITH_TEXT);
+
+ for (View view : outViews){
+ String viewText = ((WXTextView)view).getText().toString();
+ Log.e(TAG, "viewText ==" + viewText);
+
+
+ }
+ return outViews;
+ }
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(String caseText){
+ if (mCaseListIndexView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<mCaseListIndexView.size();i++){
+
+ view = (WXTextView)mCaseListIndexView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ try {
+ ScreenShot.shoot(WXPageActivity.wxPageActivityInstance, shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setViewGroup(ViewGroup viewGroup){
+ mViewGroup = viewGroup;
+ }
+ public void addAllTargetView(String target){
+ int max = 6;
+ int count =0 ;
+ while (count < max){
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ mCaseListIndexView.addAll(mCaseListIndexView);
+ count ++;
+ }
+ }
+
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Text/WeexUiTestCaseTcTextStyleRow.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Text/WeexUiTestCaseTcTextStyleRow.java
new file mode 100644
index 0000000..a847aaa
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Text/WeexUiTestCaseTcTextStyleRow.java
@@ -0,0 +1,266 @@
+/*
+ * 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.uitest.TC_Text;
+
+import android.app.Activity;
+import android.app.Application;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.util.ScreenShot;
+import com.alibaba.weex.util.ViewUtil;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.WeappJsBaseTestCase;
+import com.alibaba.weex.constants.Constants;
+import com.taobao.weex.ui.view.WXTextView;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Created by admin on 16/3/23.
+ */
+public class WeexUiTestCaseTcTextStyleRow extends ActivityInstrumentationTestCase2<WXPageActivity> {
+ public final String TAG = "TestScript_Guide==";
+ public WeappJsBaseTestCase weappApplication;
+ public WXPageActivity waTestPageActivity;
+ public WXPageActivity waTestPageActivity2;
+
+ public ViewGroup mViewGroup;
+ public Application mApplication;
+ public Instrumentation mInstrumentation;
+
+ public ArrayList<View> mCaseListIndexView = new ArrayList<View>();
+ public WeexUiTestCaseTcTextStyleRow() {
+ super(WXPageActivity.class);
+ }
+
+ public void setUp() throws Exception{
+
+ Log.e("TestScript_Guide", "setUp test!!");
+ setActivityInitialTouchMode(false);
+ weappApplication = new WeappJsBaseTestCase();
+ mInstrumentation = getInstrumentation();
+
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ waTestPageActivity = getActivity();
+// waTestPageActivity.getIntent().getData().toString();
+ Log.e(TAG,"activity1=" + waTestPageActivity.toString() );
+ Thread.sleep(3000);
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ setViewGroup(mViewGroup);
+ Thread.sleep(2000);
+
+ TouchUtils.scrollToBottom(this, waTestPageActivity, mViewGroup);
+
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, "TC_");
+ addAllTargetView("TC_");
+
+ Thread.sleep(3000);
+ }
+
+// public void testPreConditions()
+// {
+// assertNotNull(waTestPageActivity);
+// assertNotNull(mViewGroup);
+// assertNotNull(mCaseListIndexView);
+//
+// }
+
+ public void testTextStyleRow(){
+
+ for(final View caseView : mCaseListIndexView){
+ if (((WXTextView)caseView).getText().toString().equals("TC_Text")){
+ Log.e(TAG, "TC_Text find");
+
+ final WXTextView inputView = (WXTextView)caseView;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ }
+ });
+
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+ Log.e(TAG, "activity2 = " + activity2.toString());
+
+ ViewGroup myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ Log.e(TAG, myGroup.toString());
+
+ ArrayList<View> inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "TC_Text_Style_Row");
+
+// myGroup.findViewsWithText(inputListView, "TC_Text_Style_Row", View.FIND_VIEWS_WITH_TEXT);
+
+ Log.e(TAG, "TC_Text_Style_Row size== " + inputListView.size());
+
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Text_Style_Row clcik!");
+
+
+// screenShot("TC_Input_Type");
+ }
+ });
+
+
+ sleep(3000);
+ Log.e(TAG, "TC_Text_Style_Row_01_beforeClick snap!");
+ screenShot("TC_Text_Style_Row_01_beforeClick");
+ sleep(2000);
+
+ }
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ activity2 = getActivity();
+ Log.e(TAG, "activity2 = " + activity2.toString());
+
+ myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ Log.e(TAG, myGroup.toString());
+
+ inputListView = ViewUtil.getAllChildViews(myGroup);
+ for(View view :inputListView) {
+ if (view instanceof WXTextView || view instanceof WXTextView) {
+ final WXTextView inputTypeView = (WXTextView) view;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Text_Style_Row_text = " + inputTypeView.getText() + " clcik!");
+ }
+ });
+
+ sleep(2000);
+ }
+ }
+ Log.e(TAG, "TC_Text_Style_Row_02_afterClick snap!");
+ screenShot("TC_Text_Style_Row_02_afterClick");
+ sleep(2000);
+
+ }
+ }
+
+ }
+
+
+
+ /**
+ * get tc list by text
+ * @param byText
+ * @return
+ * @throws InterruptedException
+ */
+ public ArrayList<View> getTestCaseListViewByText(String byText) throws InterruptedException {
+ Log.e("TestScript_Guide", "byText ==" + byText);
+
+ if(TextUtils.isEmpty(byText)){
+ return null;
+ }
+ ArrayList<View> outViews = new ArrayList<View>();
+
+ mViewGroup.findViewsWithText(outViews, byText, View.FIND_VIEWS_WITH_TEXT);
+
+ for (View view : outViews){
+ String viewText = ((WXTextView)view).getText().toString();
+ Log.e(TAG, "viewText ==" + viewText);
+
+
+ }
+ return outViews;
+ }
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(String caseText){
+ if (mCaseListIndexView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<mCaseListIndexView.size();i++){
+
+ view = (WXTextView)mCaseListIndexView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ try {
+ ScreenShot.shoot(WXPageActivity.wxPageActivityInstance, shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setViewGroup(ViewGroup viewGroup){
+ mViewGroup = viewGroup;
+ }
+ public void addAllTargetView(String target){
+ int max = 6;
+ int count =0 ;
+ while (count < max){
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ mCaseListIndexView.addAll(mCaseListIndexView);
+ count ++;
+ }
+ }
+
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Text/WeexUiTestCaseTcTextType.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Text/WeexUiTestCaseTcTextType.java
new file mode 100644
index 0000000..6d99469
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Text/WeexUiTestCaseTcTextType.java
@@ -0,0 +1,236 @@
+/*
+ * 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.uitest.TC_Text;
+
+import android.app.Activity;
+import android.app.Application;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.util.ScreenShot;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.WeappJsBaseTestCase;
+import com.alibaba.weex.constants.Constants;
+import com.alibaba.weex.util.ViewUtil;
+import com.taobao.weex.ui.view.WXTextView;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Created by admin on 16/3/23.
+ */
+public class WeexUiTestCaseTcTextType extends ActivityInstrumentationTestCase2<WXPageActivity> {
+ public final String TAG = "TestScript_Guide==";
+ public WeappJsBaseTestCase weappApplication;
+ public WXPageActivity waTestPageActivity;
+ public ViewGroup mViewGroup;
+ public Application mApplication;
+ public Instrumentation mInstrumentation;
+
+ public ArrayList<View> mCaseListIndexView = new ArrayList<View>();
+ public WeexUiTestCaseTcTextType() {
+ super(WXPageActivity.class);
+ }
+
+ public void setUp() throws Exception{
+
+ Log.e("TestScript_Guide", "setUp test!!");
+ setActivityInitialTouchMode(false);
+ weappApplication = new WeappJsBaseTestCase();
+ mInstrumentation = getInstrumentation();
+
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ waTestPageActivity = getActivity();
+// waTestPageActivity.getIntent().getData().toString();
+ Log.e(TAG,"activity1=" + waTestPageActivity.toString() );
+ Thread.sleep(3000);
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ setViewGroup(mViewGroup);
+ Thread.sleep(2000);
+
+ TouchUtils.scrollToBottom(this, waTestPageActivity, mViewGroup);
+
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, "TC_");
+ addAllTargetView("TC_");
+
+ Thread.sleep(3000);
+ }
+
+// public void testPreConditions()
+// {
+// assertNotNull(waTestPageActivity);
+// assertNotNull(mViewGroup);
+// assertNotNull(mCaseListIndexView);
+//
+// }
+
+ public void testTextType(){
+
+ for(final View caseView : mCaseListIndexView){
+ if (((WXTextView)caseView).getText().toString().equals("TC_Text")){
+ Log.e(TAG, "TC_Text find");
+
+ final WXTextView inputView = (WXTextView)caseView;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ }
+ });
+
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+ Log.e(TAG, "activity2 = " + activity2.toString());
+
+ ViewGroup myGroup = (ViewGroup)(activity2.findViewById(R.id.container));
+ Log.e(TAG, myGroup.toString());
+
+ ArrayList<View> inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup, "TC_Text_Type");
+
+// myGroup.findViewsWithText(inputListView, "TC_Text_Type", View.FIND_VIEWS_WITH_TEXT);
+
+ Log.e(TAG, "TC_Text_Type size== " + inputListView.size());
+
+ if(inputListView.size()!=0){
+ final WXTextView inputTypeView = (WXTextView)inputListView.get(0);
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "TC_Text_Type clcik!");
+
+
+// screenShot("TC_Input_Type");
+ }
+ });
+
+
+ sleep(3000);
+ Log.e(TAG, "TC_Text_Type snap!");
+ screenShot("TC_Text_Type");
+
+ }
+ }
+ }
+
+ }
+
+
+
+ /**
+ * get tc list by text
+ * @param byText
+ * @return
+ * @throws InterruptedException
+ */
+ public ArrayList<View> getTestCaseListViewByText(String byText) throws InterruptedException {
+ Log.e("TestScript_Guide", "byText ==" + byText);
+
+ if(TextUtils.isEmpty(byText)){
+ return null;
+ }
+ ArrayList<View> outViews = new ArrayList<View>();
+
+ mViewGroup.findViewsWithText(outViews, byText, View.FIND_VIEWS_WITH_TEXT);
+
+ for (View view : outViews){
+ String viewText = ((WXTextView)view).getText().toString();
+ Log.e(TAG, "viewText ==" + viewText);
+
+
+ }
+ return outViews;
+ }
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(String caseText){
+ if (mCaseListIndexView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<mCaseListIndexView.size();i++){
+
+ view = (WXTextView)mCaseListIndexView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ try {
+ ScreenShot.shoot(WXPageActivity.wxPageActivityInstance, shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setViewGroup(ViewGroup viewGroup){
+ mViewGroup = viewGroup;
+ }
+ public void addAllTargetView(String target){
+ int max = 6;
+ int count =0 ;
+ while (count < max){
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ mCaseListIndexView.addAll(mCaseListIndexView);
+ count ++;
+ }
+ }
+
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Video/.gitignore b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Video/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Video/.gitignore
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Web/.gitignore b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Web/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/TC_Web/.gitignore
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/uitest/WeexUiTestCaseTcElementOpt.java b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/WeexUiTestCaseTcElementOpt.java
new file mode 100644
index 0000000..c020fa5
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/uitest/WeexUiTestCaseTcElementOpt.java
@@ -0,0 +1,470 @@
+/*
+ * 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.uitest;
+
+import android.app.Application;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.util.ScreenShot;
+import com.alibaba.weex.util.ViewUtil;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.WeappJsBaseTestCase;
+import com.alibaba.weex.constants.Constants;
+import com.taobao.weex.ui.view.WXTextView;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by admin on 16/3/23.
+ */
+public class WeexUiTestCaseTcElementOpt extends ActivityInstrumentationTestCase2<WXPageActivity> {
+ public final String TAG = "TestScript_Guide==";
+ public WeappJsBaseTestCase weappApplication;
+ public WXPageActivity waTestPageActivity;
+ public WXPageActivity waTestPageActivity2;
+
+ public ViewGroup mViewGroup;
+ public Application mApplication;
+ public Instrumentation mInstrumentation;
+
+ public ArrayList<View> mCaseListIndexView = new ArrayList<View>();
+ public WeexUiTestCaseTcElementOpt() {
+ super(WXPageActivity.class);
+ }
+
+ public void setUp() throws Exception{
+
+ Log.e("TestScript_Guide", "setUp test!!");
+ setActivityInitialTouchMode(false);
+ weappApplication = new WeappJsBaseTestCase();
+ mInstrumentation = getInstrumentation();
+
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ waTestPageActivity = getActivity();
+// waTestPageActivity.getIntent().getData().toString();
+ Log.e(TAG,"activity1=" + waTestPageActivity.toString() );
+ Thread.sleep(3000);
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ setViewGroup(mViewGroup);
+
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, "TC_");
+ addAllTargetView("TC_");
+ Thread.sleep(3000);
+ }
+
+// public void testPreConditions()
+// {
+// assertNotNull(waTestPageActivity);
+// assertNotNull(mViewGroup);
+// assertNotNull(mCaseListIndexView);
+//
+// }
+
+ public void testElementOpt() {
+
+ for (final View caseView : mCaseListIndexView) {
+ if (((WXTextView) caseView).getText().toString().equals("TC_Event")) {
+ Log.e(TAG, "TC_Event find");
+
+ final WXTextView inputView = (WXTextView) caseView;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ Log.e(TAG, "TC_Event clcik!!" );
+ }
+ });
+ sleep(2000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ ViewGroup optGroup = (ViewGroup) (getActivity().findViewById(R.id.container));
+ ArrayList<View> otpViewList = new ArrayList<View>();
+ otpViewList = ViewUtil.findViewWithText(optGroup, "TC_Event_ElementOpt");
+// optGroup.findViewsWithText(otpViewList, "TC_Event_ElementOpt", View.FIND_VIEWS_WITH_TEXT);
+ sleep(2000);
+
+ for (View view : otpViewList) {
+ if (view instanceof WXTextView) {
+ final WXTextView optView = (WXTextView) view;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ optView.requestFocus();
+ optView.performClick();
+ Log.e(TAG, "TC_Event_ElementOpt clcik!!");
+
+ }
+ });
+ sleep(2000);
+ }
+
+ }
+
+
+ Log.e(TAG, "TC_Element_Opt_01_initialize snap!");
+ screenShot("TC_Event_ElementOpt_01_init");
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ ViewUtil util = new ViewUtil();
+ List<View> optListView = util.getAllChildViews(getActivity().findViewById(R.id.container));
+ //分别点击“文本1”一次,“文本1,点击我增加控件”一次,"文本2"两次,截图
+ for (View child : optListView) {
+ if (child instanceof WXTextView) {
+
+ String childValue = ((WXTextView) child).getText().toString();
+ Log.e(TAG, "opt child vaule : " + childValue);
+
+ if (childValue.equals("点击我,在我上方增加一个文本")) {
+ final WXTextView wenbenClickAndThenAddText = (WXTextView) child;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ wenbenClickAndThenAddText.requestFocus();
+ wenbenClickAndThenAddText.performClick();
+ Log.e(TAG, "文本1 click once!!");
+ }
+ });
+ sleep(2000);
+ }
+ }
+ }
+
+// setActivity(WXPageActivity.wxPageActivityInstance);
+ ViewUtil util1 = new ViewUtil();
+ List<View> optListView1 = util1.getAllChildViews(getActivity().findViewById(R.id.container));
+ //分别点击“文本1”一次,“文本1,点击我增加控件”一次,"文本2"两次,截图
+ for (View child1 : optListView1) {
+ if (child1 instanceof WXTextView) {
+
+ String childValue1 = ((WXTextView) child1).getText().toString();
+ Log.e(TAG, "opt child1 vaule : " + childValue1);
+
+ if (childValue1.equals("文本1,点击我增加控件")) {
+ Log.e(TAG, "childValue.equals(\"文本1,点击我增加控件\")");
+
+ final WXTextView wenbenClickAndThenAddText1 = (WXTextView) child1;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+
+ wenbenClickAndThenAddText1.setClickable(true);
+
+ wenbenClickAndThenAddText1.requestFocus();
+ wenbenClickAndThenAddText1.performClick();
+ Log.e(TAG, "文本1 click once!!");
+ }
+ });
+
+ sleep(3000);
+ }
+ }
+ }
+ /////////////////////////////////////////
+ optListView1 = util1.getAllChildViews(getActivity().findViewById(R.id.container));
+ for(View child : optListView1){
+ if (child instanceof WXTextView) {
+
+ String childValue = ((WXTextView) child).getText().toString();
+ Log.e(TAG, "点击我,在我下方增加一个文本 vaule : " + childValue);
+
+ if(childValue.equals("点击我,在我下方增加一个文本")){
+ Log.e(TAG, "childValue.equals(\"点击我,在我下方增加一个文本\")");
+
+ final WXTextView wenbenClickAndThenAddText1 = (WXTextView)child;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+
+ wenbenClickAndThenAddText1.setClickable(true);
+
+ wenbenClickAndThenAddText1.requestFocus();
+ wenbenClickAndThenAddText1.performClick();
+ wenbenClickAndThenAddText1.performClick();
+
+ Log.e(TAG, "点击我,在我下方增加一个文本 2!!");
+ }
+ });
+
+ sleep(3000);
+ screenShot("TC_Event_ElementOpt_02_addElements");
+ }
+ }
+ }
+ ////////////////////////////////////////////////////////
+ optListView1 = util1.getAllChildViews(getActivity().findViewById(R.id.container));
+ for(View child : optListView1){
+ if (child instanceof WXTextView) {
+
+ String childValue = ((WXTextView) child).getText().toString();
+ Log.e(TAG, "文本2,点击我自动消失 vaule : " + childValue);
+
+ if(childValue.equals("文本2,点击我自动消失")){
+ Log.e(TAG, "childValue.equals(\"文本2,点击我自动消失\")");
+
+ final WXTextView wenbenClickAndThenAddText1 = (WXTextView)child;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+
+ wenbenClickAndThenAddText1.setClickable(true);
+
+ wenbenClickAndThenAddText1.requestFocus();
+ wenbenClickAndThenAddText1.performClick();
+
+ Log.e(TAG, "文本2,点击我自动消失click 1!!");
+ }
+ });
+
+ sleep(3000);
+ screenShot("TC_Event_ElementOpt_03_removeElement");
+ }
+ }
+ }
+ ////////////////////////////////////////////////////////
+ optListView1 = util1.getAllChildViews(getActivity().findViewById(R.id.container));
+ for(View child : optListView1){
+ if (child instanceof WXTextView) {
+
+ String childValue = ((WXTextView) child).getText().toString();
+ Log.e(TAG, "文本2,点击我自动消失 vaule : " + childValue);
+
+ if(childValue.equals("文本2,点击我自动消失")){
+ Log.e(TAG, "childValue.equals(\"文本2,点击我自动消失\")");
+
+ final WXTextView wenbenClickAndThenAddText1 = (WXTextView)child;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+
+ wenbenClickAndThenAddText1.setClickable(true);
+
+ wenbenClickAndThenAddText1.requestFocus();
+ wenbenClickAndThenAddText1.performClick();
+
+ Log.e(TAG, "文本2,点击我自动消失click 1!!");
+ }
+ });
+
+ sleep(3000);
+ screenShot("TC_Event_ElementOpt_03_removeElement");
+ Log.e(TAG, "TC_Event_ElementOpt_03_removeElement snap!");
+ }
+ }
+ }
+ //////////////////////////////
+ optListView1 = util1.getAllChildViews(getActivity().findViewById(R.id.container));
+ for(View child : optListView1){
+ if (child instanceof WXTextView) {
+
+ String childValue = ((WXTextView) child).getText().toString();
+ Log.e(TAG, "点击测试Move方法 vaule : " + childValue);
+
+ if(childValue.equals("点击测试Move方法")){
+
+ Log.e(TAG, "点击测试Move方法 find");
+ final View wenbenClickAndThenAddText1 = child;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+
+ wenbenClickAndThenAddText1.setClickable(true);
+
+ wenbenClickAndThenAddText1.requestFocus();
+ wenbenClickAndThenAddText1.performClick();
+
+ Log.e(TAG, "点击测试Move方法click 1!!");
+ }
+ });
+
+ sleep(3000);
+
+ }
+ if(childValue.equals("点击我,改变背景颜色")){
+
+ Log.e(TAG, "点击我,改变背景颜色 find");
+ final View wenbenClickAndThenAddText1 = child;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+
+ wenbenClickAndThenAddText1.setClickable(true);
+
+ wenbenClickAndThenAddText1.requestFocus();
+ wenbenClickAndThenAddText1.performClick();
+
+ Log.e(TAG, "点击我,改变背景颜色 click!!");
+ }
+ });
+
+ sleep(3000);
+// screenShot("TC_Event_ElementOpt_04_finish");
+// Log.e(TAG, "TC_Event_ElementOpt_04_finish");
+ }
+ if(childValue.equals("点击我,applyEvent")){
+
+ Log.e(TAG, "点击我,applyEvent find");
+ final View wenbenClickAndThenAddText1 = child;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+
+ wenbenClickAndThenAddText1.setClickable(true);
+
+ wenbenClickAndThenAddText1.requestFocus();
+ wenbenClickAndThenAddText1.performClick();
+
+ Log.e(TAG, "点击我,applyEvent click 1!!");
+ }
+ });
+
+ sleep(3000);
+// screenShot("TC_Event_ElementOpt_04_finish");
+// Log.e(TAG, "TC_Event_ElementOpt_04_finish");
+ }
+
+ if(childValue.equals("点击我,removeEvent")){
+
+ Log.e(TAG, "点击我,removeEvent find");
+ final View wenbenClickAndThenAddText1 = child;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+
+ wenbenClickAndThenAddText1.setClickable(true);
+
+ wenbenClickAndThenAddText1.requestFocus();
+ wenbenClickAndThenAddText1.performClick();
+
+ Log.e(TAG, "点击我,removeEvent click 1!!");
+ }
+ });
+
+ sleep(3000);
+ screenShot("TC_Event_ElementOpt_04_finish");
+ Log.e(TAG, "TC_Event_ElementOpt_04_finish");
+ }
+
+ }
+ }
+
+ }
+
+ }
+ }
+
+
+
+ /**
+ * get tc list by text
+ * @param byText
+ * @return
+ * @throws InterruptedException
+ */
+ public ArrayList<View> getTestCaseListViewByText(String byText) throws InterruptedException {
+ Log.e("TestScript_Guide", "byText ==" + byText);
+
+ if(TextUtils.isEmpty(byText)){
+ return null;
+ }
+ ArrayList<View> outViews = new ArrayList<View>();
+ mViewGroup.findViewsWithText(outViews, byText, View.FIND_VIEWS_WITH_TEXT);
+
+ for (View view : outViews){
+ String viewText = ((WXTextView)view).getText().toString();
+ Log.e(TAG, "viewText ==" + viewText);
+
+ }
+ return outViews;
+ }
+
+ /**
+ * findMyCaseByText
+ */
+ public View findMyCaseByText(String caseText){
+ if (mCaseListIndexView.size() == 0) return null;
+
+ WXTextView view = null;
+ for(int i=0; i<mCaseListIndexView.size();i++){
+
+ view = (WXTextView)mCaseListIndexView.get(i);
+
+ if (view.getText().toString().toLowerCase().contains(caseText.toLowerCase())){
+ return view;
+ }
+
+ }
+ return view;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ sleep(2000);
+ try {
+ ScreenShot.shoot(WXPageActivity.wxPageActivityInstance, shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ sleep(2000);
+ }
+
+ public void setViewGroup(ViewGroup viewGroup){
+ mViewGroup = viewGroup;
+ }
+ public void addAllTargetView(String target){
+ int max = 6;
+ int count =0 ;
+ while (count < max){
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ mCaseListIndexView.addAll(mCaseListIndexView);
+ count ++;
+ }
+ }
+
+
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/util/Falcon.java b/android/playground/src/androidTest/java/com/alibaba/weex/util/Falcon.java
new file mode 100644
index 0000000..501b14a
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/util/Falcon.java
@@ -0,0 +1,330 @@
+/*
+ * 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.util;
+
+import android.app.Activity;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Matrix;
+import android.graphics.Rect;
+import android.os.Build;
+import android.os.Looper;
+import android.util.Log;
+import android.view.View;
+import android.view.WindowManager.LayoutParams;
+
+import java.io.*;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+
+import static android.graphics.Bitmap.Config.ARGB_8888;
+import static android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND;
+
+/**
+ * Utility class to take screenshots of activity screen
+ * With reference to open-source project Falcon
+ */
+public final class Falcon {
+ //region Constants
+
+ private static final String TAG = "Falcon";
+
+ //endregion
+
+ //region Public API
+
+ /**
+ * Takes screenshot of provided activity and saves it to provided file.
+ * File content will be overwritten if there is already some content.
+ *
+ * @param activity Activity of which the screenshot will be taken.
+ * @param toFile File where the screenshot will be saved.
+ * If there is some content it will be overwritten
+ * @throws UnableToTakeScreenshotException When there is unexpected error during taking screenshot
+ */
+ public static void takeScreenshot(Activity activity, File toFile) {
+ if (activity == null) {
+ throw new IllegalArgumentException("Parameter activity cannot be null.");
+ }
+
+ if (toFile == null) {
+ throw new IllegalArgumentException("Parameter toFile cannot be null.");
+ }
+
+ Bitmap bitmap = null;
+ try {
+ if (!toFile.exists()) {
+ toFile.createNewFile();
+ }
+ bitmap = takeBitmapUnchecked(activity);
+ writeBitmap(bitmap, toFile);
+ }
+ catch (Exception e) {
+ String message = "Unable to take screenshot to file " + toFile.getAbsolutePath()
+ + " of activity " + activity.getClass().getName();
+
+ Log.e(TAG, message, e);
+ throw new UnableToTakeScreenshotException(message, e);
+ }
+ finally {
+ if (bitmap != null) {
+ bitmap.recycle();
+ }
+ }
+
+ Log.d(TAG, "Screenshot captured to " + toFile.getAbsolutePath());
+ }
+
+ /**
+ * Takes screenshot of provided activity and puts it into bitmap.
+ *
+ * @param activity Activity of which the screenshot will be taken.
+ * @return Bitmap of what is displayed in activity.
+ * @throws UnableToTakeScreenshotException When there is unexpected error during taking screenshot
+ */
+ public static Bitmap takeScreenshotBitmap(Activity activity) {
+ if (activity == null) {
+ throw new IllegalArgumentException("Parameter activity cannot be null.");
+ }
+
+ try {
+ return takeBitmapUnchecked(activity);
+ }
+ catch (Exception e) {
+ String message = "Unable to take screenshot to bitmap of activity "
+ + activity.getClass().getName();
+
+ Log.e(TAG, message, e);
+ throw new UnableToTakeScreenshotException(message, e);
+ }
+ }
+
+
+ //endregion
+
+ //region Methods
+
+ private static Bitmap takeBitmapUnchecked(Activity activity) throws InterruptedException {
+ final List<ViewRootData> viewRoots = getRootViews(activity);
+ int statusBarHeight = ScreenShot.getStatusBarHeight1(activity);
+ int actionBarHeight = ScreenShot.getActionBarHeight(activity);
+
+ View main = activity.getWindow().getDecorView();
+ int mainWidth = main.getWidth();
+ int mainHeight = main.getHeight();
+
+ int baseWidth = 750;
+ float widthScale = ((float) baseWidth) / mainWidth;
+
+ // 新建立矩阵 按照宽度缩放因子自适应缩放
+ Matrix matrix = new Matrix();
+ matrix.postScale(widthScale, widthScale);
+
+ Bitmap bitmap1 = Bitmap.createBitmap(main.getWidth(), main.getHeight(), ARGB_8888);
+ final Bitmap bitmap = Bitmap.createBitmap(bitmap1, 0, statusBarHeight + actionBarHeight,
+ mainWidth, mainHeight - statusBarHeight - actionBarHeight, matrix, true);
+
+
+ // We need to do it in main thread
+ if (Looper.myLooper() == Looper.getMainLooper()) {
+ drawRootsToBitmap(viewRoots, bitmap);
+ } else {
+ final CountDownLatch latch = new CountDownLatch(1);
+ activity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ drawRootsToBitmap(viewRoots, bitmap);
+ }
+ finally {
+ latch.countDown();
+ }
+ }
+ });
+
+ latch.await();
+ }
+
+ return bitmap;
+ }
+
+ private static void drawRootsToBitmap(List<ViewRootData> viewRoots, Bitmap bitmap) {
+ for (ViewRootData rootData : viewRoots) {
+ drawRootToBitmap(rootData, bitmap);
+ }
+ }
+
+ private static void drawRootToBitmap(ViewRootData config, Bitmap bitmap) {
+ // now only dim supported
+ if ((config._layoutParams.flags & FLAG_DIM_BEHIND) == FLAG_DIM_BEHIND) {
+ Canvas dimCanvas = new Canvas(bitmap);
+
+ int alpha = (int) (255 * config._layoutParams.dimAmount);
+ dimCanvas.drawARGB(alpha, 0, 0, 0);
+ }
+
+ Canvas canvas = new Canvas(bitmap);
+ canvas.translate(config._winFrame.left, config._winFrame.top);
+ config._view.draw(canvas);
+ }
+
+ private static void writeBitmap(Bitmap bitmap, File toFile) throws IOException {
+ OutputStream outputStream = null;
+ try {
+
+ outputStream = new BufferedOutputStream(new FileOutputStream(toFile));
+ bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
+ }
+ finally {
+ if (outputStream != null) {
+ outputStream.close();
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked") // no way to check
+ private static List<ViewRootData> getRootViews(Activity activity) {
+ List<ViewRootData> rootViews = new ArrayList<>();
+
+ Object globalWindowManager;
+ if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
+ globalWindowManager = getFieldValue("mWindowManager", activity.getWindowManager());
+ } else {
+ globalWindowManager = getFieldValue("mGlobal", activity.getWindowManager());
+ }
+ Object rootObjects = getFieldValue("mRoots", globalWindowManager);
+ Object paramsObject = getFieldValue("mParams", globalWindowManager);
+
+ Object[] roots;
+ LayoutParams[] params;
+
+ // There was a change to ArrayList implementation in 4.4
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ roots = ((List) rootObjects).toArray();
+
+ List<LayoutParams> paramsList = (List<LayoutParams>) paramsObject;
+ params = paramsList.toArray(new LayoutParams[paramsList.size()]);
+ } else {
+ roots = (Object[]) rootObjects;
+ params = (LayoutParams[]) paramsObject;
+ }
+
+ for (int i = 0; i < roots.length; i++) {
+ Object root = roots[i];
+
+ Object attachInfo = getFieldValue("mAttachInfo", root);
+ int top = (int) getFieldValue("mWindowTop", attachInfo);
+ int left = (int) getFieldValue("mWindowLeft", attachInfo);
+
+ Rect winFrame = (Rect) getFieldValue("mWinFrame", root);
+ Rect area = new Rect(left, top, left + winFrame.width(), top + winFrame.height());
+
+ View view = (View) getFieldValue("mView", root);
+ rootViews.add(new ViewRootData(view, area, params[i]));
+ }
+
+ return rootViews;
+ }
+
+ private static Object getFieldValue(String fieldName, Object target) {
+ try {
+ return getFieldValueUnchecked(fieldName, target);
+ }
+ catch (Exception e) {
+ throw new UnableToTakeScreenshotException(e);
+ }
+ }
+
+ private static Object getFieldValueUnchecked(String fieldName, Object target)
+ throws NoSuchFieldException, IllegalAccessException {
+ Field field = findField(fieldName, target.getClass());
+
+ field.setAccessible(true);
+ return field.get(target);
+ }
+
+ private static Field findField(String name, Class clazz) throws NoSuchFieldException {
+ Class currentClass = clazz;
+ while (currentClass != Object.class) {
+ for (Field field : currentClass.getDeclaredFields()) {
+ if (name.equals(field.getName())) {
+ return field;
+ }
+ }
+
+ currentClass = currentClass.getSuperclass();
+ }
+
+ throw new NoSuchFieldException("Field " + name + " not found for class " + clazz);
+ }
+
+ //endregion
+
+ //region Constructors
+
+ // No instances
+ private Falcon() {
+ }
+
+ //endregion
+
+ //region Nested classes
+
+ /**
+ * Custom exception thrown if there is some exception thrown during
+ * screenshot capturing to enable better client code exception handling.
+ */
+ public static class UnableToTakeScreenshotException extends RuntimeException {
+ private UnableToTakeScreenshotException(String detailMessage, Exception exception) {
+ super(detailMessage, extractException(exception));
+ }
+
+ private UnableToTakeScreenshotException(Exception ex) {
+ super(extractException(ex));
+ }
+
+ /**
+ * Method to avoid multiple wrapping. If there is already our exception,
+ * just wrap the cause again
+ */
+ private static Throwable extractException(Exception ex) {
+ if (ex instanceof UnableToTakeScreenshotException) {
+ return ex.getCause();
+ }
+
+ return ex;
+ }
+ }
+
+ private static class ViewRootData {
+ private final View _view;
+ private final Rect _winFrame;
+ private final LayoutParams _layoutParams;
+
+ public ViewRootData(View view, Rect winFrame, LayoutParams layoutParams) {
+ _view = view;
+ _winFrame = winFrame;
+ _layoutParams = layoutParams;
+ }
+ }
+
+ //endregion
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/util/ScreenShot.java b/android/playground/src/androidTest/java/com/alibaba/weex/util/ScreenShot.java
new file mode 100644
index 0000000..b3561a3
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/util/ScreenShot.java
@@ -0,0 +1,390 @@
+/*
+ * 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.util;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Matrix;
+import android.graphics.Rect;
+import android.os.Build;
+import android.os.Environment;
+import android.support.annotation.Nullable;
+import android.support.design.widget.TabLayout;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+import android.util.TypedValue;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.widget.ScrollView;
+
+import com.taobao.weex.ui.view.WXScrollView;
+import com.taobao.weex.ui.view.listview.WXRecyclerView;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Created by huabing.thb on 15-10-27.
+ */
+public class ScreenShot {
+
+ public static View rootView;
+ public static ArrayList<View> allViews = new ArrayList<View>();
+ public static View firstScrollView = null;
+ public static View firstListView = null;
+
+ public static View findFirstScrollerByRootView(View rootView){
+
+ View firstScrollView = null;
+
+ if(null != rootView){
+ allViews = ViewUtil.getAllChildViews(rootView);
+ for (View view:allViews
+ ) {
+ if(view instanceof ScrollView){
+ firstScrollView = view;
+ break;
+ }
+ }
+ }
+ return firstScrollView;
+ }
+
+ public static View findFirstListByRootView(View rootView){
+ View firstListView = null;
+ if(null != rootView){
+ allViews = ViewUtil.getAllChildViews(rootView);
+ for (View view:allViews
+ ) {
+ if(view instanceof WXRecyclerView){
+ firstListView = view;
+ break;
+ }
+ }
+ }
+ return firstListView;
+ }
+
+ private static Bitmap doSanpForListOrScroller(View sanpView){
+
+ Bitmap b = null;
+
+ if(sanpView!=null){
+
+ int[] location = new int[2];
+ sanpView.getLocationInWindow(location);
+ int x = location[0];
+ int y = location[1];
+
+ sanpView = rootView;
+ sanpView.setDrawingCacheEnabled(true);
+ sanpView.buildDrawingCache();
+// sanpView = ((View)sanpView.getParent().getParent());
+ Bitmap bitmap = sanpView.getDrawingCache();
+
+// sanpView.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
+// View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
+// sanpView.layout(0, 0, sanpView.getMeasuredWidth(), sanpView.getMeasuredHeight());
+// sanpView.buildDrawingCache();
+// Bitmap bitmap = sanpView.getDrawingCache();
+// b = bitmap;
+
+
+ int sanpWidth = sanpView.getWidth();
+
+ Log.e("weex_test", "sanpView.getWidth=="+ sanpWidth);
+
+ int snapHeight = sanpView.getHeight();
+ Log.e("weex_test", "sanpView.getHeight==" + snapHeight);
+
+// bitmap = Bitmap.createBitmap(sanpWidth+x, snapHeight+x,Bitmap.Config.ARGB_8888);
+
+// int width = activity.getWindowManager().getDefaultDisplay().getWidth();
+// int height = activity.getWindowManager().getDefaultDisplay().getHeight();
+
+ int baseWidth = 750;
+ int baseHeight = 1134;
+
+ // 计算缩放因子
+// float heightScale = ((float) baseHeight) / scrollerHeight;
+ float widthScale = ((float) baseWidth) / sanpWidth;
+
+ // 新建立矩阵 按照宽度缩放因子自适应缩放
+ Matrix matrix = new Matrix();
+ matrix.postScale(widthScale, widthScale);
+
+ Log.e("weex_test", "widthScale=="+widthScale+ "|"+
+ "Real sanpWidth==" + sanpWidth*widthScale +"|" +
+ "Real snapHeight==" + widthScale*snapHeight +
+ "|" + "sanpView.x=" + x +
+ "|" + "sanpView.y= " + y);
+ b = Bitmap.createBitmap(bitmap, 0, 0, sanpWidth, snapHeight);
+// b = Bitmap.createBitmap(bitmap, 0, 0, rootView.getWidth(), rootView.getHeight());
+
+ // 缩放
+
+// Bitmap returnBmp = Bitmap.createBitmap((int) dw, (int) dh,
+// Bitmap.Config.ARGB_4444);
+
+ b = Bitmap.createBitmap(bitmap,0, 0,
+ sanpWidth, snapHeight, matrix, true);
+// b = Bitmap.createBitmap(bitmap, 0, 0, scrollerWidth,
+// scrollerHeight, matrix, true);
+// b = Bitmap.createBitmap(bitmap, 0, statusBarHeight + actionBarHeight, width,
+// height - statusBarHeight - actionBarHeight, matrix, true);
+
+ sanpView.destroyDrawingCache();
+
+ }else {
+ Log.e("weex_test", "snapshot view is " + sanpView);
+ }
+ return b;
+
+ }
+ // Gets the Activity screenshots, save to png file
+ private static Bitmap takeScreenShot(Activity activity) {
+
+ Context ctx = activity.getApplicationContext();
+ String screenShotDir = getWeexScreenShotDir(ctx);
+
+ View view = activity.getWindow().getDecorView();
+
+ rootView = view;
+ firstScrollView = findFirstScrollerByRootView(rootView);
+ firstListView = findFirstListByRootView(rootView);
+
+ Bitmap snapBitmap = null;
+ // 优先scroller ->list->root
+ if(null !=firstScrollView ){
+ snapBitmap = doSanpForListOrScroller(firstScrollView);
+ }
+ else {
+ Log.e("weex_test", "firstScrollView is " + firstScrollView);
+ if (null != firstListView){
+ snapBitmap = doSanpForListOrScroller(firstListView);
+ }else {
+ Log.e("weex_test", "firstListView is " + firstListView);
+
+ if(null != rootView){
+// snapBitmap = doSanpForListOrScroller(rootView);
+ }
+ }
+ }
+
+ return snapBitmap;
+
+ }
+
+ public static Bitmap convertViewToBitmap(View view){
+ view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
+ View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
+ view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
+ view.buildDrawingCache();
+ Bitmap bitmap = view.getDrawingCache();
+
+ return bitmap;
+ }
+
+ private static void savePic(Bitmap b, String strFileName) {
+ FileOutputStream fos = null;
+ try {
+ fos = new FileOutputStream(strFileName);
+ if (null != fos) {
+ b.compress(Bitmap.CompressFormat.PNG, 90, fos);
+ fos.flush();
+ fos.close();
+ }
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void saveToSD(Bitmap bmp, String dirName,String fileName) throws IOException {
+ if (Environment.getExternalStorageState().equals(
+ Environment.MEDIA_MOUNTED)) {
+ File dir = new File(dirName);
+ if(!dir.exists()){
+ dir.mkdirs();
+ }
+
+ File file = new File(dirName + fileName);
+ Log.d("AssetsFileUtil", dirName + fileName);
+ if (!file.exists()) {
+ file.createNewFile();
+ }
+
+ FileOutputStream fos = null;
+ try {
+ fos = new FileOutputStream(file);
+ if (fos != null) {
+ bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
+ fos.flush();
+ fos.close();
+ }
+ } catch (FileNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public static void shoot(Activity activity, String pathName) throws IOException {
+
+ if(SdCardHelper.isHasSdcard()){
+// ScreenShot.saveToSD(ScreenShot.takeScreenShot(activity), SdCardHelper.SDCardRoot + "WeexTest/ScreenShot/", pathName /*+System.currentTimeMillis()*/ + ".png");
+ ScreenShot.saveToSD(ScreenShot.takeScreenShot(activity),
+ getWeexScreenShotDir(activity.getApplicationContext()) + File.separator , pathName /*+System.currentTimeMillis()*/ + ".png");
+
+ }
+
+ }
+
+// public static void shootAllViews(Activity activity, String pathName) throws IOException {
+// ScreenShot.saveToSD(ScreenShot.takeScreenShotIncludeDialog(activity, pathName), "sdcard/WeexTest/ScreenShot/", pathName /*+System.currentTimeMillis()*/ + ".png");
+//
+// }
+
+ public static void takeScreenShotIncludeDialog(Activity activity, String file){
+ if (Environment.getExternalStorageState().equals(
+ Environment.MEDIA_MOUNTED)) {
+
+ File dir = new File(getWeexScreenShotDir(activity.getApplicationContext()) );
+ if(!dir.exists()){
+ dir.mkdirs();
+ }
+
+ File filePic = new File(getWeexScreenShotDir(activity.getApplicationContext()) +
+ File.separator + file + ".png");
+ if (!filePic.exists()) {
+ try {
+ filePic.createNewFile();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ Falcon.takeScreenshot(activity, filePic);
+
+ }
+
+ }
+
+ public static int getActionBarHeight(Activity activity) {
+ int actionBarHeight = 0;
+ if(activity.getActionBar()!= null){
+ actionBarHeight = activity.getActionBar().getHeight();
+ }
+
+ if (actionBarHeight != 0)
+ return actionBarHeight;
+
+ final TypedValue tv = new TypedValue();
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ if (activity.getTheme().resolveAttribute(android.support.v7.appcompat.R.attr.actionBarSize, tv, true)){
+ actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, activity.getResources().getDisplayMetrics());
+ Log.e("actionBarHeight==",actionBarHeight + "android.support.v7.appcompat.R.attr.actionBarSize");
+
+ }
+
+ else if (activity.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)){
+ actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, activity.getResources().getDisplayMetrics());
+ Log.e("actionBarHeight==",actionBarHeight + "actionBarHeight is android.R.attr.actionBarSize");
+
+ }
+ }
+
+ return actionBarHeight;
+ }
+
+ public static int getStatusBarHeight1(Activity activity){
+ int result = 0;
+ int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
+ if (resourceId > 0) {
+ result = activity.getResources().getDimensionPixelSize(resourceId);
+
+ }
+ Log.e("StatusBarHeight==", "StatusBar Height= " + result);
+
+ return result;
+ }
+ public static int getStatusBarHeight(Activity activity) {
+ int result = 0;
+ Rect rect = new Rect();
+ Window window = activity.getWindow();
+ if (window != null) {
+ window.getDecorView().getWindowVisibleDisplayFrame(rect);
+ View v = window.findViewById(Window.ID_ANDROID_CONTENT);
+
+ android.view.Display display = ((android.view.WindowManager) activity.getSystemService(activity.WINDOW_SERVICE)).getDefaultDisplay();
+
+ //return result title bar height
+ int result1 = display.getHeight() - v.getBottom() + rect.top;
+ int result2 = display.getHeight() - v.getBottom();
+ int result3 = v.getTop() - rect.top;
+ int result4 = display.getHeight() - v.getHeight();
+
+ Log.e("StatusBarHeight==", "result1== " + result1 +" result2 = " + result2 + "result3=" + result3 + "result4=" +result4 ) ;
+ }
+ return result;
+
+ }
+
+ /**
+ * getDiskCacheDir
+ * @param context
+ * @return
+ */
+ @Nullable
+ public static String getWeexScreenShotDir(Context context) {
+ if (context == null) {
+ return null;
+ }
+ String cachePath;
+ String extDir = "" ;
+
+ if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
+ || !Environment.isExternalStorageRemovable()) {
+ cachePath = context.getExternalCacheDir().getPath();
+ extDir = context.getExternalFilesDir(null).getPath();
+ File screenShotFileDir = new File(extDir, "WeexTest" + File.separator + "ScreenShot");
+ if (!screenShotFileDir.exists()){
+ screenShotFileDir.mkdirs();
+ }
+ return screenShotFileDir.getPath();
+// File file = new File(context.getExternalFilesDir(null), "DemoFile.jpg");
+
+
+ } else {
+ cachePath = context.getCacheDir().getPath();
+ }
+ Log.e("weex_test","cachePath==" + cachePath);
+ Log.e("weex_test","extDir==" + extDir);
+
+ return cachePath;
+ }
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/util/SdCardHelper.java b/android/playground/src/androidTest/java/com/alibaba/weex/util/SdCardHelper.java
new file mode 100644
index 0000000..571f6cb
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/util/SdCardHelper.java
@@ -0,0 +1,41 @@
+/*
+ * 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.util;
+
+import android.os.Environment;
+
+/**
+ * Created by admin on 16/4/25.
+ */
+public class SdCardHelper {
+ public static String SDCardRoot = Environment.getExternalStorageDirectory().getAbsolutePath() + "/";
+
+ /**
+ * sdcard check
+ * @return
+ */
+ public static boolean isHasSdcard(){
+ String status = Environment.getExternalStorageState();
+ if (status.equals(Environment.MEDIA_MOUNTED)) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/util/TestFlow.java b/android/playground/src/androidTest/java/com/alibaba/weex/util/TestFlow.java
new file mode 100644
index 0000000..9a633a6
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/util/TestFlow.java
@@ -0,0 +1,448 @@
+/*
+ * 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.util;
+
+import android.app.Activity;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.TouchUtils;
+import android.text.method.Touch;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.EditText;
+import android.widget.FrameLayout;
+import android.widget.ScrollView;
+import android.widget.TextView;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.WeappJsBaseTestCase;
+import com.alibaba.weex.constants.Constants;
+import com.taobao.weex.devtools.inspector.elements.ObjectDescriptor;
+import com.taobao.weex.ui.view.WXTextView;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Created by admin on 16/7/20.
+ */
+public class TestFlow extends ActivityInstrumentationTestCase2<WXPageActivity>{
+
+ private WeappJsBaseTestCase weappApplication;
+ private Instrumentation mInstrumentation;
+ private WXPageActivity waTestPageActivity;
+ private final static String TAG = "TestFlow";
+ private ViewGroup mViewGroup;
+ private ArrayList<View> mCaseListIndexView;
+ private WXPageActivity activity2;
+ private TreeMap testMap = new TreeMap();
+ private int stepCountFlag = 0;
+ private int allRoundFound = 5;
+ int maxStep = 16;
+ int topCount = 10;
+ private boolean childCaseFound = false;
+
+
+ public TestFlow(Class<WXPageActivity> activityClass) {
+ super(activityClass);
+ }
+
+
+ /**
+ * get tc list
+ * @throws InterruptedException
+ */
+ @Before
+ public void setUp() throws InterruptedException {
+ setActivityInitialTouchMode(false);
+ weappApplication = new WeappJsBaseTestCase();
+ mInstrumentation = getInstrumentation();
+
+ if(mInstrumentation == null){
+
+ mInstrumentation = this.getInstrumentation();
+ }
+ Intent intent = new Intent();
+ intent.putExtra("bundleUrl", Constants.BUNDLE_URL);
+ launchActivityWithIntent("com.alibaba.weex", WXPageActivity.class, intent);
+ waTestPageActivity = getActivity();
+ Log.e(TAG, "activity1=" + waTestPageActivity.toString());
+ Thread.sleep(3000);
+
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ setViewGroup(mViewGroup);
+ // 根据TC 获取TC 列表,默认“"TC_"”
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, "AG_");
+
+// addAllTargetView("AG_");
+
+ Thread.sleep(1000);
+ }
+
+ /**
+ * firstTCChildInCompnnet item
+ * like "TC_AHref"
+ *
+ * map
+ * {"testComponet" : "TC_AHref",
+ * "testChildCaseInit": "TC_AHref_Event"
+ * "Step1" : "Hello Weex"
+ * "Step2" : "Hello Weex2"
+ * "Step3" : "Hello Weex3"
+
+ * }
+ *
+ */
+ @Test
+ public void testByTestMap() {
+ for (final View caseView : mCaseListIndexView) {
+
+ String caseViewName = ((WXTextView) caseView).getText().toString();
+ String testComponet = (String)getTestMap().get("testComponet");
+ Log.e(TAG, "caseViewName==" + caseViewName + "==testComponet==" + testComponet);
+
+ if (caseViewName.equals(testComponet)) {
+
+ final WXTextView inputView = (WXTextView) caseView;
+ if(inputView.getVisibility()== View.VISIBLE){
+ Log.e(TAG, "Child Case Found!!");
+ childCaseFound = true;
+ }else{
+ Log.e(TAG, "上下滑动一圈都没有找到!!");
+ while(allRoundFound >0 && inputView.getVisibility()== View.INVISIBLE){
+ findChildCase(inputView);
+ allRoundFound --;
+ }
+ }
+
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ inputView.requestFocus();
+ inputView.performClick();
+ }
+ });
+
+ sleep(1000);
+
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+ Log.e(TAG, "activity2 = " + activity2.toString());
+
+ ViewGroup myGroup = (ViewGroup) (activity2.findViewById(R.id.container));
+ Log.e(TAG, myGroup.toString());
+
+ String childCaseName = (String)testMap.get("testChildCaseInit");
+ Log.e(TAG, "testChildCaseInit to find==" + childCaseName);
+ ArrayList<View> inputListView = new ArrayList<View>();
+ inputListView = ViewUtil.findViewWithText(myGroup,
+ childCaseName);
+ sleep(1000);
+// View scrollableView = ViewUtil.getFirstChildScrollableView(myGroup);
+
+ int findCount = 0;
+ while(inputListView.size() == 0 ){
+
+// TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+// sleep(2000);
+
+ if(findCount< maxStep){
+ Log.e(TAG, "inputListView size=" + inputListView.size()+"," + "findCount=" + findCount);
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ sleep(1000);
+ myGroup = (ViewGroup) (activity2.findViewById(R.id.container));
+ inputListView = ViewUtil.findViewWithText(myGroup,
+ childCaseName);
+ sleep(1000);
+ findCount ++ ;
+
+ }else {
+ while(topCount>0){
+ if(inputListView.size() == 0){
+ TouchUtils.dragQuarterScreenDown(this, this.getActivity());
+ sleep(1000);
+ myGroup = (ViewGroup) (activity2.findViewById(R.id.container));
+ inputListView = ViewUtil.findViewWithText(myGroup,
+ childCaseName);
+ sleep(1000);
+ }
+ topCount --;
+ }
+ assertNotSame("Child Case Not Found!!",0 ,inputListView.size());
+ break;
+ }
+ }
+// else{
+// Log.e(TAG, "inputListView size==" +
+// inputListView.size() + "findCount=="+findCount);
+//
+// }
+
+
+ if (inputListView.size() != 0) {
+ final WXTextView inputTypeView = (WXTextView) inputListView.get(0);
+ stepCountFlag ++;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ Log.e(TAG, "find veiw text=" + inputTypeView.getText().toString());
+ inputTypeView.requestFocus();
+ inputTypeView.performClick();
+ Log.e(TAG, "child clcik!");
+ }
+ });
+
+ sleep(1000);
+ }
+
+ TreeMap testStepMap = new TreeMap();
+
+ testStepMap = (TreeMap)testMap.clone();
+ testStepMap.remove("testComponet");
+ testStepMap.remove("testChildCaseInit");
+
+ Iterator iter = testStepMap.entrySet().iterator();
+ Log.e(TAG,"testStepMap keyset==" + testStepMap.keySet().toString());
+
+ while (iter.hasNext()) {
+ stepCountFlag ++;
+ TreeMap.Entry entry = (TreeMap.Entry) iter.next();
+ Object testStepkey = entry.getKey();
+ Log.e(TAG,"testStepMap testStepkey==" + testStepkey.toString());
+
+ Object testStepValue = entry.getValue();
+ Log.e(TAG,"testStepMap testStepValue==" + testStepValue.toString());
+
+ testStep(testStepkey, testStepValue);
+
+ }
+
+ break;
+ }
+ }
+
+ }
+
+ private void findChildCase(final WXTextView inputView ){
+ // handle if the view is INVISIBLE then scrollToBottom
+// int maxStep = 10;
+ int scrollCount = 0;
+ if(inputView.getVisibility() == View.INVISIBLE){
+ while(scrollCount <maxStep){
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ sleep(1000);
+ scrollCount ++;
+ }
+ }
+// int topCount = 10;
+ if(inputView.getVisibility() == View.INVISIBLE){
+ while(topCount>0 && (inputView.getVisibility() == View.INVISIBLE)){
+ TouchUtils.dragQuarterScreenDown(this, this.getActivity());
+ sleep(1000);
+ topCount--;
+ }
+ }
+
+ }
+
+ public void afterTest(ArrayList viewList){
+ Log.e(TAG,"===do test after===");
+ sleep(2000);
+
+ }
+
+ public void testStep(Object testStepkey, Object testStepValue) {
+
+ TreeMap testSteps = (TreeMap) testStepValue;
+ Iterator iter = testSteps.entrySet().iterator();
+ Log.e(TAG,"testSteps keyset==" + testSteps.keySet().toString());
+
+ while (iter.hasNext()) {
+ TreeMap.Entry entry = (TreeMap.Entry) iter.next();
+ Object testStepAction = entry.getKey();
+ Log.e(TAG,"testSteps testStepAction==" + testStepAction.toString());
+
+ Object testStepActionValue = entry.getValue();
+ Log.e(TAG,"testSteps testStepActionValue==" + testStepActionValue.toString());
+
+ testAction(testStepAction, testStepActionValue);
+ }
+
+ }
+
+ private void testAction(Object testStepAction, Object testStepActionValue){
+ String action = (String)testStepAction;
+ String actionValue = (String)testStepActionValue;
+
+ if(action.equals("click")){
+ doClickAction(action, actionValue);
+ }
+// sleep(1000);
+
+ if(action.equals("screenshot")){
+ doScreenShotAction(actionValue);
+ }
+
+
+ }
+ private void doScreenShotAction (String name){
+ screenShot(name);
+ sleep(1000);
+ }
+ private void doClickAction(String action, String actionValue){
+ setActivity(WXPageActivity.wxPageActivityInstance);
+ Activity activity2 = getActivity();
+ Log.e(TAG, "activity2 = " + activity2.toString());
+
+ ViewGroup myGroup = (ViewGroup) (activity2.findViewById(R.id.container));
+ ArrayList<View> inputListView11 = new ArrayList<View>();
+ sleep(2000);
+
+ inputListView11 = ViewUtil.getAllChildViews(myGroup);
+
+ for (View view : inputListView11) {
+ if (view instanceof WXTextView) {
+ String text = ((WXTextView) view).getText().toString();
+ Log.e(TAG, " doClickAction text===" + text);
+ if (text.contains(actionValue)) {
+ float viewY= view.getY();
+ float viewX = view.getX();
+ Log.e(TAG,"viewY==" + viewY);
+ Log.e(TAG,"viewX==" + viewX);
+
+ final View clickView = view;
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ Log.e(TAG, "find veiw text=" + ((WXTextView)clickView).getText().toString());
+ clickView.requestFocus();
+ clickView.performClick();
+ Log.e(TAG, "child clcik!");
+ }
+ });
+// if (view instanceof EditText){
+// view.performClick();
+// }else {
+// TouchUtils.clickView(this, view);
+// }
+ sleep(1000);
+ Log.e(TAG,"clickView==" );
+
+
+// final FrameLayout aView = (FrameLayout) view.getParent();
+// TouchUtils.clickView(this, aView);
+// Log.e(TAG,"clickaView==" );
+//
+// mInstrumentation.runOnMainSync(new Runnable() {
+// @Override
+// public void run() {
+// aView.requestFocus();
+// aView.performClick();
+// Log.e(TAG, "do click ");
+//
+// }
+// });
+
+ break;
+ }
+ }
+
+ }
+ }
+
+ public void setViewGroup(ViewGroup viewGroup) {
+ this.mViewGroup = viewGroup;
+ }
+
+ /**
+ * sleep
+ */
+ public void sleep(long time){
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * snapshot
+ */
+ public void screenShot(String shotName) {
+ try {
+ ScreenShot.shoot(getActivity(), shotName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setTestMap(TreeMap testStepMap) {
+ this.testMap = testStepMap;
+ }
+
+ public TreeMap getTestMap(){
+ return testMap;
+ }
+
+ /**
+ *
+ */
+ public void setUpToFindComponet(String targert){
+ int max = 60;
+ int count = 0;
+ while(mCaseListIndexView.size() == 0){
+
+ if (count < max){
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, targert);
+ count ++;
+ }
+ else{
+ break;
+ }
+
+ }
+ }
+
+ public void addAllTargetView(String target){
+ int max = 6;
+ int count =0 ;
+ while (count < max){
+ TouchUtils.dragQuarterScreenUp(this, this.getActivity());
+ sleep(500);
+ mViewGroup = (ViewGroup) waTestPageActivity.findViewById(R.id.container);
+ mCaseListIndexView = ViewUtil.findViewWithText(mViewGroup, target);
+ mCaseListIndexView.addAll(mCaseListIndexView);
+ count ++;
+ }
+ }
+}
diff --git a/android/playground/src/androidTest/java/com/alibaba/weex/util/ViewUtil.java b/android/playground/src/androidTest/java/com/alibaba/weex/util/ViewUtil.java
new file mode 100644
index 0000000..c87e871
--- /dev/null
+++ b/android/playground/src/androidTest/java/com/alibaba/weex/util/ViewUtil.java
@@ -0,0 +1,166 @@
+/*
+ * 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.util;
+
+import android.app.Activity;
+import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.test.InstrumentationTestCase;
+import android.test.TouchUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.EditText;
+import android.widget.ScrollView;
+
+import com.taobao.weex.ui.view.WXTextView;
+
+import java.util.ArrayList;
+
+/**
+ * Created by admin on 16/3/29.
+ */
+public class ViewUtil{
+
+
+ public static ArrayList<View> findViewWithText(ViewGroup vg, String text){
+ ArrayList<View> out = new ArrayList<View>();
+ if(null != vg && !TextUtils.isEmpty(text)){
+ vg.findViewsWithText(out, text, View.FIND_VIEWS_WITH_TEXT);
+ }
+
+ if(out.size() == 0){
+ ArrayList<View> wxTextViewList = new ArrayList<View>();
+ wxTextViewList = getAllChildViews((View)vg);
+ for (View wxText:wxTextViewList) {
+ if(wxText instanceof WXTextView){
+ String value = ((WXTextView) wxText).getText().toString();
+ if(value.contains(text)){
+ Log.e("TestFlow", "find target:" + text + "|" + "actualVale=" + value);
+ out.add(wxText);
+ }
+
+ }
+ }
+ }
+ return out;
+ }
+
+ public static ArrayList<View> getAllChildViews(Activity activity) {
+ View view = activity.getWindow().getDecorView();
+ return getAllChildViews(view);
+ }
+
+ public static ArrayList<View> getAllChildViews(View view) {
+ ArrayList<View> allchildren = new ArrayList<View>();
+ if (view instanceof ViewGroup) {
+ ViewGroup vp = (ViewGroup) view;
+ for (int i = 0; i < vp.getChildCount(); i++) {
+ View viewchild = vp.getChildAt(i);
+ allchildren.add(viewchild);
+ allchildren.addAll(getAllChildViews(viewchild));
+ }
+
+ }
+ return allchildren;
+ }
+
+ public static ArrayList<View> getAllChildViews(ViewGroup view) {
+ ArrayList<View> allchildren = new ArrayList<View>();
+
+ ViewGroup vp = view;
+ for (int i = 0; i < vp.getChildCount(); i++) {
+ View viewchild = vp.getChildAt(i);
+ allchildren.add(viewchild);
+ allchildren.addAll(getAllChildViews(viewchild));
+ }
+
+ return allchildren;
+ }
+
+ /**
+ * scroller or RecyclerView
+ * @param view
+ * @return
+ */
+ public static View getFirstChildScrollableView(ViewGroup view){
+
+
+ View viewResult = null;
+ ArrayList<View> allViews = new ArrayList<View>();
+ if(null != view){
+
+ allViews= getAllChildViews(view);
+ for(View eachView : allViews){
+ if(eachView instanceof ScrollView
+ || eachView instanceof RecyclerView){
+
+ return eachView;
+
+ }
+ }
+ }
+ return viewResult;
+ }
+
+
+ public static ArrayList<View> getAllEditTextViews(View view) {
+ ArrayList<View> allchildren = new ArrayList<View>();
+ if (view instanceof ViewGroup) {
+ ViewGroup vp = (ViewGroup) view;
+ for (int i = 0; i < vp.getChildCount(); i++) {
+ View viewchild = vp.getChildAt(i);
+ if(viewchild instanceof EditText){
+ allchildren.add(viewchild);
+ allchildren.addAll(getAllChildViews(viewchild));
+ }
+ }
+ }
+ return allchildren;
+ }
+
+ /*
+ * 获取控件宽
+ */
+ public static int getWidth(View view)
+ {
+ int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
+ int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
+ view.measure(w, h);
+ return (view.getMeasuredWidth());
+ }
+ /*
+ * 获取控件高
+ */
+ public static int getHeight(View view)
+ {
+ int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
+ int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
+ view.measure(w, h);
+ return (view.getMeasuredHeight());
+ }
+
+ public static void dragQuarterScreenUp(InstrumentationTestCase test, Activity activity) {
+
+ TouchUtils.dragQuarterScreenUp(test, activity);
+ }
+
+
+}
diff --git a/android/playground/src/main/AndroidManifest.xml b/android/playground/src/main/AndroidManifest.xml
new file mode 100755
index 0000000..de7c3db
--- /dev/null
+++ b/android/playground/src/main/AndroidManifest.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ package="com.alibaba.weex">
+
+ <uses-permission android:name="android.permission.INTERNET"/>
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+ <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
+ <uses-permission android:name="android.permission.CAMERA"/>
+ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+ <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
+ <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
+ <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW"/>
+ <uses-permission android:name="android.permission.VIBRATE"/>
+ <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
+ <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
+ <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
+
+ <uses-feature android:name="android.hardware.camera"/>
+ <uses-feature android:name="android.hardware.camera.autofocus"/>
+
+ <application
+ android:name=".WXApplication"
+ android:allowBackup="false"
+ android:icon="@mipmap/ic_launcher"
+ android:label="@string/app_name"
+ android:supportsRtl="true"
+ android:theme="@style/AppTheme"
+ tools:overrideLibrary="com.taobao.android.dexposed">
+ <uses-library android:name="android.test.runner"/>
+
+ <receiver
+ android:name=".util.CoverageDataDumper"
+ tools:ignore="ExportedReceiver">
+ <intent-filter>
+ <action android:name="com.taobao.weex.DUMP_COVERAGE_DATA"/>
+ </intent-filter>
+ </receiver>
+
+ <activity
+ android:name=".SplashActivity"
+ android:configChanges="orientation|keyboardHidden|screenSize"
+ android:label="@string/app_name"
+ android:screenOrientation="portrait"
+ android:theme="@style/FullscreenTheme">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN"/>
+
+ <category android:name="android.intent.category.LAUNCHER"/>
+ </intent-filter>
+ </activity>
+ <activity
+ android:name=".IndexActivity"
+ android:label="@string/app_name"
+ android:screenOrientation="portrait"
+ android:theme="@style/AppTheme.NoActionBar">
+ </activity>
+ <activity
+ android:name=".WXPageActivity"
+ android:label="@string/app_name"
+ android:screenOrientation="portrait"
+ android:theme="@style/AppTheme.NoActionBar">
+ <intent-filter>
+ <action android:name="com.taobao.android.intent.action.WEEX"/>
+
+ <category android:name="android.intent.category.DEFAULT"/>
+ <category android:name="com.taobao.android.intent.category.WEEX"/>
+ <action android:name="android.intent.action.VIEW"/>
+
+ <data android:scheme="http"/>
+ <data android:scheme="https"/>
+ <data android:scheme="file"/>
+ <data android:scheme="wxpage" />
+ </intent-filter>
+ </activity>
+ <activity
+ android:name="com.google.zxing.client.android.CaptureActivity"
+ android:clearTaskOnLaunch="true"
+ android:screenOrientation="portrait"
+ android:stateNotNeeded="true"
+ android:theme="@style/CaptureTheme"
+ android:windowSoftInputMode="stateAlwaysHidden">
+ <intent-filter>
+ <action android:name="com.google.zxing.client.android.SCAN"/>
+
+ <category android:name="android.intent.category.DEFAULT"/>
+ </intent-filter>
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW"/>
+
+ <category android:name="android.intent.category.DEFAULT"/>
+ <category android:name="android.intent.category.BROWSABLE"/>
+
+ <data android:host="zxing.appspot.com" android:path="/scan" android:scheme="http"/>
+ </intent-filter>
+ </activity>
+ <activity
+ android:name="com.google.zxing.client.android.history.HistoryActivity"
+ android:label="@string/history_title"
+ android:stateNotNeeded="true"/>
+ <activity android:name="com.alibaba.weex.BenchmarkActivity"
+ android:screenOrientation="portrait"/>
+
+ <activity android:name=".SliceTestActivity"
+ android:exported="true"
+ android:screenOrientation="portrait">
+ </activity>
+
+ <service
+ android:name=".update.UpdateService"
+ android:exported="false" />
+
+ <provider
+ android:name="android.support.v4.content.FileProvider"
+ android:authorities="com.alibaba.weex.fileprovider"
+ android:grantUriPermissions="true"
+ android:exported="false">
+ <meta-data
+ android:name="android.support.FILE_PROVIDER_PATHS"
+ android:resource="@xml/filepaths" />
+ </provider>
+
+ </application>
+
+</manifest>
\ No newline at end of file
diff --git a/android/playground/src/main/assets/about.weex.js b/android/playground/src/main/assets/about.weex.js
new file mode 100644
index 0000000..c685047
--- /dev/null
+++ b/android/playground/src/main/assets/about.weex.js
@@ -0,0 +1,3309 @@
+// { "framework": "Vue" }
+"use weex:vue";
+
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 38);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports) {
+
+// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
+var global = module.exports = typeof window != 'undefined' && window.Math == Math
+ ? window : typeof self != 'undefined' && self.Math == Math ? self
+ // eslint-disable-next-line no-new-func
+ : Function('return this')();
+if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var anObject = __webpack_require__(10);
+var IE8_DOM_DEFINE = __webpack_require__(30);
+var toPrimitive = __webpack_require__(17);
+var dP = Object.defineProperty;
+
+exports.f = __webpack_require__(2) ? Object.defineProperty : function defineProperty(O, P, Attributes) {
+ anObject(O);
+ P = toPrimitive(P, true);
+ anObject(Attributes);
+ if (IE8_DOM_DEFINE) try {
+ return dP(O, P, Attributes);
+ } catch (e) { /* empty */ }
+ if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
+ if ('value' in Attributes) O[P] = Attributes.value;
+ return O;
+};
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// Thank's IE8 for his funny defineProperty
+module.exports = !__webpack_require__(11)(function () {
+ return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
+});
+
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports) {
+
+var hasOwnProperty = {}.hasOwnProperty;
+module.exports = function (it, key) {
+ return hasOwnProperty.call(it, key);
+};
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports) {
+
+var core = module.exports = { version: '2.5.7' };
+if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dP = __webpack_require__(1);
+var createDesc = __webpack_require__(12);
+module.exports = __webpack_require__(2) ? function (object, key, value) {
+ return dP.f(object, key, createDesc(1, value));
+} : function (object, key, value) {
+ object[key] = value;
+ return object;
+};
+
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// to indexed object, toObject with fallback for non-array-like ES3 strings
+var IObject = __webpack_require__(51);
+var defined = __webpack_require__(15);
+module.exports = function (it) {
+ return IObject(defined(it));
+};
+
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var store = __webpack_require__(21)('wks');
+var uid = __webpack_require__(13);
+var Symbol = __webpack_require__(0).Symbol;
+var USE_SYMBOL = typeof Symbol == 'function';
+
+var $exports = module.exports = function (name) {
+ return store[name] || (store[name] =
+ USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
+};
+
+$exports.store = store;
+
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports) {
+
+module.exports = function (it) {
+ return typeof it === 'object' ? it !== null : typeof it === 'function';
+};
+
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports) {
+
+module.exports = true;
+
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(8);
+module.exports = function (it) {
+ if (!isObject(it)) throw TypeError(it + ' is not an object!');
+ return it;
+};
+
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports) {
+
+module.exports = function (exec) {
+ try {
+ return !!exec();
+ } catch (e) {
+ return true;
+ }
+};
+
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports) {
+
+module.exports = function (bitmap, value) {
+ return {
+ enumerable: !(bitmap & 1),
+ configurable: !(bitmap & 2),
+ writable: !(bitmap & 4),
+ value: value
+ };
+};
+
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports) {
+
+var id = 0;
+var px = Math.random();
+module.exports = function (key) {
+ return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
+};
+
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports) {
+
+// 7.1.4 ToInteger
+var ceil = Math.ceil;
+var floor = Math.floor;
+module.exports = function (it) {
+ return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
+};
+
+
+/***/ }),
+/* 15 */
+/***/ (function(module, exports) {
+
+// 7.2.1 RequireObjectCoercible(argument)
+module.exports = function (it) {
+ if (it == undefined) throw TypeError("Can't call method on " + it);
+ return it;
+};
+
+
+/***/ }),
+/* 16 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(0);
+var core = __webpack_require__(4);
+var ctx = __webpack_require__(47);
+var hide = __webpack_require__(5);
+var has = __webpack_require__(3);
+var PROTOTYPE = 'prototype';
+
+var $export = function (type, name, source) {
+ var IS_FORCED = type & $export.F;
+ var IS_GLOBAL = type & $export.G;
+ var IS_STATIC = type & $export.S;
+ var IS_PROTO = type & $export.P;
+ var IS_BIND = type & $export.B;
+ var IS_WRAP = type & $export.W;
+ var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
+ var expProto = exports[PROTOTYPE];
+ var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];
+ var key, own, out;
+ if (IS_GLOBAL) source = name;
+ for (key in source) {
+ // contains in native
+ own = !IS_FORCED && target && target[key] !== undefined;
+ if (own && has(exports, key)) continue;
+ // export native or passed
+ out = own ? target[key] : source[key];
+ // prevent global pollution for namespaces
+ exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
+ // bind timers to global for call from export context
+ : IS_BIND && own ? ctx(out, global)
+ // wrap global constructors for prevent change them in library
+ : IS_WRAP && target[key] == out ? (function (C) {
+ var F = function (a, b, c) {
+ if (this instanceof C) {
+ switch (arguments.length) {
+ case 0: return new C();
+ case 1: return new C(a);
+ case 2: return new C(a, b);
+ } return new C(a, b, c);
+ } return C.apply(this, arguments);
+ };
+ F[PROTOTYPE] = C[PROTOTYPE];
+ return F;
+ // make static versions for prototype methods
+ })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
+ // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
+ if (IS_PROTO) {
+ (exports.virtual || (exports.virtual = {}))[key] = out;
+ // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
+ if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);
+ }
+ }
+};
+// type bitmap
+$export.F = 1; // forced
+$export.G = 2; // global
+$export.S = 4; // static
+$export.P = 8; // proto
+$export.B = 16; // bind
+$export.W = 32; // wrap
+$export.U = 64; // safe
+$export.R = 128; // real proto method for `library`
+module.exports = $export;
+
+
+/***/ }),
+/* 17 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.1 ToPrimitive(input [, PreferredType])
+var isObject = __webpack_require__(8);
+// instead of the ES6 spec version, we didn't implement @@toPrimitive case
+// and the second argument - flag - preferred type is a string
+module.exports = function (it, S) {
+ if (!isObject(it)) return it;
+ var fn, val;
+ if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+ if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;
+ if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+ throw TypeError("Can't convert object to primitive value");
+};
+
+
+/***/ }),
+/* 18 */
+/***/ (function(module, exports) {
+
+module.exports = {};
+
+
+/***/ }),
+/* 19 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.14 / 15.2.3.14 Object.keys(O)
+var $keys = __webpack_require__(34);
+var enumBugKeys = __webpack_require__(22);
+
+module.exports = Object.keys || function keys(O) {
+ return $keys(O, enumBugKeys);
+};
+
+
+/***/ }),
+/* 20 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var shared = __webpack_require__(21)('keys');
+var uid = __webpack_require__(13);
+module.exports = function (key) {
+ return shared[key] || (shared[key] = uid(key));
+};
+
+
+/***/ }),
+/* 21 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var core = __webpack_require__(4);
+var global = __webpack_require__(0);
+var SHARED = '__core-js_shared__';
+var store = global[SHARED] || (global[SHARED] = {});
+
+(module.exports = function (key, value) {
+ return store[key] || (store[key] = value !== undefined ? value : {});
+})('versions', []).push({
+ version: core.version,
+ mode: __webpack_require__(9) ? 'pure' : 'global',
+ copyright: '© 2018 Denis Pushkarev (zloirock.ru)'
+});
+
+
+/***/ }),
+/* 22 */
+/***/ (function(module, exports) {
+
+// IE 8- don't enum bug keys
+module.exports = (
+ 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
+).split(',');
+
+
+/***/ }),
+/* 23 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var def = __webpack_require__(1).f;
+var has = __webpack_require__(3);
+var TAG = __webpack_require__(7)('toStringTag');
+
+module.exports = function (it, tag, stat) {
+ if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });
+};
+
+
+/***/ }),
+/* 24 */
+/***/ (function(module, exports, __webpack_require__) {
+
+exports.f = __webpack_require__(7);
+
+
+/***/ }),
+/* 25 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(0);
+var core = __webpack_require__(4);
+var LIBRARY = __webpack_require__(9);
+var wksExt = __webpack_require__(24);
+var defineProperty = __webpack_require__(1).f;
+module.exports = function (name) {
+ var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
+ if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });
+};
+
+
+/***/ }),
+/* 26 */
+/***/ (function(module, exports) {
+
+exports.f = {}.propertyIsEnumerable;
+
+
+/***/ }),
+/* 27 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.fetchNews = exports.fetchDoodle = exports.readAbout = exports.saveAbout = exports.fetchAbout = exports.readGuide = exports.saveGuide = exports.fetchGuide = exports.readExamples = exports.saveExamples = exports.fetchExamples = undefined;
+
+var _stringify = __webpack_require__(41);
+
+var _stringify2 = _interopRequireDefault(_stringify);
+
+var _typeof2 = __webpack_require__(28);
+
+var _typeof3 = _interopRequireDefault(_typeof2);
+
+exports.createLink = createLink;
+exports.createURL = createURL;
+exports.i18n = i18n;
+exports.parseLanguage = parseLanguage;
+exports.setLanguage = setLanguage;
+exports.clearStorageLanguage = clearStorageLanguage;
+exports.getStorageLanguage = getStorageLanguage;
+exports.getSystemLanguage = getSystemLanguage;
+exports.getLanguage = getLanguage;
+exports.jumpTo = jumpTo;
+exports.viewSource = viewSource;
+exports.setTitleBar = setTitleBar;
+exports.fetchData = fetchData;
+exports.saveData = saveData;
+exports.readData = readData;
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var stream = weex.requireModule('stream');
+var storage = weex.requireModule('storage');
+var navigator = weex.requireModule('navigator');
+
+var encoder = typeof encodeURIComponent === 'function' ? encodeURIComponent : typeof encodeURI === 'function' ? encodeURI : function (x) {
+ return x;
+};
+
+function encodeParams(params) {
+ if (!params || (typeof params === 'undefined' ? 'undefined' : (0, _typeof3.default)(params)) !== 'object') {
+ return '';
+ }
+ var array = [];
+ for (var key in params) {
+ if (typeof params[key] === 'string') {
+ array.push(encoder(key) + '=' + encoder(params[key]));
+ }
+ }
+ return array.join('&');
+}
+
+function createLink(name) {
+ var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var args = [];
+ for (var key in params) {
+ if (typeof params[key] === 'string') {
+ args.push(encoder(key) + '=' + encoder(params[key]));
+ }
+ }
+ if (WXEnvironment.platform === 'Web') {
+ args.unshift('page=' + name + '.web.js');
+ return '/?' + args.join('&');
+ }
+ var base = getBaseURL();
+ return '' + base + name + '.weex.js' + (args.length ? '?' + args.join('&') : '');
+}
+
+function createURL(hash, params) {
+ if (WXEnvironment.platform === 'Web') {
+ return 'http://dotwe.org/raw/htmlVue/' + hash;
+ }
+ var url = 'http://dotwe.org/raw/dist/' + hash + '.bundle.wx';
+ var paramString = encodeParams(params);
+ if (WXEnvironment.appName === 'TB') {
+ return url + '?_wx_tpl=' + url + '&' + paramString;
+ }
+ if (WXEnvironment.appName === 'WXSample') {
+ return url + '?' + paramString;
+ }
+ return url + '?wx_weex=true&' + paramString;
+}
+
+function getBaseURL() {
+ var bundleUrl = weex.config.bundleUrl;
+ var isAndroidAssets = bundleUrl.indexOf('your_current_IP') >= 0 || bundleUrl.indexOf('file://assets/') >= 0;
+ var isiOSAssets = bundleUrl.indexOf('file:///') >= 0 && bundleUrl.indexOf('WeexDemo.app') > 0;
+ if (isAndroidAssets) {
+ return 'file://assets/';
+ } else if (isiOSAssets) {
+ // file:///var/mobile/Containers/Bundle/Application/{id}/WeexDemo.app/
+ // file:///Users/{user}/Library/Developer/CoreSimulator/Devices/{id}/data/Containers/Bundle/Application/{id}/WeexDemo.app/
+ return bundleUrl.substring(0, bundleUrl.lastIndexOf('/') + 1);
+ }
+ return '';
+}
+
+function i18n(text, language) {
+ if (typeof text === 'string') {
+ return text;
+ }
+ if (Object.prototype.toString.call(text) === '[object Object]') {
+ var lang = this && this.language || language || 'en';
+ return text[lang];
+ }
+}
+
+var supportedLanguageRE = /(en|zh)\_?\w*/i;
+function parseLanguage(language) {
+ var match = supportedLanguageRE.exec(language + '');
+ if (match && match[1]) {
+ return match[1];
+ }
+ return '';
+}
+
+function setLanguage(language) {
+ var lang = parseLanguage(language);
+ if (lang) {
+ storage.setItem('WEEX_PLAYGROUND_LANGUAGE', lang);
+ }
+}
+
+function clearStorageLanguage() {
+ storage.removeItem('WEEX_PLAYGROUND_LANGUAGE');
+}
+
+function getStorageLanguage(done) {
+ var fail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+
+ if (!(typeof done === 'undefined' ? 'undefined' : (0, _typeof3.default)(done)) === 'function') {
+ return;
+ }
+ try {
+ storage.getItem('WEEX_PLAYGROUND_LANGUAGE', function (event) {
+ if (event.result === 'success') {
+ var lang = parseLanguage(event.data);
+ lang ? done(lang) : fail();
+ } else {
+ fail(event);
+ }
+ });
+ } catch (err) {
+ fail(err);
+ }
+}
+
+function getSystemLanguage(done) {
+ var fail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+
+ if (!(typeof done === 'undefined' ? 'undefined' : (0, _typeof3.default)(done)) === 'function') {
+ return;
+ }
+ if (WXEnvironment.platform.toLowerCase() === 'web') {
+ var lang = parseLanguage(window.navigator.language);
+ lang ? done(lang) : fail();
+ } else {
+ try {
+ var locale = weex.requireModule('locale') || weex.requireModule('local');
+ var useSync = false;
+ var resSync = locale.getLanguage(function (language) {
+ var lang = parseLanguage(language);
+ if (lang) {
+ useSync || done(lang);
+ } else {
+ fail();
+ }
+ });
+ var langSync = parseLanguage(resSync);
+ if (langSync) {
+ useSync = true;
+ done(langSync);
+ } else {
+ fail();
+ }
+ } catch (e) {
+ fail(e);
+ }
+ }
+}
+
+var languageRE = /.+[\?\&]{1}language=([\d\w]+)[\?\&]?.*/i;
+function getLanguage() {
+ var done = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
+
+ var match = languageRE.exec(weex.config.bundleUrl || '');
+ var lang = parseLanguage(match && match[1]);
+ if (lang) {
+ done(lang);
+ } else {
+ getStorageLanguage(done, function () {
+ getSystemLanguage(done, function () {
+ done('en');
+ });
+ });
+ }
+}
+
+function jumpTo(url, title, lang) {
+ getLanguage(function (language) {
+ storage.setItem('CURRENT_DOCUMENT_URL', i18n(url, lang || language));
+ navigator.push({
+ url: createURL('bf0305c14b511b24a4e616f53926432b', { language: language, title: i18n(title, lang || language) })
+ });
+ });
+}
+
+function viewSource(hash) {
+ getLanguage(function (language) {
+ navigator.push({
+ url: createURL('f6ce29faf686eabc38b410bf4828fa5a', { hash: hash, language: language })
+ });
+ });
+}
+
+function setTitleBar(options) {
+ var language = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en';
+
+ if (Object.prototype.toString.apply(options) !== '[object Object]') {
+ return;
+ }
+ var titleBar = weex.requireModule('titleBar');
+ if (options.color || options.backgroundColor) {
+ try {
+ titleBar.setStyle({
+ foregroundColor: options.color || '#FFFFFF',
+ backgroundColor: options.backgroundColor || '#00B4FF'
+ });
+ } catch (e) {}
+ }
+ var title = i18n(options.title, language);
+ if (title) {
+ try {
+ titleBar.setTitle(title);
+ } catch (e) {}
+ }
+}
+
+var storageKeys = {
+ doodle: 'WEEX_PLAYGROUND_APP_DOODLE',
+ guide: 'WEEX_PLAYGROUND_APP_GUIDE',
+ examples: 'WEEX_PLAYGROUND_APP_EXAMPLES',
+ news: 'WEEX_PLAYGROUND_APP_NEWS',
+ about: 'WEEX_PLAYGROUND_APP_ABOUT'
+};
+function fetchData(name) {
+ var done = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+ var fail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
+
+ try {
+ stream.fetch({
+ url: 'http://dotwe.org/query/weex-playground-app',
+ method: 'post',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded'
+ },
+ type: 'json',
+ body: 'name=' + name
+ }, function (res) {
+ if (res.ok && res.data && res.data.success) {
+ done(res.data);
+ } else {
+ fail(res);
+ }
+ });
+ } catch (err) {
+ fail(err);
+ }
+}
+function saveData(name, result) {
+ var key = storageKeys[name];
+ if (!key) return;
+ if (result && (typeof result === 'undefined' ? 'undefined' : (0, _typeof3.default)(result)) === 'object') {
+ result.timestamp = Date.now();
+ storage.setItem(key, (0, _stringify2.default)(result));
+ }
+}
+function readData(name) {
+ var done = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+ var fail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
+
+ var key = storageKeys[name];
+ if (!key) return fail();
+ try {
+ storage.getItem(key, function (event) {
+ if (event.result === 'success') {
+ var result = JSON.parse(event.data);
+ if (result && Array.isArray(result[name])) {
+ return done(result[name]);
+ }
+ }
+ fail(event);
+ });
+ } catch (e) {
+ fail(e);
+ }
+}
+
+var fetchExamples = exports.fetchExamples = function fetchExamples() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ return fetchData.apply(undefined, ['examples'].concat(args));
+};
+var saveExamples = exports.saveExamples = function saveExamples() {
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ return saveData.apply(undefined, ['examples'].concat(args));
+};
+var readExamples = exports.readExamples = function readExamples() {
+ for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+ args[_key3] = arguments[_key3];
+ }
+
+ return readData.apply(undefined, ['examples'].concat(args));
+};
+
+var fetchGuide = exports.fetchGuide = function fetchGuide() {
+ for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
+ args[_key4] = arguments[_key4];
+ }
+
+ return fetchData.apply(undefined, ['guide'].concat(args));
+};
+var saveGuide = exports.saveGuide = function saveGuide() {
+ for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
+ args[_key5] = arguments[_key5];
+ }
+
+ return saveData.apply(undefined, ['guide'].concat(args));
+};
+var readGuide = exports.readGuide = function readGuide() {
+ for (var _len6 = arguments.length, args = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
+ args[_key6] = arguments[_key6];
+ }
+
+ return readData.apply(undefined, ['guide'].concat(args));
+};
+
+var fetchAbout = exports.fetchAbout = function fetchAbout() {
+ for (var _len7 = arguments.length, args = Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
+ args[_key7] = arguments[_key7];
+ }
+
+ return fetchData.apply(undefined, ['about'].concat(args));
+};
+var saveAbout = exports.saveAbout = function saveAbout() {
+ for (var _len8 = arguments.length, args = Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
+ args[_key8] = arguments[_key8];
+ }
+
+ return saveData.apply(undefined, ['about'].concat(args));
+};
+var readAbout = exports.readAbout = function readAbout() {
+ for (var _len9 = arguments.length, args = Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {
+ args[_key9] = arguments[_key9];
+ }
+
+ return readData.apply(undefined, ['about'].concat(args));
+};
+
+var fetchDoodle = exports.fetchDoodle = function fetchDoodle() {
+ for (var _len10 = arguments.length, args = Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {
+ args[_key10] = arguments[_key10];
+ }
+
+ return fetchData.apply(undefined, ['doodle'].concat(args));
+};
+var fetchNews = exports.fetchNews = function fetchNews() {
+ for (var _len11 = arguments.length, args = Array(_len11), _key11 = 0; _key11 < _len11; _key11++) {
+ args[_key11] = arguments[_key11];
+ }
+
+ return fetchData.apply(undefined, ['news'].concat(args));
+};
+
+/***/ }),
+/* 28 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = true;
+
+var _iterator = __webpack_require__(43);
+
+var _iterator2 = _interopRequireDefault(_iterator);
+
+var _symbol = __webpack_require__(62);
+
+var _symbol2 = _interopRequireDefault(_symbol);
+
+var _typeof = typeof _symbol2.default === "function" && typeof _iterator2.default === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj; };
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.default) === "symbol" ? function (obj) {
+ return typeof obj === "undefined" ? "undefined" : _typeof(obj);
+} : function (obj) {
+ return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj);
+};
+
+/***/ }),
+/* 29 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var LIBRARY = __webpack_require__(9);
+var $export = __webpack_require__(16);
+var redefine = __webpack_require__(32);
+var hide = __webpack_require__(5);
+var Iterators = __webpack_require__(18);
+var $iterCreate = __webpack_require__(49);
+var setToStringTag = __webpack_require__(23);
+var getPrototypeOf = __webpack_require__(56);
+var ITERATOR = __webpack_require__(7)('iterator');
+var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
+var FF_ITERATOR = '@@iterator';
+var KEYS = 'keys';
+var VALUES = 'values';
+
+var returnThis = function () { return this; };
+
+module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
+ $iterCreate(Constructor, NAME, next);
+ var getMethod = function (kind) {
+ if (!BUGGY && kind in proto) return proto[kind];
+ switch (kind) {
+ case KEYS: return function keys() { return new Constructor(this, kind); };
+ case VALUES: return function values() { return new Constructor(this, kind); };
+ } return function entries() { return new Constructor(this, kind); };
+ };
+ var TAG = NAME + ' Iterator';
+ var DEF_VALUES = DEFAULT == VALUES;
+ var VALUES_BUG = false;
+ var proto = Base.prototype;
+ var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
+ var $default = $native || getMethod(DEFAULT);
+ var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
+ var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
+ var methods, key, IteratorPrototype;
+ // Fix native
+ if ($anyNative) {
+ IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));
+ if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
+ // Set @@toStringTag to native iterators
+ setToStringTag(IteratorPrototype, TAG, true);
+ // fix for some old engines
+ if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);
+ }
+ }
+ // fix Array#{values, @@iterator}.name in V8 / FF
+ if (DEF_VALUES && $native && $native.name !== VALUES) {
+ VALUES_BUG = true;
+ $default = function values() { return $native.call(this); };
+ }
+ // Define iterator
+ if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
+ hide(proto, ITERATOR, $default);
+ }
+ // Plug for library
+ Iterators[NAME] = $default;
+ Iterators[TAG] = returnThis;
+ if (DEFAULT) {
+ methods = {
+ values: DEF_VALUES ? $default : getMethod(VALUES),
+ keys: IS_SET ? $default : getMethod(KEYS),
+ entries: $entries
+ };
+ if (FORCED) for (key in methods) {
+ if (!(key in proto)) redefine(proto, key, methods[key]);
+ } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
+ }
+ return methods;
+};
+
+
+/***/ }),
+/* 30 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = !__webpack_require__(2) && !__webpack_require__(11)(function () {
+ return Object.defineProperty(__webpack_require__(31)('div'), 'a', { get: function () { return 7; } }).a != 7;
+});
+
+
+/***/ }),
+/* 31 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(8);
+var document = __webpack_require__(0).document;
+// typeof document.createElement is 'object' in old IE
+var is = isObject(document) && isObject(document.createElement);
+module.exports = function (it) {
+ return is ? document.createElement(it) : {};
+};
+
+
+/***/ }),
+/* 32 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(5);
+
+
+/***/ }),
+/* 33 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
+var anObject = __webpack_require__(10);
+var dPs = __webpack_require__(50);
+var enumBugKeys = __webpack_require__(22);
+var IE_PROTO = __webpack_require__(20)('IE_PROTO');
+var Empty = function () { /* empty */ };
+var PROTOTYPE = 'prototype';
+
+// Create object with fake `null` prototype: use iframe Object with cleared prototype
+var createDict = function () {
+ // Thrash, waste and sodomy: IE GC bug
+ var iframe = __webpack_require__(31)('iframe');
+ var i = enumBugKeys.length;
+ var lt = '<';
+ var gt = '>';
+ var iframeDocument;
+ iframe.style.display = 'none';
+ __webpack_require__(55).appendChild(iframe);
+ iframe.src = 'javascript:'; // eslint-disable-line no-script-url
+ // createDict = iframe.contentWindow.Object;
+ // html.removeChild(iframe);
+ iframeDocument = iframe.contentWindow.document;
+ iframeDocument.open();
+ iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
+ iframeDocument.close();
+ createDict = iframeDocument.F;
+ while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];
+ return createDict();
+};
+
+module.exports = Object.create || function create(O, Properties) {
+ var result;
+ if (O !== null) {
+ Empty[PROTOTYPE] = anObject(O);
+ result = new Empty();
+ Empty[PROTOTYPE] = null;
+ // add "__proto__" for Object.getPrototypeOf polyfill
+ result[IE_PROTO] = O;
+ } else result = createDict();
+ return Properties === undefined ? result : dPs(result, Properties);
+};
+
+
+/***/ }),
+/* 34 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var has = __webpack_require__(3);
+var toIObject = __webpack_require__(6);
+var arrayIndexOf = __webpack_require__(52)(false);
+var IE_PROTO = __webpack_require__(20)('IE_PROTO');
+
+module.exports = function (object, names) {
+ var O = toIObject(object);
+ var i = 0;
+ var result = [];
+ var key;
+ for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);
+ // Don't enum bug & hidden keys
+ while (names.length > i) if (has(O, key = names[i++])) {
+ ~arrayIndexOf(result, key) || result.push(key);
+ }
+ return result;
+};
+
+
+/***/ }),
+/* 35 */
+/***/ (function(module, exports) {
+
+var toString = {}.toString;
+
+module.exports = function (it) {
+ return toString.call(it).slice(8, -1);
+};
+
+
+/***/ }),
+/* 36 */
+/***/ (function(module, exports) {
+
+exports.f = Object.getOwnPropertySymbols;
+
+
+/***/ }),
+/* 37 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
+var $keys = __webpack_require__(34);
+var hiddenKeys = __webpack_require__(22).concat('length', 'prototype');
+
+exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
+ return $keys(O, hiddenKeys);
+};
+
+
+/***/ }),
+/* 38 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+__webpack_require__(39);
+
+var _About = __webpack_require__(73);
+
+var _About2 = _interopRequireDefault(_About);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// show title bar
+try {
+ var titleBar = weex.requireModule('titleBar');
+ titleBar.showTitleBar(true);
+} catch (e) {}
+
+_About2.default.el = '#root';
+new Vue(_About2.default);
+
+/***/ }),
+/* 39 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _mixin = __webpack_require__(40);
+
+var _mixin2 = _interopRequireDefault(_mixin);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// use shared mixins
+Vue.mixin(_mixin2.default);
+
+/***/ }),
+/* 40 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _index = __webpack_require__(27);
+
+var utils = _interopRequireWildcard(_index);
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
+
+var storage = weex.requireModule('storage');
+
+exports.default = {
+ filters: {
+ i18n: utils.i18n,
+ url: utils.createURL,
+ link: utils.createLink
+ },
+ methods: {
+ createLink: utils.createLink,
+ createURL: utils.createURL,
+ i18n: utils.i18n,
+ getLanguage: utils.getLanguage,
+ fetchData: utils.fetchData,
+ saveData: utils.saveData,
+ readData: utils.readData,
+ jumpTo: utils.jumpTo
+ },
+ created: function created() {
+ var _this = this;
+
+ // get and set language
+ utils.getLanguage(function (language) {
+ _this.language = language;
+ utils.setTitleBar(_this.navigationBarOptions, language);
+ });
+
+ // listen to the language change event
+ var channel = new BroadcastChannel('language');
+ channel.onmessage = function (event) {
+ if (event.data && event.data.language) {
+ _this.language = event.data.language;
+ }
+ };
+ },
+ beforeDestroy: function beforeDestroy() {
+ storage.removeItem('CURRENT_DOCUMENT_URL');
+ storage.removeItem('CURRENT_SOURCE_HASH');
+ }
+};
+
+/***/ }),
+/* 41 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(42), __esModule: true };
+
+/***/ }),
+/* 42 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var core = __webpack_require__(4);
+var $JSON = core.JSON || (core.JSON = { stringify: JSON.stringify });
+module.exports = function stringify(it) { // eslint-disable-line no-unused-vars
+ return $JSON.stringify.apply($JSON, arguments);
+};
+
+
+/***/ }),
+/* 43 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(44), __esModule: true };
+
+/***/ }),
+/* 44 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(45);
+__webpack_require__(58);
+module.exports = __webpack_require__(24).f('iterator');
+
+
+/***/ }),
+/* 45 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $at = __webpack_require__(46)(true);
+
+// 21.1.3.27 String.prototype[@@iterator]()
+__webpack_require__(29)(String, 'String', function (iterated) {
+ this._t = String(iterated); // target
+ this._i = 0; // next index
+// 21.1.5.2.1 %StringIteratorPrototype%.next()
+}, function () {
+ var O = this._t;
+ var index = this._i;
+ var point;
+ if (index >= O.length) return { value: undefined, done: true };
+ point = $at(O, index);
+ this._i += point.length;
+ return { value: point, done: false };
+});
+
+
+/***/ }),
+/* 46 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(14);
+var defined = __webpack_require__(15);
+// true -> String#at
+// false -> String#codePointAt
+module.exports = function (TO_STRING) {
+ return function (that, pos) {
+ var s = String(defined(that));
+ var i = toInteger(pos);
+ var l = s.length;
+ var a, b;
+ if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
+ a = s.charCodeAt(i);
+ return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
+ ? TO_STRING ? s.charAt(i) : a
+ : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
+ };
+};
+
+
+/***/ }),
+/* 47 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// optional / simple context binding
+var aFunction = __webpack_require__(48);
+module.exports = function (fn, that, length) {
+ aFunction(fn);
+ if (that === undefined) return fn;
+ switch (length) {
+ case 1: return function (a) {
+ return fn.call(that, a);
+ };
+ case 2: return function (a, b) {
+ return fn.call(that, a, b);
+ };
+ case 3: return function (a, b, c) {
+ return fn.call(that, a, b, c);
+ };
+ }
+ return function (/* ...args */) {
+ return fn.apply(that, arguments);
+ };
+};
+
+
+/***/ }),
+/* 48 */
+/***/ (function(module, exports) {
+
+module.exports = function (it) {
+ if (typeof it != 'function') throw TypeError(it + ' is not a function!');
+ return it;
+};
+
+
+/***/ }),
+/* 49 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var create = __webpack_require__(33);
+var descriptor = __webpack_require__(12);
+var setToStringTag = __webpack_require__(23);
+var IteratorPrototype = {};
+
+// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
+__webpack_require__(5)(IteratorPrototype, __webpack_require__(7)('iterator'), function () { return this; });
+
+module.exports = function (Constructor, NAME, next) {
+ Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });
+ setToStringTag(Constructor, NAME + ' Iterator');
+};
+
+
+/***/ }),
+/* 50 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dP = __webpack_require__(1);
+var anObject = __webpack_require__(10);
+var getKeys = __webpack_require__(19);
+
+module.exports = __webpack_require__(2) ? Object.defineProperties : function defineProperties(O, Properties) {
+ anObject(O);
+ var keys = getKeys(Properties);
+ var length = keys.length;
+ var i = 0;
+ var P;
+ while (length > i) dP.f(O, P = keys[i++], Properties[P]);
+ return O;
+};
+
+
+/***/ }),
+/* 51 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// fallback for non-array-like ES3 and non-enumerable old V8 strings
+var cof = __webpack_require__(35);
+// eslint-disable-next-line no-prototype-builtins
+module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
+ return cof(it) == 'String' ? it.split('') : Object(it);
+};
+
+
+/***/ }),
+/* 52 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// false -> Array#indexOf
+// true -> Array#includes
+var toIObject = __webpack_require__(6);
+var toLength = __webpack_require__(53);
+var toAbsoluteIndex = __webpack_require__(54);
+module.exports = function (IS_INCLUDES) {
+ return function ($this, el, fromIndex) {
+ var O = toIObject($this);
+ var length = toLength(O.length);
+ var index = toAbsoluteIndex(fromIndex, length);
+ var value;
+ // Array#includes uses SameValueZero equality algorithm
+ // eslint-disable-next-line no-self-compare
+ if (IS_INCLUDES && el != el) while (length > index) {
+ value = O[index++];
+ // eslint-disable-next-line no-self-compare
+ if (value != value) return true;
+ // Array#indexOf ignores holes, Array#includes - not
+ } else for (;length > index; index++) if (IS_INCLUDES || index in O) {
+ if (O[index] === el) return IS_INCLUDES || index || 0;
+ } return !IS_INCLUDES && -1;
+ };
+};
+
+
+/***/ }),
+/* 53 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.15 ToLength
+var toInteger = __webpack_require__(14);
+var min = Math.min;
+module.exports = function (it) {
+ return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
+};
+
+
+/***/ }),
+/* 54 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(14);
+var max = Math.max;
+var min = Math.min;
+module.exports = function (index, length) {
+ index = toInteger(index);
+ return index < 0 ? max(index + length, 0) : min(index, length);
+};
+
+
+/***/ }),
+/* 55 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var document = __webpack_require__(0).document;
+module.exports = document && document.documentElement;
+
+
+/***/ }),
+/* 56 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
+var has = __webpack_require__(3);
+var toObject = __webpack_require__(57);
+var IE_PROTO = __webpack_require__(20)('IE_PROTO');
+var ObjectProto = Object.prototype;
+
+module.exports = Object.getPrototypeOf || function (O) {
+ O = toObject(O);
+ if (has(O, IE_PROTO)) return O[IE_PROTO];
+ if (typeof O.constructor == 'function' && O instanceof O.constructor) {
+ return O.constructor.prototype;
+ } return O instanceof Object ? ObjectProto : null;
+};
+
+
+/***/ }),
+/* 57 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.13 ToObject(argument)
+var defined = __webpack_require__(15);
+module.exports = function (it) {
+ return Object(defined(it));
+};
+
+
+/***/ }),
+/* 58 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(59);
+var global = __webpack_require__(0);
+var hide = __webpack_require__(5);
+var Iterators = __webpack_require__(18);
+var TO_STRING_TAG = __webpack_require__(7)('toStringTag');
+
+var DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +
+ 'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +
+ 'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +
+ 'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +
+ 'TextTrackList,TouchList').split(',');
+
+for (var i = 0; i < DOMIterables.length; i++) {
+ var NAME = DOMIterables[i];
+ var Collection = global[NAME];
+ var proto = Collection && Collection.prototype;
+ if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);
+ Iterators[NAME] = Iterators.Array;
+}
+
+
+/***/ }),
+/* 59 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var addToUnscopables = __webpack_require__(60);
+var step = __webpack_require__(61);
+var Iterators = __webpack_require__(18);
+var toIObject = __webpack_require__(6);
+
+// 22.1.3.4 Array.prototype.entries()
+// 22.1.3.13 Array.prototype.keys()
+// 22.1.3.29 Array.prototype.values()
+// 22.1.3.30 Array.prototype[@@iterator]()
+module.exports = __webpack_require__(29)(Array, 'Array', function (iterated, kind) {
+ this._t = toIObject(iterated); // target
+ this._i = 0; // next index
+ this._k = kind; // kind
+// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
+}, function () {
+ var O = this._t;
+ var kind = this._k;
+ var index = this._i++;
+ if (!O || index >= O.length) {
+ this._t = undefined;
+ return step(1);
+ }
+ if (kind == 'keys') return step(0, index);
+ if (kind == 'values') return step(0, O[index]);
+ return step(0, [index, O[index]]);
+}, 'values');
+
+// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
+Iterators.Arguments = Iterators.Array;
+
+addToUnscopables('keys');
+addToUnscopables('values');
+addToUnscopables('entries');
+
+
+/***/ }),
+/* 60 */
+/***/ (function(module, exports) {
+
+module.exports = function () { /* empty */ };
+
+
+/***/ }),
+/* 61 */
+/***/ (function(module, exports) {
+
+module.exports = function (done, value) {
+ return { value: value, done: !!done };
+};
+
+
+/***/ }),
+/* 62 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(63), __esModule: true };
+
+/***/ }),
+/* 63 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(64);
+__webpack_require__(70);
+__webpack_require__(71);
+__webpack_require__(72);
+module.exports = __webpack_require__(4).Symbol;
+
+
+/***/ }),
+/* 64 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// ECMAScript 6 symbols shim
+var global = __webpack_require__(0);
+var has = __webpack_require__(3);
+var DESCRIPTORS = __webpack_require__(2);
+var $export = __webpack_require__(16);
+var redefine = __webpack_require__(32);
+var META = __webpack_require__(65).KEY;
+var $fails = __webpack_require__(11);
+var shared = __webpack_require__(21);
+var setToStringTag = __webpack_require__(23);
+var uid = __webpack_require__(13);
+var wks = __webpack_require__(7);
+var wksExt = __webpack_require__(24);
+var wksDefine = __webpack_require__(25);
+var enumKeys = __webpack_require__(66);
+var isArray = __webpack_require__(67);
+var anObject = __webpack_require__(10);
+var isObject = __webpack_require__(8);
+var toIObject = __webpack_require__(6);
+var toPrimitive = __webpack_require__(17);
+var createDesc = __webpack_require__(12);
+var _create = __webpack_require__(33);
+var gOPNExt = __webpack_require__(68);
+var $GOPD = __webpack_require__(69);
+var $DP = __webpack_require__(1);
+var $keys = __webpack_require__(19);
+var gOPD = $GOPD.f;
+var dP = $DP.f;
+var gOPN = gOPNExt.f;
+var $Symbol = global.Symbol;
+var $JSON = global.JSON;
+var _stringify = $JSON && $JSON.stringify;
+var PROTOTYPE = 'prototype';
+var HIDDEN = wks('_hidden');
+var TO_PRIMITIVE = wks('toPrimitive');
+var isEnum = {}.propertyIsEnumerable;
+var SymbolRegistry = shared('symbol-registry');
+var AllSymbols = shared('symbols');
+var OPSymbols = shared('op-symbols');
+var ObjectProto = Object[PROTOTYPE];
+var USE_NATIVE = typeof $Symbol == 'function';
+var QObject = global.QObject;
+// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
+var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
+
+// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
+var setSymbolDesc = DESCRIPTORS && $fails(function () {
+ return _create(dP({}, 'a', {
+ get: function () { return dP(this, 'a', { value: 7 }).a; }
+ })).a != 7;
+}) ? function (it, key, D) {
+ var protoDesc = gOPD(ObjectProto, key);
+ if (protoDesc) delete ObjectProto[key];
+ dP(it, key, D);
+ if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);
+} : dP;
+
+var wrap = function (tag) {
+ var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);
+ sym._k = tag;
+ return sym;
+};
+
+var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {
+ return typeof it == 'symbol';
+} : function (it) {
+ return it instanceof $Symbol;
+};
+
+var $defineProperty = function defineProperty(it, key, D) {
+ if (it === ObjectProto) $defineProperty(OPSymbols, key, D);
+ anObject(it);
+ key = toPrimitive(key, true);
+ anObject(D);
+ if (has(AllSymbols, key)) {
+ if (!D.enumerable) {
+ if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));
+ it[HIDDEN][key] = true;
+ } else {
+ if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
+ D = _create(D, { enumerable: createDesc(0, false) });
+ } return setSymbolDesc(it, key, D);
+ } return dP(it, key, D);
+};
+var $defineProperties = function defineProperties(it, P) {
+ anObject(it);
+ var keys = enumKeys(P = toIObject(P));
+ var i = 0;
+ var l = keys.length;
+ var key;
+ while (l > i) $defineProperty(it, key = keys[i++], P[key]);
+ return it;
+};
+var $create = function create(it, P) {
+ return P === undefined ? _create(it) : $defineProperties(_create(it), P);
+};
+var $propertyIsEnumerable = function propertyIsEnumerable(key) {
+ var E = isEnum.call(this, key = toPrimitive(key, true));
+ if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;
+ return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
+};
+var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
+ it = toIObject(it);
+ key = toPrimitive(key, true);
+ if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;
+ var D = gOPD(it, key);
+ if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
+ return D;
+};
+var $getOwnPropertyNames = function getOwnPropertyNames(it) {
+ var names = gOPN(toIObject(it));
+ var result = [];
+ var i = 0;
+ var key;
+ while (names.length > i) {
+ if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
+ } return result;
+};
+var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
+ var IS_OP = it === ObjectProto;
+ var names = gOPN(IS_OP ? OPSymbols : toIObject(it));
+ var result = [];
+ var i = 0;
+ var key;
+ while (names.length > i) {
+ if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);
+ } return result;
+};
+
+// 19.4.1.1 Symbol([description])
+if (!USE_NATIVE) {
+ $Symbol = function Symbol() {
+ if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
+ var tag = uid(arguments.length > 0 ? arguments[0] : undefined);
+ var $set = function (value) {
+ if (this === ObjectProto) $set.call(OPSymbols, value);
+ if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
+ setSymbolDesc(this, tag, createDesc(1, value));
+ };
+ if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });
+ return wrap(tag);
+ };
+ redefine($Symbol[PROTOTYPE], 'toString', function toString() {
+ return this._k;
+ });
+
+ $GOPD.f = $getOwnPropertyDescriptor;
+ $DP.f = $defineProperty;
+ __webpack_require__(37).f = gOPNExt.f = $getOwnPropertyNames;
+ __webpack_require__(26).f = $propertyIsEnumerable;
+ __webpack_require__(36).f = $getOwnPropertySymbols;
+
+ if (DESCRIPTORS && !__webpack_require__(9)) {
+ redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
+ }
+
+ wksExt.f = function (name) {
+ return wrap(wks(name));
+ };
+}
+
+$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });
+
+for (var es6Symbols = (
+ // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
+ 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
+).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);
+
+for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);
+
+$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
+ // 19.4.2.1 Symbol.for(key)
+ 'for': function (key) {
+ return has(SymbolRegistry, key += '')
+ ? SymbolRegistry[key]
+ : SymbolRegistry[key] = $Symbol(key);
+ },
+ // 19.4.2.5 Symbol.keyFor(sym)
+ keyFor: function keyFor(sym) {
+ if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');
+ for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;
+ },
+ useSetter: function () { setter = true; },
+ useSimple: function () { setter = false; }
+});
+
+$export($export.S + $export.F * !USE_NATIVE, 'Object', {
+ // 19.1.2.2 Object.create(O [, Properties])
+ create: $create,
+ // 19.1.2.4 Object.defineProperty(O, P, Attributes)
+ defineProperty: $defineProperty,
+ // 19.1.2.3 Object.defineProperties(O, Properties)
+ defineProperties: $defineProperties,
+ // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
+ getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
+ // 19.1.2.7 Object.getOwnPropertyNames(O)
+ getOwnPropertyNames: $getOwnPropertyNames,
+ // 19.1.2.8 Object.getOwnPropertySymbols(O)
+ getOwnPropertySymbols: $getOwnPropertySymbols
+});
+
+// 24.3.2 JSON.stringify(value [, replacer [, space]])
+$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {
+ var S = $Symbol();
+ // MS Edge converts symbol values to JSON as {}
+ // WebKit converts symbol values to JSON as null
+ // V8 throws on boxed symbols
+ return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';
+})), 'JSON', {
+ stringify: function stringify(it) {
+ var args = [it];
+ var i = 1;
+ var replacer, $replacer;
+ while (arguments.length > i) args.push(arguments[i++]);
+ $replacer = replacer = args[1];
+ if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
+ if (!isArray(replacer)) replacer = function (key, value) {
+ if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
+ if (!isSymbol(value)) return value;
+ };
+ args[1] = replacer;
+ return _stringify.apply($JSON, args);
+ }
+});
+
+// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
+$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(5)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
+// 19.4.3.5 Symbol.prototype[@@toStringTag]
+setToStringTag($Symbol, 'Symbol');
+// 20.2.1.9 Math[@@toStringTag]
+setToStringTag(Math, 'Math', true);
+// 24.3.3 JSON[@@toStringTag]
+setToStringTag(global.JSON, 'JSON', true);
+
+
+/***/ }),
+/* 65 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var META = __webpack_require__(13)('meta');
+var isObject = __webpack_require__(8);
+var has = __webpack_require__(3);
+var setDesc = __webpack_require__(1).f;
+var id = 0;
+var isExtensible = Object.isExtensible || function () {
+ return true;
+};
+var FREEZE = !__webpack_require__(11)(function () {
+ return isExtensible(Object.preventExtensions({}));
+});
+var setMeta = function (it) {
+ setDesc(it, META, { value: {
+ i: 'O' + ++id, // object ID
+ w: {} // weak collections IDs
+ } });
+};
+var fastKey = function (it, create) {
+ // return primitive with prefix
+ if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
+ if (!has(it, META)) {
+ // can't set metadata to uncaught frozen object
+ if (!isExtensible(it)) return 'F';
+ // not necessary to add metadata
+ if (!create) return 'E';
+ // add missing metadata
+ setMeta(it);
+ // return object ID
+ } return it[META].i;
+};
+var getWeak = function (it, create) {
+ if (!has(it, META)) {
+ // can't set metadata to uncaught frozen object
+ if (!isExtensible(it)) return true;
+ // not necessary to add metadata
+ if (!create) return false;
+ // add missing metadata
+ setMeta(it);
+ // return hash weak collections IDs
+ } return it[META].w;
+};
+// add metadata on freeze-family methods calling
+var onFreeze = function (it) {
+ if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);
+ return it;
+};
+var meta = module.exports = {
+ KEY: META,
+ NEED: false,
+ fastKey: fastKey,
+ getWeak: getWeak,
+ onFreeze: onFreeze
+};
+
+
+/***/ }),
+/* 66 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// all enumerable object keys, includes symbols
+var getKeys = __webpack_require__(19);
+var gOPS = __webpack_require__(36);
+var pIE = __webpack_require__(26);
+module.exports = function (it) {
+ var result = getKeys(it);
+ var getSymbols = gOPS.f;
+ if (getSymbols) {
+ var symbols = getSymbols(it);
+ var isEnum = pIE.f;
+ var i = 0;
+ var key;
+ while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);
+ } return result;
+};
+
+
+/***/ }),
+/* 67 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.2.2 IsArray(argument)
+var cof = __webpack_require__(35);
+module.exports = Array.isArray || function isArray(arg) {
+ return cof(arg) == 'Array';
+};
+
+
+/***/ }),
+/* 68 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
+var toIObject = __webpack_require__(6);
+var gOPN = __webpack_require__(37).f;
+var toString = {}.toString;
+
+var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
+ ? Object.getOwnPropertyNames(window) : [];
+
+var getWindowNames = function (it) {
+ try {
+ return gOPN(it);
+ } catch (e) {
+ return windowNames.slice();
+ }
+};
+
+module.exports.f = function getOwnPropertyNames(it) {
+ return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));
+};
+
+
+/***/ }),
+/* 69 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var pIE = __webpack_require__(26);
+var createDesc = __webpack_require__(12);
+var toIObject = __webpack_require__(6);
+var toPrimitive = __webpack_require__(17);
+var has = __webpack_require__(3);
+var IE8_DOM_DEFINE = __webpack_require__(30);
+var gOPD = Object.getOwnPropertyDescriptor;
+
+exports.f = __webpack_require__(2) ? gOPD : function getOwnPropertyDescriptor(O, P) {
+ O = toIObject(O);
+ P = toPrimitive(P, true);
+ if (IE8_DOM_DEFINE) try {
+ return gOPD(O, P);
+ } catch (e) { /* empty */ }
+ if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);
+};
+
+
+/***/ }),
+/* 70 */
+/***/ (function(module, exports) {
+
+
+
+/***/ }),
+/* 71 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(25)('asyncIterator');
+
+
+/***/ }),
+/* 72 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(25)('observable');
+
+
+/***/ }),
+/* 73 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __vue_exports__, __vue_options__
+var __vue_styles__ = []
+
+/* styles */
+__vue_styles__.push(__webpack_require__(74)
+)
+
+/* script */
+__vue_exports__ = __webpack_require__(75)
+
+/* template */
+var __vue_template__ = __webpack_require__(86)
+__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+if (
+ typeof __vue_exports__.default === "object" ||
+ typeof __vue_exports__.default === "function"
+) {
+if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+__vue_options__ = __vue_exports__ = __vue_exports__.default
+}
+if (typeof __vue_options__ === "function") {
+ __vue_options__ = __vue_options__.options
+}
+__vue_options__.__file = "/Users/kw/github/weex-vue-examples/src/pages/about/About.vue"
+__vue_options__.render = __vue_template__.render
+__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+__vue_options__._scopeId = "data-v-13681c5e"
+__vue_options__.style = __vue_options__.style || {}
+__vue_styles__.forEach(function (module) {
+ for (var name in module) {
+ __vue_options__.style[name] = module[name]
+ }
+})
+if (typeof __register_static_styles__ === "function") {
+ __register_static_styles__(__vue_options__._scopeId, __vue_styles__)
+}
+
+module.exports = __vue_exports__
+
+
+/***/ }),
+/* 74 */
+/***/ (function(module, exports) {
+
+module.exports = {
+ "list": {
+ "backgroundColor": "#F5F5F5"
+ },
+ "item": {
+ "paddingTop": "30",
+ "paddingBottom": "30",
+ "paddingLeft": "60",
+ "paddingRight": "40",
+ "borderBottomWidth": "1",
+ "borderBottomStyle": "solid",
+ "borderBottomColor": "#E6E6E6",
+ "backgroundColor": "#FFFFFF",
+ "flexDirection": "row",
+ "justifyContent": "space-between",
+ "alignItems": "center"
+ },
+ "item-1": {
+ "borderTopWidth": "1",
+ "borderTopStyle": "solid",
+ "borderTopColor": "#E6E6E6"
+ },
+ "item-title": {
+ "fontSize": "42",
+ "color": "#606060"
+ },
+ "item-value": {
+ "fontSize": "36",
+ "color": "#999999"
+ },
+ "arrow-icon": {
+ "width": "22",
+ "height": "36"
+ },
+ "copyright": {
+ "marginTop": "50",
+ "paddingBottom": "20"
+ },
+ "copyright-text": {
+ "fontSize": "22",
+ "color": "#A0A0A0",
+ "textAlign": "center"
+ }
+}
+
+/***/ }),
+/* 75 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _utils = __webpack_require__(27);
+
+var utils = _interopRequireWildcard(_utils);
+
+var _mock = __webpack_require__(76);
+
+var _AppInfoCard = __webpack_require__(82);
+
+var _AppInfoCard2 = _interopRequireDefault(_AppInfoCard);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
+
+var picker = weex.requireModule('picker'); //
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+var channel = new BroadcastChannel('language');
+exports.default = {
+ components: { AppInfoCard: _AppInfoCard2.default },
+ data: function data() {
+ return {
+ language: 'en',
+ followSystemLanguage: true,
+ navigationBarOptions: {
+ title: {
+ zh: '关于 Weex',
+ en: 'About Weex'
+ }
+ },
+ dict: {
+ FOLLOW_SYSTEM: { en: 'Follow System', zh: '跟随系统' },
+ LANGUAGE: { en: 'Language', zh: '语言' }
+ },
+ aboutApp: _mock.aboutApp
+ };
+ },
+
+ watch: {
+ language: function language() {
+ channel.postMessage({ language: this.language });
+ }
+ },
+ computed: {
+ languageName: function languageName() {
+ if (this.followSystemLanguage) {
+ return this.i18n(this.dict.FOLLOW_SYSTEM);
+ }
+ return this.i18n({ en: 'English', zh: '简体中文' });
+ }
+ },
+ created: function created() {
+ var _this = this;
+
+ utils.readAbout(function (about) {
+ _this.aboutApp = about;
+ });
+ utils.getStorageLanguage(function (lang) {
+ return _this.followSystemLanguage = false;
+ }, function () {
+ return _this.followSystemLanguage = true;
+ });
+ },
+
+ methods: {
+ chooseLanguage: function chooseLanguage() {
+ var _this2 = this;
+
+ var options = ['', 'en', 'zh'];
+ var index = this.followSystemLanguage ? 0 : options.indexOf(this.language);
+ picker.pick({
+ index: index,
+ items: [this.i18n(this.dict.FOLLOW_SYSTEM), 'English', '中文']
+ }, function (_ref) {
+ var result = _ref.result,
+ data = _ref.data;
+
+ if (result === 'success') {
+ var select = options[data];
+ if (select) {
+ _this2.followSystemLanguage = false;
+ _this2.language = select;
+ utils.setLanguage(select);
+ } else {
+ _this2.followSystemLanguage = true;
+ utils.clearStorageLanguage();
+ utils.getSystemLanguage(function (lang) {
+ _this2.language = lang;
+ }, function (error) {
+ _this2.language = 'en';
+ });
+ }
+ }
+ });
+ }
+ }
+};
+
+/***/ }),
+/* 76 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.aboutApp = exports.guideLessons = undefined;
+
+var _sliders = __webpack_require__(77);
+
+var _sliders2 = _interopRequireDefault(_sliders);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var guideLessons = exports.guideLessons = _sliders2.default;
+
+var aboutApp = exports.aboutApp = [{
+ title: { en: 'Weex Official Website', zh: 'Weex 官方网站' },
+ link: {
+ en: 'http://weex-project.io/',
+ zh: 'http://weex-project.io/cn/'
+ }
+}, {
+ title: { en: 'Apache Software Foundation', zh: 'Apache 软件基金会' },
+ link: 'http://www.apache.org/'
+}, {
+ title: { en: 'Who is using Weex', zh: '谁在使用 Weex' },
+ link: {
+ en: 'http://weex-project.io/who-is-using-weex.html',
+ zh: 'http://weex-project.io/cn/who-is-using-weex.html'
+ }
+}, {
+ title: { en: 'Contribution', zh: '参与贡献' },
+ link: {
+ en: 'http://weex-project.io/guide/contributing.html',
+ zh: 'http://weex-project.io/cn/guide/contributing.html'
+ }
+}, {
+ title: { en: 'Release Note', zh: '版本变更' },
+ link: {
+ en: 'http://weex-project.io/releasenote.html',
+ zh: 'http://weex-project.io/cn/releasenote.html'
+ }
+}, {
+ title: { en: 'FAQ', zh: '常见问题' },
+ link: {
+ en: 'http://weex-project.io/faq.html',
+ zh: 'http://weex-project.io/cn/faq.html'
+ }
+}];
+
+/***/ }),
+/* 77 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _defineProperty2 = __webpack_require__(78);
+
+var _defineProperty3 = _interopRequireDefault(_defineProperty2);
+
+var _ref, _ref2, _ref3;
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+exports.default = [{
+ subject: 'weex',
+ mainColor: '#00B4FF',
+ title: { zh: '学习 Weex', en: 'Learn Weex' },
+ poster: 'https://gw.alicdn.com/tfs/TB1.8Vdl9_I8KJjy0FoXXaFnVXa-3799-1615.png',
+ posterBg: '#E5F7FF',
+ posterStyle: {
+ width: '650px',
+ height: '304px'
+ },
+ copyright: {
+ zh: '来自 http://weex-project.io/cn/',
+ en: 'From http://weex-project.io/'
+ },
+ lessons: [{
+ title: {
+ zh: '快速入门',
+ en: 'Getting Started'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/guide/index.html',
+ en: 'http://weex-project.io/guide/index.html'
+ }
+ }, {
+ title: {
+ zh: '工作原理',
+ en: 'How it Works'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/wiki/index.html',
+ en: 'http://weex-project.io/wiki/index.html'
+ }
+ }, {
+ title: {
+ zh: 'Weex 中的前端框架',
+ en: 'Front-end Frameworks'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/guide/front-end-frameworks.html',
+ en: 'http://weex-project.io/guide/front-end-frameworks.html'
+ }
+ }, {
+ title: {
+ zh: '在 Weex 中使用 Vue.js',
+ en: 'Use Vue.js on Weex'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/guide/use-vue.html',
+ en: 'http://weex-project.io/guide/use-vue.html'
+ }
+ }, {
+ title: {
+ zh: '与 Web 平台的差异',
+ en: 'Platform difference with Web'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/wiki/platform-difference.html',
+ en: 'http://weex-project.io/wiki/platform-difference.html'
+ }
+ }, {
+ title: {
+ zh: '集成 Weex 到已有应用',
+ en: 'Integrate to Your App'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/guide/integrate-to-your-app.html',
+ en: 'http://weex-project.io/guide/integrate-to-your-app.html'
+ }
+ }, {
+ title: {
+ zh: '搭建开发环境',
+ en: 'Set Up Dev Environment'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/guide/set-up-env.html',
+ en: 'http://weex-project.io/guide/set-up-env.html'
+ }
+ }, {
+ title: {
+ zh: '通用样式',
+ en: 'Common Styles'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/wiki/common-styles.html',
+ en: 'http://weex-project.io/wiki/common-styles.html'
+ }
+ }, {
+ title: {
+ zh: '通用事件',
+ en: 'Common Events'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/wiki/common-events.html',
+ en: 'http://weex-project.io/wiki/common-events.html'
+ }
+ }, {
+ title: {
+ zh: 'Weex 实例变量',
+ en: 'The "weex" Variable'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/references/weex-variable.html',
+ en: 'http://weex-project.io/references/weex-variable.html'
+ }
+ }, {
+ title: {
+ zh: '内置组件',
+ en: 'Built-in Components'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/references/components/index.html',
+ en: 'http://weex-project.io/references/components/index.html'
+ }
+ }, {
+ title: {
+ zh: '内置模块',
+ en: 'Built-in Modules'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/references/modules/index.html',
+ en: 'http://weex-project.io/references/modules/index.html'
+ }
+ }, {
+ title: {
+ zh: '扩展 Android 组件/模块',
+ en: 'Extend Android'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/guide/extend-android.html',
+ en: 'http://weex-project.io/guide/extend-android.html'
+ }
+ }, {
+ title: {
+ zh: '扩展 iOS 组件/模块',
+ en: 'Extend iOS'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/guide/extend-ios.html',
+ en: 'http://weex-project.io/guide/extend-ios.html'
+ }
+ }, {
+ title: {
+ zh: '使用 weex-toolkit',
+ en: 'Use weex-toolkit'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/tools/toolkit.html',
+ en: 'http://weex-project.io/tools/toolkit.html'
+ }
+ }, {
+ title: {
+ zh: '如何参与贡献',
+ en: 'How to Contribute'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/contributing.html',
+ en: 'http://weex-project.io/contributing.html'
+ }
+ }]
+}, (_ref = {
+ subject: 'vue',
+ mainColor: '#42b983',
+ title: { zh: '学习 Vue.js', en: 'Learn Vue.js' },
+ poster: 'https://gw.alicdn.com/tfs/TB1J_uKcMMPMeJjy1XdXXasrXXa-400-400.png',
+ posterBg: '#E7FBF2',
+ posterStyle: {
+ width: '300px',
+ height: '300px'
+ }
+}, (0, _defineProperty3.default)(_ref, 'title', {
+ zh: '学习 Vue.js',
+ en: 'Learn Vue.js'
+}), (0, _defineProperty3.default)(_ref, 'copyright', {
+ zh: '来自 https://cn.vuejs.org/',
+ en: 'From https://vuejs.org/'
+}), (0, _defineProperty3.default)(_ref, 'lessons', [{
+ title: {
+ zh: 'Vue.js 是什么?',
+ en: 'What is Vue.js ?'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/index.html',
+ en: 'https://vuejs.org/v2/guide/index.html'
+ }
+}, {
+ title: {
+ zh: '单文件组件',
+ en: 'Single File Components'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/single-file-components.html',
+ en: 'https://vuejs.org/v2/guide/single-file-components.html'
+ }
+}, {
+ title: {
+ zh: '模板语法',
+ en: 'Template Syntax'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/syntax.html',
+ en: 'https://vuejs.org/v2/guide/syntax.html'
+ }
+}, {
+ title: {
+ zh: 'Class 与 Style 绑定',
+ en: 'Class and Style Bindings'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/class-and-style.html',
+ en: 'https://vuejs.org/v2/guide/class-and-style.html'
+ }
+}, {
+ title: {
+ zh: '条件渲染',
+ en: 'Conditional Rendering'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/conditional.html',
+ en: 'https://vuejs.org/v2/guide/conditional.html'
+ }
+}, {
+ title: {
+ zh: '列表渲染',
+ en: 'List Rendering'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/list.html',
+ en: 'https://vuejs.org/v2/guide/list.html'
+ }
+}, {
+ title: {
+ zh: '事件处理',
+ en: 'Event Handling'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/events.html',
+ en: 'https://vuejs.org/v2/guide/events.html'
+ }
+}, {
+ title: {
+ zh: '表单输入绑定',
+ en: 'Form Input Bindings'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/forms.html',
+ en: 'https://vuejs.org/v2/guide/forms.html'
+ }
+}, {
+ title: {
+ zh: 'Vue 实例',
+ en: 'The Vue Instance'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/instance.html',
+ en: 'https://vuejs.org/v2/guide/instance.html'
+ }
+}, {
+ title: {
+ zh: '在 Weex 中使用 Vue.js',
+ en: 'Use Vue.js on Weex'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/guide/use-vue.html',
+ en: 'http://weex-project.io/guide/use-vue.html'
+ }
+}, {
+ title: {
+ zh: '混合(mixins)',
+ en: 'Mixins'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/mixins.html',
+ en: 'https://vuejs.org/v2/guide/mixins.html'
+ }
+}, {
+ title: {
+ zh: '过滤器(filters)',
+ en: 'Filters'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/filters.html',
+ en: 'https://vuejs.org/v2/guide/filters.html'
+ }
+}, {
+ title: {
+ zh: '插件(plugins)',
+ en: 'Plugins'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/plugins.html',
+ en: 'https://vuejs.org/v2/guide/plugins.html'
+ }
+}, {
+ title: {
+ zh: '自定义指令',
+ en: 'Custom Directives'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/custom-directive.html',
+ en: 'https://vuejs.org/v2/guide/custom-directive.html'
+ }
+}, {
+ title: {
+ zh: '状态管理',
+ en: 'State Management'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/state-management.html',
+ en: 'https://vuejs.org/v2/guide/state-management.html'
+ }
+}, {
+ title: {
+ zh: '深入响应式原理',
+ en: 'Reactivity in Depth'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/reactivity.html',
+ en: 'https://vuejs.org/v2/guide/reactivity.html'
+ }
+}, {
+ title: {
+ zh: '渲染函数',
+ en: 'Render Functions'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/render-function.html',
+ en: 'https://vuejs.org/v2/guide/render-function.html'
+ }
+}, {
+ title: {
+ zh: 'TypeScript 支持',
+ en: 'TypeScript Support'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/typescript.html',
+ en: 'https://vuejs.org/v2/guide/typescript.html'
+ }
+}, {
+ title: 'API',
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/api/',
+ en: 'https://vuejs.org/v2/api/'
+ }
+}]), _ref), (_ref2 = {
+ subject: 'javascript',
+ mainColor: '#F7BD2A',
+ title: { zh: '学习 Javascript', en: 'Learn Javascript' },
+ poster: 'https://gw.alicdn.com/tfs/TB1bT98hMoQMeJjy0FpXXcTxpXa-1500-700.png',
+ posterBg: '#FAF3EB',
+ posterStyle: {
+ width: '750px',
+ height: '350px'
+ }
+}, (0, _defineProperty3.default)(_ref2, 'title', {
+ zh: '学习 Javascript',
+ en: 'Learn Javascript'
+}), (0, _defineProperty3.default)(_ref2, 'copyright', {
+ zh: '来自 MDN (Mozilla Developer Network)',
+ en: 'From MDN (Mozilla Developer Network)'
+}), (0, _defineProperty3.default)(_ref2, 'lessons', [{
+ title: {
+ zh: '什么是 Javascript ?',
+ en: 'What is Javascript ?'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/What_is_JavaScript',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/What_is_JavaScript'
+ }
+}, {
+ title: {
+ zh: 'JavaScript基础',
+ en: 'JavaScript basics'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/Getting_started_with_the_web/JavaScript_basics',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/Getting_started_with_the_web/JavaScript_basics'
+ }
+}, {
+ title: {
+ zh: '重新介绍 JavaScript',
+ en: 'A re-introduction to JavaScript'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/A_re-introduction_to_JavaScript',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript'
+ }
+}, {
+ title: {
+ zh: '语法和数据类型',
+ en: 'Grammar and types'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Grammar_and_types#Variable_scope',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Variable_scope'
+ }
+}, {
+ title: {
+ zh: '数据类型和数据结构',
+ en: 'Data types and data structures'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures'
+ }
+}, {
+ title: {
+ zh: '变量',
+ en: 'Variables'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/Variables',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Variables'
+ }
+}, {
+ title: {
+ zh: '数字和操作符',
+ en: 'Numbers and operators'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/Math',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Math'
+ }
+}, {
+ title: {
+ zh: '字符串',
+ en: 'Handling text'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/Strings',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Strings'
+ }
+}, {
+ title: {
+ zh: '常用的 String 方法',
+ en: 'Useful string methods'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/Useful_string_methods',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Useful_string_methods'
+ }
+}, {
+ title: {
+ zh: '数组',
+ en: 'Arrays'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/Arrays',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Arrays'
+ }
+}, {
+ title: {
+ zh: '函数',
+ en: 'Functions'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Functions',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions'
+ }
+}, {
+ title: {
+ zh: 'JavaScript 对象基础',
+ en: 'JavaScript object basics'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/Basics',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Basics'
+ }
+}, {
+ title: {
+ zh: '使用对象',
+ en: 'Working with objects'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Working_with_Objects',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects'
+ }
+}, {
+ title: {
+ zh: '使用 JSON 数据',
+ en: 'Working with JSON'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/JSON',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/JSON'
+ }
+}, {
+ title: {
+ zh: '对象模型的细节',
+ en: 'Details of the object model'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Details_of_the_Object_Model',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Details_of_the_Object_Model'
+ }
+}, {
+ title: {
+ zh: '对象原型',
+ en: 'Object prototypes'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object_prototypes',
+ en: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/Object_prototypes'
+ }
+}, {
+ title: {
+ zh: 'JavaScript 中的继承',
+ en: 'Inheritance in JavaScript'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/Inheritance',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Inheritance'
+ }
+}, {
+ title: {
+ zh: '继承与原型链',
+ en: 'Inheritance and the prototype chain'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain'
+ }
+}, {
+ title: {
+ zh: '严格模式',
+ en: 'Strict mode'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Strict_mode',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode'
+ }
+}, {
+ title: {
+ zh: '内存管理',
+ en: 'Memory Management'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Memory_Management',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management'
+ }
+}, {
+ title: {
+ zh: '并发模型与事件循环',
+ en: 'Concurrency model and Event Loop'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/EventLoop',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop'
+ }
+}, {
+ // title: {
+ // zh: '索引集合类',
+ // en: 'Indexed collections'
+ // },
+ // docLink: {
+ // zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Indexed_collections',
+ // en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Indexed_collections'
+ // }
+ // }, {
+ // title: {
+ // zh: '带键的集合',
+ // en: 'Keyed collections'
+ // },
+ // docLink: {
+ // zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Keyed_collections',
+ // en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Keyed_collections'
+ // }
+ // }, {
+ title: {
+ zh: 'JavaScript 标准库',
+ en: 'Standard built-in objects'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects'
+ }
+}]), _ref2), (_ref3 = {
+ subject: 'css',
+ mainColor: '#F56FC6',
+ title: { zh: '学习 CSS', en: 'Learn CSS' },
+ titleColor: '#FFFFFF',
+ poster: 'https://gw.alicdn.com/tfs/TB1k6anhMMPMeJjy1XdXXasrXXa-427-190.jpg',
+ posterBg: '#FFA2DE',
+ posterStyle: {
+ width: '517px',
+ height: '230px'
+ }
+}, (0, _defineProperty3.default)(_ref3, 'title', {
+ zh: '学习 CSS',
+ en: 'Learn CSS'
+}), (0, _defineProperty3.default)(_ref3, 'copyright', {
+ zh: '来自 MDN (Mozilla Developer Network)',
+ en: 'From MDN (Mozilla Developer Network)'
+}), (0, _defineProperty3.default)(_ref3, 'lessons', [{
+ title: {
+ zh: '什么是 CSS ?',
+ en: 'What is CSS ?'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Getting_started/What_is_CSS',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_started/What_is_CSS'
+ }
+}, {
+ title: {
+ zh: 'CSS 语法',
+ en: 'CSS Syntax'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/CSS/Introduction_to_CSS/Syntax',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/CSS/Introduction_to_CSS/Syntax'
+ }
+}, {
+ title: {
+ zh: 'CSS的值和单位',
+ en: 'CSS Values and Units'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/CSS/Introduction_to_CSS/Values_and_units',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/CSS/Introduction_to_CSS/Values_and_units'
+ }
+}, {
+ title: {
+ zh: '盒模型',
+ en: 'The Box Model'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/CSS/Introduction_to_CSS/Box_model',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/CSS/Introduction_to_CSS/Box_model'
+ }
+}, {
+ title: {
+ zh: '盒模型的属性',
+ en: 'Box Model Properties'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Box_Model',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Box_Model'
+ }
+}, {
+ title: {
+ zh: '定位布局',
+ en: 'Positioning'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/CSS/CSS_layout/%E5%AE%9A%E4%BD%8Dx',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/positioning'
+ }
+}, {
+ title: {
+ zh: '定位布局的属性',
+ en: 'CSS Positioning'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Positioning',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning'
+ }
+}, {
+ title: {
+ zh: 'Flexbox 布局',
+ en: 'Flexbox Layout'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/CSS/CSS_layout/Flexbox',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Flexbox'
+ }
+}, {
+ title: {
+ zh: 'Flexbox 布局的属性',
+ en: 'CSS Flexible Box Layout'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Flexible_Box_Layout',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout'
+ }
+}, {
+ title: {
+ zh: 'Weex 中的通用样式',
+ en: 'Common Styles in Weex'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/references/common-style.html',
+ en: 'http://weex-project.io/references/common-style.html'
+ }
+}, {
+ title: {
+ zh: 'Weex 中的文本样式',
+ en: 'Text Styles in Weex'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/references/text-style.html',
+ en: 'http://weex-project.io/references/text-style.html'
+ }
+}, {
+ title: {
+ zh: '块格式化上下文(BFC)',
+ en: 'Block Formatting Context'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Block_formatting_context',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Block_formatting_context'
+ }
+}, {
+ title: {
+ zh: '视觉格式化模型',
+ en: 'Visual Formatting Model'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Visual_formatting_model',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Visual_formatting_model'
+ }
+}, {
+ title: 'CSS Reference',
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/CSS/Reference',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/CSS/Reference'
+ }
+}]), _ref3)];
+
+/***/ }),
+/* 78 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = true;
+
+var _defineProperty = __webpack_require__(79);
+
+var _defineProperty2 = _interopRequireDefault(_defineProperty);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+exports.default = function (obj, key, value) {
+ if (key in obj) {
+ (0, _defineProperty2.default)(obj, key, {
+ value: value,
+ enumerable: true,
+ configurable: true,
+ writable: true
+ });
+ } else {
+ obj[key] = value;
+ }
+
+ return obj;
+};
+
+/***/ }),
+/* 79 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(80), __esModule: true };
+
+/***/ }),
+/* 80 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(81);
+var $Object = __webpack_require__(4).Object;
+module.exports = function defineProperty(it, key, desc) {
+ return $Object.defineProperty(it, key, desc);
+};
+
+
+/***/ }),
+/* 81 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $export = __webpack_require__(16);
+// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)
+$export($export.S + $export.F * !__webpack_require__(2), 'Object', { defineProperty: __webpack_require__(1).f });
+
+
+/***/ }),
+/* 82 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __vue_exports__, __vue_options__
+var __vue_styles__ = []
+
+/* styles */
+__vue_styles__.push(__webpack_require__(83)
+)
+
+/* script */
+__vue_exports__ = __webpack_require__(84)
+
+/* template */
+var __vue_template__ = __webpack_require__(85)
+__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+if (
+ typeof __vue_exports__.default === "object" ||
+ typeof __vue_exports__.default === "function"
+) {
+if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+__vue_options__ = __vue_exports__ = __vue_exports__.default
+}
+if (typeof __vue_options__ === "function") {
+ __vue_options__ = __vue_options__.options
+}
+__vue_options__.__file = "/Users/kw/github/weex-vue-examples/src/components/AppInfoCard.vue"
+__vue_options__.render = __vue_template__.render
+__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+__vue_options__._scopeId = "data-v-0ba305b6"
+__vue_options__.style = __vue_options__.style || {}
+__vue_styles__.forEach(function (module) {
+ for (var name in module) {
+ __vue_options__.style[name] = module[name]
+ }
+})
+if (typeof __register_static_styles__ === "function") {
+ __register_static_styles__(__vue_options__._scopeId, __vue_styles__)
+}
+
+module.exports = __vue_exports__
+
+
+/***/ }),
+/* 83 */
+/***/ (function(module, exports) {
+
+module.exports = {
+ "card": {
+ "width": "650",
+ "justifyContent": "center",
+ "borderWidth": "1",
+ "borderColor": "#DDDDDD",
+ "borderRadius": "20",
+ "paddingTop": "50",
+ "paddingRight": "50",
+ "paddingBottom": "50",
+ "paddingLeft": "50",
+ "marginTop": "50",
+ "marginRight": "50",
+ "marginBottom": "50",
+ "marginLeft": "50",
+ "backgroundColor": "#FFFFFF"
+ },
+ "title": {
+ "fontSize": "34",
+ "textAlign": "center",
+ "color": "#808080",
+ "marginBottom": "20"
+ },
+ "version": {
+ "fontSize": "80",
+ "textAlign": "center",
+ "marginBottom": "30",
+ "color": "#323232"
+ },
+ "group": {
+ "marginTop": "10",
+ "flexDirection": "row"
+ },
+ "label": {
+ "width": "260",
+ "fontSize": "32",
+ "textAlign": "right",
+ "color": "#888888"
+ },
+ "value": {
+ "width": "230",
+ "paddingLeft": "50",
+ "fontSize": "32",
+ "color": "#414141"
+ }
+}
+
+/***/ }),
+/* 84 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _typeof2 = __webpack_require__(28);
+
+var _typeof3 = _interopRequireDefault(_typeof2);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+var invalid = '- invalid -';
+var unknown = '- - -';
+exports.default = {
+ data: function data() {
+ return {
+ version: invalid,
+ jsfmVersion: invalid,
+ platform: invalid,
+ osVersion: invalid,
+ deviceModel: invalid
+ };
+ },
+ created: function created() {
+ try {
+ this.jsfmVersion = getJSFMVersion();
+ } catch (e) {
+ this.jsfmVersion = '≤ 0.15.6';
+ }
+ if ((typeof WXEnvironment === 'undefined' ? 'undefined' : (0, _typeof3.default)(WXEnvironment)) === 'object') {
+ this.version = WXEnvironment.weexVersion || unknown;
+ this.platform = WXEnvironment.platform || unknown;
+ this.osVersion = WXEnvironment.osVersion || unknown;
+ this.deviceModel = WXEnvironment.deviceModel || unknown;
+ }
+ }
+};
+
+/***/ }),
+/* 85 */
+/***/ (function(module, exports) {
+
+module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+ return _c('div', {
+ staticClass: ["card"]
+ }, [_c('div', {
+ staticClass: ["info"]
+ }, [_c('text', {
+ staticClass: ["title"]
+ }, [_vm._v("Weex SDK Version")]), _c('text', {
+ staticClass: ["version"]
+ }, [_vm._v(_vm._s(_vm.version))]), _c('div', {
+ staticClass: ["group"]
+ }, [_c('text', {
+ staticClass: ["label"]
+ }, [_vm._v("JS Framework")]), _c('text', {
+ staticClass: ["value"]
+ }, [_vm._v(_vm._s(_vm.jsfmVersion))])]), _c('div', {
+ staticClass: ["group"]
+ }, [_c('text', {
+ staticClass: ["label"]
+ }, [_vm._v("platform")]), _c('text', {
+ staticClass: ["value"]
+ }, [_vm._v(_vm._s(_vm.platform))])]), _c('div', {
+ staticClass: ["group"]
+ }, [_c('text', {
+ staticClass: ["label"]
+ }, [_vm._v("osVersion")]), _c('text', {
+ staticClass: ["value"]
+ }, [_vm._v(_vm._s(_vm.osVersion))])]), _c('div', {
+ staticClass: ["group"]
+ }, [_c('text', {
+ staticClass: ["label"]
+ }, [_vm._v("deviceModel")]), _c('text', {
+ staticClass: ["value"]
+ }, [_vm._v(_vm._s(_vm.deviceModel))])])])])
+},staticRenderFns: []}
+module.exports.render._withStripped = true
+
+/***/ }),
+/* 86 */
+/***/ (function(module, exports) {
+
+module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+ return _c('list', {
+ staticClass: ["list"]
+ }, [_c('cell', {
+ appendAsTree: true,
+ attrs: {
+ "append": "tree"
+ }
+ }, [_c('app-info-card')], 1), _vm._l((_vm.aboutApp), function(item, i) {
+ return _c('cell', {
+ key: i,
+ class: ['item-cell', ("item-cell-" + (i+1))],
+ appendAsTree: true,
+ attrs: {
+ "append": "tree"
+ }
+ }, [(item.link) ? _c('div', {
+ class: ['item', ("item-" + (i+1))],
+ on: {
+ "click": function($event) {
+ _vm.jumpTo(item.link, _vm.i18n(item.title))
+ }
+ }
+ }, [_c('text', {
+ staticClass: ["item-title"]
+ }, [_vm._v(_vm._s(_vm.i18n(item.title)))]), _c('image', {
+ staticClass: ["arrow-icon"],
+ attrs: {
+ "src": "https://gw.alicdn.com/tfs/TB1iL2fkLDH8KJjy1XcXXcpdXXa-32-49.png"
+ }
+ })]) : _vm._e()])
+ }), _c('cell', {
+ staticClass: ["item-cell"],
+ appendAsTree: true,
+ attrs: {
+ "append": "tree"
+ }
+ }, [_c('div', {
+ staticClass: ["item"],
+ on: {
+ "click": _vm.chooseLanguage
+ }
+ }, [_c('text', {
+ staticClass: ["item-title"]
+ }, [_vm._v(_vm._s(_vm.i18n(_vm.dict.LANGUAGE)))]), _c('text', {
+ staticClass: ["item-value"]
+ }, [_vm._v(_vm._s(_vm.languageName))])])]), _vm._m(0)], 2)
+},staticRenderFns: [function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+ return _c('cell', {
+ appendAsTree: true,
+ attrs: {
+ "append": "tree"
+ }
+ }, [_c('div', {
+ staticClass: ["copyright"]
+ }, [_c('text', {
+ staticClass: ["copyright-text"]
+ }, [_vm._v("Copyright(c) 2017 The Apache Software Foundation.")]), _c('text', {
+ staticClass: ["copyright-text"]
+ }, [_vm._v("Licensed under the Apache License, Version 2.0")])])])
+}]}
+module.exports.render._withStripped = true
+
+/***/ })
+/******/ ]);
\ No newline at end of file
diff --git a/android/playground/src/main/assets/examples.weex.js b/android/playground/src/main/assets/examples.weex.js
new file mode 100644
index 0000000..68d81c8
--- /dev/null
+++ b/android/playground/src/main/assets/examples.weex.js
@@ -0,0 +1,2598 @@
+// { "framework": "Vue" }
+"use weex:vue";
+
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 37);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports) {
+
+// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
+var global = module.exports = typeof window != 'undefined' && window.Math == Math
+ ? window : typeof self != 'undefined' && self.Math == Math ? self
+ // eslint-disable-next-line no-new-func
+ : Function('return this')();
+if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports) {
+
+var hasOwnProperty = {}.hasOwnProperty;
+module.exports = function (it, key) {
+ return hasOwnProperty.call(it, key);
+};
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dP = __webpack_require__(3);
+var createDesc = __webpack_require__(12);
+module.exports = __webpack_require__(4) ? function (object, key, value) {
+ return dP.f(object, key, createDesc(1, value));
+} : function (object, key, value) {
+ object[key] = value;
+ return object;
+};
+
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var anObject = __webpack_require__(10);
+var IE8_DOM_DEFINE = __webpack_require__(29);
+var toPrimitive = __webpack_require__(17);
+var dP = Object.defineProperty;
+
+exports.f = __webpack_require__(4) ? Object.defineProperty : function defineProperty(O, P, Attributes) {
+ anObject(O);
+ P = toPrimitive(P, true);
+ anObject(Attributes);
+ if (IE8_DOM_DEFINE) try {
+ return dP(O, P, Attributes);
+ } catch (e) { /* empty */ }
+ if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
+ if ('value' in Attributes) O[P] = Attributes.value;
+ return O;
+};
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// Thank's IE8 for his funny defineProperty
+module.exports = !__webpack_require__(11)(function () {
+ return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
+});
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// to indexed object, toObject with fallback for non-array-like ES3 strings
+var IObject = __webpack_require__(51);
+var defined = __webpack_require__(16);
+module.exports = function (it) {
+ return IObject(defined(it));
+};
+
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var store = __webpack_require__(21)('wks');
+var uid = __webpack_require__(13);
+var Symbol = __webpack_require__(0).Symbol;
+var USE_SYMBOL = typeof Symbol == 'function';
+
+var $exports = module.exports = function (name) {
+ return store[name] || (store[name] =
+ USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
+};
+
+$exports.store = store;
+
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports) {
+
+var core = module.exports = { version: '2.5.7' };
+if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
+
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports) {
+
+module.exports = function (it) {
+ return typeof it === 'object' ? it !== null : typeof it === 'function';
+};
+
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports) {
+
+module.exports = true;
+
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(8);
+module.exports = function (it) {
+ if (!isObject(it)) throw TypeError(it + ' is not an object!');
+ return it;
+};
+
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports) {
+
+module.exports = function (exec) {
+ try {
+ return !!exec();
+ } catch (e) {
+ return true;
+ }
+};
+
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports) {
+
+module.exports = function (bitmap, value) {
+ return {
+ enumerable: !(bitmap & 1),
+ configurable: !(bitmap & 2),
+ writable: !(bitmap & 4),
+ value: value
+ };
+};
+
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports) {
+
+var id = 0;
+var px = Math.random();
+module.exports = function (key) {
+ return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
+};
+
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.fetchNews = exports.fetchDoodle = exports.readAbout = exports.saveAbout = exports.fetchAbout = exports.readGuide = exports.saveGuide = exports.fetchGuide = exports.readExamples = exports.saveExamples = exports.fetchExamples = undefined;
+
+var _stringify = __webpack_require__(40);
+
+var _stringify2 = _interopRequireDefault(_stringify);
+
+var _typeof2 = __webpack_require__(42);
+
+var _typeof3 = _interopRequireDefault(_typeof2);
+
+exports.createLink = createLink;
+exports.createURL = createURL;
+exports.i18n = i18n;
+exports.parseLanguage = parseLanguage;
+exports.setLanguage = setLanguage;
+exports.clearStorageLanguage = clearStorageLanguage;
+exports.getStorageLanguage = getStorageLanguage;
+exports.getSystemLanguage = getSystemLanguage;
+exports.getLanguage = getLanguage;
+exports.jumpTo = jumpTo;
+exports.viewSource = viewSource;
+exports.setTitleBar = setTitleBar;
+exports.fetchData = fetchData;
+exports.saveData = saveData;
+exports.readData = readData;
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var stream = weex.requireModule('stream');
+var storage = weex.requireModule('storage');
+var navigator = weex.requireModule('navigator');
+
+var encoder = typeof encodeURIComponent === 'function' ? encodeURIComponent : typeof encodeURI === 'function' ? encodeURI : function (x) {
+ return x;
+};
+
+function encodeParams(params) {
+ if (!params || (typeof params === 'undefined' ? 'undefined' : (0, _typeof3.default)(params)) !== 'object') {
+ return '';
+ }
+ var array = [];
+ for (var key in params) {
+ if (typeof params[key] === 'string') {
+ array.push(encoder(key) + '=' + encoder(params[key]));
+ }
+ }
+ return array.join('&');
+}
+
+function createLink(name) {
+ var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var args = [];
+ for (var key in params) {
+ if (typeof params[key] === 'string') {
+ args.push(encoder(key) + '=' + encoder(params[key]));
+ }
+ }
+ if (WXEnvironment.platform === 'Web') {
+ args.unshift('page=' + name + '.web.js');
+ return '/?' + args.join('&');
+ }
+ var base = getBaseURL();
+ return '' + base + name + '.weex.js' + (args.length ? '?' + args.join('&') : '');
+}
+
+function createURL(hash, params) {
+ if (WXEnvironment.platform === 'Web') {
+ return 'http://dotwe.org/raw/htmlVue/' + hash;
+ }
+ var url = 'http://dotwe.org/raw/dist/' + hash + '.bundle.wx';
+ var paramString = encodeParams(params);
+ if (WXEnvironment.appName === 'TB') {
+ return url + '?_wx_tpl=' + url + '&' + paramString;
+ }
+ if (WXEnvironment.appName === 'WXSample') {
+ return url + '?' + paramString;
+ }
+ return url + '?wx_weex=true&' + paramString;
+}
+
+function getBaseURL() {
+ var bundleUrl = weex.config.bundleUrl;
+ var isAndroidAssets = bundleUrl.indexOf('your_current_IP') >= 0 || bundleUrl.indexOf('file://assets/') >= 0;
+ var isiOSAssets = bundleUrl.indexOf('file:///') >= 0 && bundleUrl.indexOf('WeexDemo.app') > 0;
+ if (isAndroidAssets) {
+ return 'file://assets/';
+ } else if (isiOSAssets) {
+ // file:///var/mobile/Containers/Bundle/Application/{id}/WeexDemo.app/
+ // file:///Users/{user}/Library/Developer/CoreSimulator/Devices/{id}/data/Containers/Bundle/Application/{id}/WeexDemo.app/
+ return bundleUrl.substring(0, bundleUrl.lastIndexOf('/') + 1);
+ }
+ return '';
+}
+
+function i18n(text, language) {
+ if (typeof text === 'string') {
+ return text;
+ }
+ if (Object.prototype.toString.call(text) === '[object Object]') {
+ var lang = this && this.language || language || 'en';
+ return text[lang];
+ }
+}
+
+var supportedLanguageRE = /(en|zh)\_?\w*/i;
+function parseLanguage(language) {
+ var match = supportedLanguageRE.exec(language + '');
+ if (match && match[1]) {
+ return match[1];
+ }
+ return '';
+}
+
+function setLanguage(language) {
+ var lang = parseLanguage(language);
+ if (lang) {
+ storage.setItem('WEEX_PLAYGROUND_LANGUAGE', lang);
+ }
+}
+
+function clearStorageLanguage() {
+ storage.removeItem('WEEX_PLAYGROUND_LANGUAGE');
+}
+
+function getStorageLanguage(done) {
+ var fail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+
+ if (!(typeof done === 'undefined' ? 'undefined' : (0, _typeof3.default)(done)) === 'function') {
+ return;
+ }
+ try {
+ storage.getItem('WEEX_PLAYGROUND_LANGUAGE', function (event) {
+ if (event.result === 'success') {
+ var lang = parseLanguage(event.data);
+ lang ? done(lang) : fail();
+ } else {
+ fail(event);
+ }
+ });
+ } catch (err) {
+ fail(err);
+ }
+}
+
+function getSystemLanguage(done) {
+ var fail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+
+ if (!(typeof done === 'undefined' ? 'undefined' : (0, _typeof3.default)(done)) === 'function') {
+ return;
+ }
+ if (WXEnvironment.platform.toLowerCase() === 'web') {
+ var lang = parseLanguage(window.navigator.language);
+ lang ? done(lang) : fail();
+ } else {
+ try {
+ var locale = weex.requireModule('locale') || weex.requireModule('local');
+ var useSync = false;
+ var resSync = locale.getLanguage(function (language) {
+ var lang = parseLanguage(language);
+ if (lang) {
+ useSync || done(lang);
+ } else {
+ fail();
+ }
+ });
+ var langSync = parseLanguage(resSync);
+ if (langSync) {
+ useSync = true;
+ done(langSync);
+ } else {
+ fail();
+ }
+ } catch (e) {
+ fail(e);
+ }
+ }
+}
+
+var languageRE = /.+[\?\&]{1}language=([\d\w]+)[\?\&]?.*/i;
+function getLanguage() {
+ var done = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
+
+ var match = languageRE.exec(weex.config.bundleUrl || '');
+ var lang = parseLanguage(match && match[1]);
+ if (lang) {
+ done(lang);
+ } else {
+ getStorageLanguage(done, function () {
+ getSystemLanguage(done, function () {
+ done('en');
+ });
+ });
+ }
+}
+
+function jumpTo(url, title, lang) {
+ getLanguage(function (language) {
+ storage.setItem('CURRENT_DOCUMENT_URL', i18n(url, lang || language));
+ navigator.push({
+ url: createURL('bf0305c14b511b24a4e616f53926432b', { language: language, title: i18n(title, lang || language) })
+ });
+ });
+}
+
+function viewSource(hash) {
+ getLanguage(function (language) {
+ navigator.push({
+ url: createURL('f6ce29faf686eabc38b410bf4828fa5a', { hash: hash, language: language })
+ });
+ });
+}
+
+function setTitleBar(options) {
+ var language = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en';
+
+ if (Object.prototype.toString.apply(options) !== '[object Object]') {
+ return;
+ }
+ var titleBar = weex.requireModule('titleBar');
+ if (options.color || options.backgroundColor) {
+ try {
+ titleBar.setStyle({
+ foregroundColor: options.color || '#FFFFFF',
+ backgroundColor: options.backgroundColor || '#00B4FF'
+ });
+ } catch (e) {}
+ }
+ var title = i18n(options.title, language);
+ if (title) {
+ try {
+ titleBar.setTitle(title);
+ } catch (e) {}
+ }
+}
+
+var storageKeys = {
+ doodle: 'WEEX_PLAYGROUND_APP_DOODLE',
+ guide: 'WEEX_PLAYGROUND_APP_GUIDE',
+ examples: 'WEEX_PLAYGROUND_APP_EXAMPLES',
+ news: 'WEEX_PLAYGROUND_APP_NEWS',
+ about: 'WEEX_PLAYGROUND_APP_ABOUT'
+};
+function fetchData(name) {
+ var done = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+ var fail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
+
+ try {
+ stream.fetch({
+ url: 'http://dotwe.org/query/weex-playground-app',
+ method: 'post',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded'
+ },
+ type: 'json',
+ body: 'name=' + name
+ }, function (res) {
+ if (res.ok && res.data && res.data.success) {
+ done(res.data);
+ } else {
+ fail(res);
+ }
+ });
+ } catch (err) {
+ fail(err);
+ }
+}
+function saveData(name, result) {
+ var key = storageKeys[name];
+ if (!key) return;
+ if (result && (typeof result === 'undefined' ? 'undefined' : (0, _typeof3.default)(result)) === 'object') {
+ result.timestamp = Date.now();
+ storage.setItem(key, (0, _stringify2.default)(result));
+ }
+}
+function readData(name) {
+ var done = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+ var fail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
+
+ var key = storageKeys[name];
+ if (!key) return fail();
+ try {
+ storage.getItem(key, function (event) {
+ if (event.result === 'success') {
+ var result = JSON.parse(event.data);
+ if (result && Array.isArray(result[name])) {
+ return done(result[name]);
+ }
+ }
+ fail(event);
+ });
+ } catch (e) {
+ fail(e);
+ }
+}
+
+var fetchExamples = exports.fetchExamples = function fetchExamples() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ return fetchData.apply(undefined, ['examples'].concat(args));
+};
+var saveExamples = exports.saveExamples = function saveExamples() {
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ return saveData.apply(undefined, ['examples'].concat(args));
+};
+var readExamples = exports.readExamples = function readExamples() {
+ for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+ args[_key3] = arguments[_key3];
+ }
+
+ return readData.apply(undefined, ['examples'].concat(args));
+};
+
+var fetchGuide = exports.fetchGuide = function fetchGuide() {
+ for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
+ args[_key4] = arguments[_key4];
+ }
+
+ return fetchData.apply(undefined, ['guide'].concat(args));
+};
+var saveGuide = exports.saveGuide = function saveGuide() {
+ for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
+ args[_key5] = arguments[_key5];
+ }
+
+ return saveData.apply(undefined, ['guide'].concat(args));
+};
+var readGuide = exports.readGuide = function readGuide() {
+ for (var _len6 = arguments.length, args = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
+ args[_key6] = arguments[_key6];
+ }
+
+ return readData.apply(undefined, ['guide'].concat(args));
+};
+
+var fetchAbout = exports.fetchAbout = function fetchAbout() {
+ for (var _len7 = arguments.length, args = Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
+ args[_key7] = arguments[_key7];
+ }
+
+ return fetchData.apply(undefined, ['about'].concat(args));
+};
+var saveAbout = exports.saveAbout = function saveAbout() {
+ for (var _len8 = arguments.length, args = Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
+ args[_key8] = arguments[_key8];
+ }
+
+ return saveData.apply(undefined, ['about'].concat(args));
+};
+var readAbout = exports.readAbout = function readAbout() {
+ for (var _len9 = arguments.length, args = Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {
+ args[_key9] = arguments[_key9];
+ }
+
+ return readData.apply(undefined, ['about'].concat(args));
+};
+
+var fetchDoodle = exports.fetchDoodle = function fetchDoodle() {
+ for (var _len10 = arguments.length, args = Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {
+ args[_key10] = arguments[_key10];
+ }
+
+ return fetchData.apply(undefined, ['doodle'].concat(args));
+};
+var fetchNews = exports.fetchNews = function fetchNews() {
+ for (var _len11 = arguments.length, args = Array(_len11), _key11 = 0; _key11 < _len11; _key11++) {
+ args[_key11] = arguments[_key11];
+ }
+
+ return fetchData.apply(undefined, ['news'].concat(args));
+};
+
+/***/ }),
+/* 15 */
+/***/ (function(module, exports) {
+
+// 7.1.4 ToInteger
+var ceil = Math.ceil;
+var floor = Math.floor;
+module.exports = function (it) {
+ return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
+};
+
+
+/***/ }),
+/* 16 */
+/***/ (function(module, exports) {
+
+// 7.2.1 RequireObjectCoercible(argument)
+module.exports = function (it) {
+ if (it == undefined) throw TypeError("Can't call method on " + it);
+ return it;
+};
+
+
+/***/ }),
+/* 17 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.1 ToPrimitive(input [, PreferredType])
+var isObject = __webpack_require__(8);
+// instead of the ES6 spec version, we didn't implement @@toPrimitive case
+// and the second argument - flag - preferred type is a string
+module.exports = function (it, S) {
+ if (!isObject(it)) return it;
+ var fn, val;
+ if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+ if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;
+ if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+ throw TypeError("Can't convert object to primitive value");
+};
+
+
+/***/ }),
+/* 18 */
+/***/ (function(module, exports) {
+
+module.exports = {};
+
+
+/***/ }),
+/* 19 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.14 / 15.2.3.14 Object.keys(O)
+var $keys = __webpack_require__(33);
+var enumBugKeys = __webpack_require__(22);
+
+module.exports = Object.keys || function keys(O) {
+ return $keys(O, enumBugKeys);
+};
+
+
+/***/ }),
+/* 20 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var shared = __webpack_require__(21)('keys');
+var uid = __webpack_require__(13);
+module.exports = function (key) {
+ return shared[key] || (shared[key] = uid(key));
+};
+
+
+/***/ }),
+/* 21 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var core = __webpack_require__(7);
+var global = __webpack_require__(0);
+var SHARED = '__core-js_shared__';
+var store = global[SHARED] || (global[SHARED] = {});
+
+(module.exports = function (key, value) {
+ return store[key] || (store[key] = value !== undefined ? value : {});
+})('versions', []).push({
+ version: core.version,
+ mode: __webpack_require__(9) ? 'pure' : 'global',
+ copyright: '© 2018 Denis Pushkarev (zloirock.ru)'
+});
+
+
+/***/ }),
+/* 22 */
+/***/ (function(module, exports) {
+
+// IE 8- don't enum bug keys
+module.exports = (
+ 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
+).split(',');
+
+
+/***/ }),
+/* 23 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var def = __webpack_require__(3).f;
+var has = __webpack_require__(1);
+var TAG = __webpack_require__(6)('toStringTag');
+
+module.exports = function (it, tag, stat) {
+ if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });
+};
+
+
+/***/ }),
+/* 24 */
+/***/ (function(module, exports, __webpack_require__) {
+
+exports.f = __webpack_require__(6);
+
+
+/***/ }),
+/* 25 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(0);
+var core = __webpack_require__(7);
+var LIBRARY = __webpack_require__(9);
+var wksExt = __webpack_require__(24);
+var defineProperty = __webpack_require__(3).f;
+module.exports = function (name) {
+ var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
+ if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });
+};
+
+
+/***/ }),
+/* 26 */
+/***/ (function(module, exports) {
+
+exports.f = {}.propertyIsEnumerable;
+
+
+/***/ }),
+/* 27 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var LIBRARY = __webpack_require__(9);
+var $export = __webpack_require__(28);
+var redefine = __webpack_require__(31);
+var hide = __webpack_require__(2);
+var Iterators = __webpack_require__(18);
+var $iterCreate = __webpack_require__(49);
+var setToStringTag = __webpack_require__(23);
+var getPrototypeOf = __webpack_require__(56);
+var ITERATOR = __webpack_require__(6)('iterator');
+var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
+var FF_ITERATOR = '@@iterator';
+var KEYS = 'keys';
+var VALUES = 'values';
+
+var returnThis = function () { return this; };
+
+module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
+ $iterCreate(Constructor, NAME, next);
+ var getMethod = function (kind) {
+ if (!BUGGY && kind in proto) return proto[kind];
+ switch (kind) {
+ case KEYS: return function keys() { return new Constructor(this, kind); };
+ case VALUES: return function values() { return new Constructor(this, kind); };
+ } return function entries() { return new Constructor(this, kind); };
+ };
+ var TAG = NAME + ' Iterator';
+ var DEF_VALUES = DEFAULT == VALUES;
+ var VALUES_BUG = false;
+ var proto = Base.prototype;
+ var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
+ var $default = $native || getMethod(DEFAULT);
+ var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
+ var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
+ var methods, key, IteratorPrototype;
+ // Fix native
+ if ($anyNative) {
+ IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));
+ if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
+ // Set @@toStringTag to native iterators
+ setToStringTag(IteratorPrototype, TAG, true);
+ // fix for some old engines
+ if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);
+ }
+ }
+ // fix Array#{values, @@iterator}.name in V8 / FF
+ if (DEF_VALUES && $native && $native.name !== VALUES) {
+ VALUES_BUG = true;
+ $default = function values() { return $native.call(this); };
+ }
+ // Define iterator
+ if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
+ hide(proto, ITERATOR, $default);
+ }
+ // Plug for library
+ Iterators[NAME] = $default;
+ Iterators[TAG] = returnThis;
+ if (DEFAULT) {
+ methods = {
+ values: DEF_VALUES ? $default : getMethod(VALUES),
+ keys: IS_SET ? $default : getMethod(KEYS),
+ entries: $entries
+ };
+ if (FORCED) for (key in methods) {
+ if (!(key in proto)) redefine(proto, key, methods[key]);
+ } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
+ }
+ return methods;
+};
+
+
+/***/ }),
+/* 28 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(0);
+var core = __webpack_require__(7);
+var ctx = __webpack_require__(47);
+var hide = __webpack_require__(2);
+var has = __webpack_require__(1);
+var PROTOTYPE = 'prototype';
+
+var $export = function (type, name, source) {
+ var IS_FORCED = type & $export.F;
+ var IS_GLOBAL = type & $export.G;
+ var IS_STATIC = type & $export.S;
+ var IS_PROTO = type & $export.P;
+ var IS_BIND = type & $export.B;
+ var IS_WRAP = type & $export.W;
+ var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
+ var expProto = exports[PROTOTYPE];
+ var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];
+ var key, own, out;
+ if (IS_GLOBAL) source = name;
+ for (key in source) {
+ // contains in native
+ own = !IS_FORCED && target && target[key] !== undefined;
+ if (own && has(exports, key)) continue;
+ // export native or passed
+ out = own ? target[key] : source[key];
+ // prevent global pollution for namespaces
+ exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
+ // bind timers to global for call from export context
+ : IS_BIND && own ? ctx(out, global)
+ // wrap global constructors for prevent change them in library
+ : IS_WRAP && target[key] == out ? (function (C) {
+ var F = function (a, b, c) {
+ if (this instanceof C) {
+ switch (arguments.length) {
+ case 0: return new C();
+ case 1: return new C(a);
+ case 2: return new C(a, b);
+ } return new C(a, b, c);
+ } return C.apply(this, arguments);
+ };
+ F[PROTOTYPE] = C[PROTOTYPE];
+ return F;
+ // make static versions for prototype methods
+ })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
+ // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
+ if (IS_PROTO) {
+ (exports.virtual || (exports.virtual = {}))[key] = out;
+ // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
+ if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);
+ }
+ }
+};
+// type bitmap
+$export.F = 1; // forced
+$export.G = 2; // global
+$export.S = 4; // static
+$export.P = 8; // proto
+$export.B = 16; // bind
+$export.W = 32; // wrap
+$export.U = 64; // safe
+$export.R = 128; // real proto method for `library`
+module.exports = $export;
+
+
+/***/ }),
+/* 29 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = !__webpack_require__(4) && !__webpack_require__(11)(function () {
+ return Object.defineProperty(__webpack_require__(30)('div'), 'a', { get: function () { return 7; } }).a != 7;
+});
+
+
+/***/ }),
+/* 30 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(8);
+var document = __webpack_require__(0).document;
+// typeof document.createElement is 'object' in old IE
+var is = isObject(document) && isObject(document.createElement);
+module.exports = function (it) {
+ return is ? document.createElement(it) : {};
+};
+
+
+/***/ }),
+/* 31 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(2);
+
+
+/***/ }),
+/* 32 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
+var anObject = __webpack_require__(10);
+var dPs = __webpack_require__(50);
+var enumBugKeys = __webpack_require__(22);
+var IE_PROTO = __webpack_require__(20)('IE_PROTO');
+var Empty = function () { /* empty */ };
+var PROTOTYPE = 'prototype';
+
+// Create object with fake `null` prototype: use iframe Object with cleared prototype
+var createDict = function () {
+ // Thrash, waste and sodomy: IE GC bug
+ var iframe = __webpack_require__(30)('iframe');
+ var i = enumBugKeys.length;
+ var lt = '<';
+ var gt = '>';
+ var iframeDocument;
+ iframe.style.display = 'none';
+ __webpack_require__(55).appendChild(iframe);
+ iframe.src = 'javascript:'; // eslint-disable-line no-script-url
+ // createDict = iframe.contentWindow.Object;
+ // html.removeChild(iframe);
+ iframeDocument = iframe.contentWindow.document;
+ iframeDocument.open();
+ iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
+ iframeDocument.close();
+ createDict = iframeDocument.F;
+ while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];
+ return createDict();
+};
+
+module.exports = Object.create || function create(O, Properties) {
+ var result;
+ if (O !== null) {
+ Empty[PROTOTYPE] = anObject(O);
+ result = new Empty();
+ Empty[PROTOTYPE] = null;
+ // add "__proto__" for Object.getPrototypeOf polyfill
+ result[IE_PROTO] = O;
+ } else result = createDict();
+ return Properties === undefined ? result : dPs(result, Properties);
+};
+
+
+/***/ }),
+/* 33 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var has = __webpack_require__(1);
+var toIObject = __webpack_require__(5);
+var arrayIndexOf = __webpack_require__(52)(false);
+var IE_PROTO = __webpack_require__(20)('IE_PROTO');
+
+module.exports = function (object, names) {
+ var O = toIObject(object);
+ var i = 0;
+ var result = [];
+ var key;
+ for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);
+ // Don't enum bug & hidden keys
+ while (names.length > i) if (has(O, key = names[i++])) {
+ ~arrayIndexOf(result, key) || result.push(key);
+ }
+ return result;
+};
+
+
+/***/ }),
+/* 34 */
+/***/ (function(module, exports) {
+
+var toString = {}.toString;
+
+module.exports = function (it) {
+ return toString.call(it).slice(8, -1);
+};
+
+
+/***/ }),
+/* 35 */
+/***/ (function(module, exports) {
+
+exports.f = Object.getOwnPropertySymbols;
+
+
+/***/ }),
+/* 36 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
+var $keys = __webpack_require__(33);
+var hiddenKeys = __webpack_require__(22).concat('length', 'prototype');
+
+exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
+ return $keys(O, hiddenKeys);
+};
+
+
+/***/ }),
+/* 37 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+__webpack_require__(38);
+
+var _Examples = __webpack_require__(73);
+
+var _Examples2 = _interopRequireDefault(_Examples);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// show title bar
+try {
+ var titleBar = weex.requireModule('titleBar');
+ titleBar.showTitleBar(true);
+} catch (e) {}
+
+_Examples2.default.el = '#root';
+new Vue(_Examples2.default);
+
+/***/ }),
+/* 38 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _mixin = __webpack_require__(39);
+
+var _mixin2 = _interopRequireDefault(_mixin);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// use shared mixins
+Vue.mixin(_mixin2.default);
+
+/***/ }),
+/* 39 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _index = __webpack_require__(14);
+
+var utils = _interopRequireWildcard(_index);
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
+
+var storage = weex.requireModule('storage');
+
+exports.default = {
+ filters: {
+ i18n: utils.i18n,
+ url: utils.createURL,
+ link: utils.createLink
+ },
+ methods: {
+ createLink: utils.createLink,
+ createURL: utils.createURL,
+ i18n: utils.i18n,
+ getLanguage: utils.getLanguage,
+ fetchData: utils.fetchData,
+ saveData: utils.saveData,
+ readData: utils.readData,
+ jumpTo: utils.jumpTo
+ },
+ created: function created() {
+ var _this = this;
+
+ // get and set language
+ utils.getLanguage(function (language) {
+ _this.language = language;
+ utils.setTitleBar(_this.navigationBarOptions, language);
+ });
+
+ // listen to the language change event
+ var channel = new BroadcastChannel('language');
+ channel.onmessage = function (event) {
+ if (event.data && event.data.language) {
+ _this.language = event.data.language;
+ }
+ };
+ },
+ beforeDestroy: function beforeDestroy() {
+ storage.removeItem('CURRENT_DOCUMENT_URL');
+ storage.removeItem('CURRENT_SOURCE_HASH');
+ }
+};
+
+/***/ }),
+/* 40 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(41), __esModule: true };
+
+/***/ }),
+/* 41 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var core = __webpack_require__(7);
+var $JSON = core.JSON || (core.JSON = { stringify: JSON.stringify });
+module.exports = function stringify(it) { // eslint-disable-line no-unused-vars
+ return $JSON.stringify.apply($JSON, arguments);
+};
+
+
+/***/ }),
+/* 42 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = true;
+
+var _iterator = __webpack_require__(43);
+
+var _iterator2 = _interopRequireDefault(_iterator);
+
+var _symbol = __webpack_require__(62);
+
+var _symbol2 = _interopRequireDefault(_symbol);
+
+var _typeof = typeof _symbol2.default === "function" && typeof _iterator2.default === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj; };
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.default) === "symbol" ? function (obj) {
+ return typeof obj === "undefined" ? "undefined" : _typeof(obj);
+} : function (obj) {
+ return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj);
+};
+
+/***/ }),
+/* 43 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(44), __esModule: true };
+
+/***/ }),
+/* 44 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(45);
+__webpack_require__(58);
+module.exports = __webpack_require__(24).f('iterator');
+
+
+/***/ }),
+/* 45 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $at = __webpack_require__(46)(true);
+
+// 21.1.3.27 String.prototype[@@iterator]()
+__webpack_require__(27)(String, 'String', function (iterated) {
+ this._t = String(iterated); // target
+ this._i = 0; // next index
+// 21.1.5.2.1 %StringIteratorPrototype%.next()
+}, function () {
+ var O = this._t;
+ var index = this._i;
+ var point;
+ if (index >= O.length) return { value: undefined, done: true };
+ point = $at(O, index);
+ this._i += point.length;
+ return { value: point, done: false };
+});
+
+
+/***/ }),
+/* 46 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(15);
+var defined = __webpack_require__(16);
+// true -> String#at
+// false -> String#codePointAt
+module.exports = function (TO_STRING) {
+ return function (that, pos) {
+ var s = String(defined(that));
+ var i = toInteger(pos);
+ var l = s.length;
+ var a, b;
+ if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
+ a = s.charCodeAt(i);
+ return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
+ ? TO_STRING ? s.charAt(i) : a
+ : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
+ };
+};
+
+
+/***/ }),
+/* 47 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// optional / simple context binding
+var aFunction = __webpack_require__(48);
+module.exports = function (fn, that, length) {
+ aFunction(fn);
+ if (that === undefined) return fn;
+ switch (length) {
+ case 1: return function (a) {
+ return fn.call(that, a);
+ };
+ case 2: return function (a, b) {
+ return fn.call(that, a, b);
+ };
+ case 3: return function (a, b, c) {
+ return fn.call(that, a, b, c);
+ };
+ }
+ return function (/* ...args */) {
+ return fn.apply(that, arguments);
+ };
+};
+
+
+/***/ }),
+/* 48 */
+/***/ (function(module, exports) {
+
+module.exports = function (it) {
+ if (typeof it != 'function') throw TypeError(it + ' is not a function!');
+ return it;
+};
+
+
+/***/ }),
+/* 49 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var create = __webpack_require__(32);
+var descriptor = __webpack_require__(12);
+var setToStringTag = __webpack_require__(23);
+var IteratorPrototype = {};
+
+// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
+__webpack_require__(2)(IteratorPrototype, __webpack_require__(6)('iterator'), function () { return this; });
+
+module.exports = function (Constructor, NAME, next) {
+ Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });
+ setToStringTag(Constructor, NAME + ' Iterator');
+};
+
+
+/***/ }),
+/* 50 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dP = __webpack_require__(3);
+var anObject = __webpack_require__(10);
+var getKeys = __webpack_require__(19);
+
+module.exports = __webpack_require__(4) ? Object.defineProperties : function defineProperties(O, Properties) {
+ anObject(O);
+ var keys = getKeys(Properties);
+ var length = keys.length;
+ var i = 0;
+ var P;
+ while (length > i) dP.f(O, P = keys[i++], Properties[P]);
+ return O;
+};
+
+
+/***/ }),
+/* 51 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// fallback for non-array-like ES3 and non-enumerable old V8 strings
+var cof = __webpack_require__(34);
+// eslint-disable-next-line no-prototype-builtins
+module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
+ return cof(it) == 'String' ? it.split('') : Object(it);
+};
+
+
+/***/ }),
+/* 52 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// false -> Array#indexOf
+// true -> Array#includes
+var toIObject = __webpack_require__(5);
+var toLength = __webpack_require__(53);
+var toAbsoluteIndex = __webpack_require__(54);
+module.exports = function (IS_INCLUDES) {
+ return function ($this, el, fromIndex) {
+ var O = toIObject($this);
+ var length = toLength(O.length);
+ var index = toAbsoluteIndex(fromIndex, length);
+ var value;
+ // Array#includes uses SameValueZero equality algorithm
+ // eslint-disable-next-line no-self-compare
+ if (IS_INCLUDES && el != el) while (length > index) {
+ value = O[index++];
+ // eslint-disable-next-line no-self-compare
+ if (value != value) return true;
+ // Array#indexOf ignores holes, Array#includes - not
+ } else for (;length > index; index++) if (IS_INCLUDES || index in O) {
+ if (O[index] === el) return IS_INCLUDES || index || 0;
+ } return !IS_INCLUDES && -1;
+ };
+};
+
+
+/***/ }),
+/* 53 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.15 ToLength
+var toInteger = __webpack_require__(15);
+var min = Math.min;
+module.exports = function (it) {
+ return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
+};
+
+
+/***/ }),
+/* 54 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(15);
+var max = Math.max;
+var min = Math.min;
+module.exports = function (index, length) {
+ index = toInteger(index);
+ return index < 0 ? max(index + length, 0) : min(index, length);
+};
+
+
+/***/ }),
+/* 55 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var document = __webpack_require__(0).document;
+module.exports = document && document.documentElement;
+
+
+/***/ }),
+/* 56 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
+var has = __webpack_require__(1);
+var toObject = __webpack_require__(57);
+var IE_PROTO = __webpack_require__(20)('IE_PROTO');
+var ObjectProto = Object.prototype;
+
+module.exports = Object.getPrototypeOf || function (O) {
+ O = toObject(O);
+ if (has(O, IE_PROTO)) return O[IE_PROTO];
+ if (typeof O.constructor == 'function' && O instanceof O.constructor) {
+ return O.constructor.prototype;
+ } return O instanceof Object ? ObjectProto : null;
+};
+
+
+/***/ }),
+/* 57 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.13 ToObject(argument)
+var defined = __webpack_require__(16);
+module.exports = function (it) {
+ return Object(defined(it));
+};
+
+
+/***/ }),
+/* 58 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(59);
+var global = __webpack_require__(0);
+var hide = __webpack_require__(2);
+var Iterators = __webpack_require__(18);
+var TO_STRING_TAG = __webpack_require__(6)('toStringTag');
+
+var DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +
+ 'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +
+ 'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +
+ 'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +
+ 'TextTrackList,TouchList').split(',');
+
+for (var i = 0; i < DOMIterables.length; i++) {
+ var NAME = DOMIterables[i];
+ var Collection = global[NAME];
+ var proto = Collection && Collection.prototype;
+ if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);
+ Iterators[NAME] = Iterators.Array;
+}
+
+
+/***/ }),
+/* 59 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var addToUnscopables = __webpack_require__(60);
+var step = __webpack_require__(61);
+var Iterators = __webpack_require__(18);
+var toIObject = __webpack_require__(5);
+
+// 22.1.3.4 Array.prototype.entries()
+// 22.1.3.13 Array.prototype.keys()
+// 22.1.3.29 Array.prototype.values()
+// 22.1.3.30 Array.prototype[@@iterator]()
+module.exports = __webpack_require__(27)(Array, 'Array', function (iterated, kind) {
+ this._t = toIObject(iterated); // target
+ this._i = 0; // next index
+ this._k = kind; // kind
+// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
+}, function () {
+ var O = this._t;
+ var kind = this._k;
+ var index = this._i++;
+ if (!O || index >= O.length) {
+ this._t = undefined;
+ return step(1);
+ }
+ if (kind == 'keys') return step(0, index);
+ if (kind == 'values') return step(0, O[index]);
+ return step(0, [index, O[index]]);
+}, 'values');
+
+// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
+Iterators.Arguments = Iterators.Array;
+
+addToUnscopables('keys');
+addToUnscopables('values');
+addToUnscopables('entries');
+
+
+/***/ }),
+/* 60 */
+/***/ (function(module, exports) {
+
+module.exports = function () { /* empty */ };
+
+
+/***/ }),
+/* 61 */
+/***/ (function(module, exports) {
+
+module.exports = function (done, value) {
+ return { value: value, done: !!done };
+};
+
+
+/***/ }),
+/* 62 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(63), __esModule: true };
+
+/***/ }),
+/* 63 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(64);
+__webpack_require__(70);
+__webpack_require__(71);
+__webpack_require__(72);
+module.exports = __webpack_require__(7).Symbol;
+
+
+/***/ }),
+/* 64 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// ECMAScript 6 symbols shim
+var global = __webpack_require__(0);
+var has = __webpack_require__(1);
+var DESCRIPTORS = __webpack_require__(4);
+var $export = __webpack_require__(28);
+var redefine = __webpack_require__(31);
+var META = __webpack_require__(65).KEY;
+var $fails = __webpack_require__(11);
+var shared = __webpack_require__(21);
+var setToStringTag = __webpack_require__(23);
+var uid = __webpack_require__(13);
+var wks = __webpack_require__(6);
+var wksExt = __webpack_require__(24);
+var wksDefine = __webpack_require__(25);
+var enumKeys = __webpack_require__(66);
+var isArray = __webpack_require__(67);
+var anObject = __webpack_require__(10);
+var isObject = __webpack_require__(8);
+var toIObject = __webpack_require__(5);
+var toPrimitive = __webpack_require__(17);
+var createDesc = __webpack_require__(12);
+var _create = __webpack_require__(32);
+var gOPNExt = __webpack_require__(68);
+var $GOPD = __webpack_require__(69);
+var $DP = __webpack_require__(3);
+var $keys = __webpack_require__(19);
+var gOPD = $GOPD.f;
+var dP = $DP.f;
+var gOPN = gOPNExt.f;
+var $Symbol = global.Symbol;
+var $JSON = global.JSON;
+var _stringify = $JSON && $JSON.stringify;
+var PROTOTYPE = 'prototype';
+var HIDDEN = wks('_hidden');
+var TO_PRIMITIVE = wks('toPrimitive');
+var isEnum = {}.propertyIsEnumerable;
+var SymbolRegistry = shared('symbol-registry');
+var AllSymbols = shared('symbols');
+var OPSymbols = shared('op-symbols');
+var ObjectProto = Object[PROTOTYPE];
+var USE_NATIVE = typeof $Symbol == 'function';
+var QObject = global.QObject;
+// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
+var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
+
+// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
+var setSymbolDesc = DESCRIPTORS && $fails(function () {
+ return _create(dP({}, 'a', {
+ get: function () { return dP(this, 'a', { value: 7 }).a; }
+ })).a != 7;
+}) ? function (it, key, D) {
+ var protoDesc = gOPD(ObjectProto, key);
+ if (protoDesc) delete ObjectProto[key];
+ dP(it, key, D);
+ if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);
+} : dP;
+
+var wrap = function (tag) {
+ var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);
+ sym._k = tag;
+ return sym;
+};
+
+var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {
+ return typeof it == 'symbol';
+} : function (it) {
+ return it instanceof $Symbol;
+};
+
+var $defineProperty = function defineProperty(it, key, D) {
+ if (it === ObjectProto) $defineProperty(OPSymbols, key, D);
+ anObject(it);
+ key = toPrimitive(key, true);
+ anObject(D);
+ if (has(AllSymbols, key)) {
+ if (!D.enumerable) {
+ if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));
+ it[HIDDEN][key] = true;
+ } else {
+ if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
+ D = _create(D, { enumerable: createDesc(0, false) });
+ } return setSymbolDesc(it, key, D);
+ } return dP(it, key, D);
+};
+var $defineProperties = function defineProperties(it, P) {
+ anObject(it);
+ var keys = enumKeys(P = toIObject(P));
+ var i = 0;
+ var l = keys.length;
+ var key;
+ while (l > i) $defineProperty(it, key = keys[i++], P[key]);
+ return it;
+};
+var $create = function create(it, P) {
+ return P === undefined ? _create(it) : $defineProperties(_create(it), P);
+};
+var $propertyIsEnumerable = function propertyIsEnumerable(key) {
+ var E = isEnum.call(this, key = toPrimitive(key, true));
+ if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;
+ return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
+};
+var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
+ it = toIObject(it);
+ key = toPrimitive(key, true);
+ if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;
+ var D = gOPD(it, key);
+ if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
+ return D;
+};
+var $getOwnPropertyNames = function getOwnPropertyNames(it) {
+ var names = gOPN(toIObject(it));
+ var result = [];
+ var i = 0;
+ var key;
+ while (names.length > i) {
+ if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
+ } return result;
+};
+var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
+ var IS_OP = it === ObjectProto;
+ var names = gOPN(IS_OP ? OPSymbols : toIObject(it));
+ var result = [];
+ var i = 0;
+ var key;
+ while (names.length > i) {
+ if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);
+ } return result;
+};
+
+// 19.4.1.1 Symbol([description])
+if (!USE_NATIVE) {
+ $Symbol = function Symbol() {
+ if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
+ var tag = uid(arguments.length > 0 ? arguments[0] : undefined);
+ var $set = function (value) {
+ if (this === ObjectProto) $set.call(OPSymbols, value);
+ if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
+ setSymbolDesc(this, tag, createDesc(1, value));
+ };
+ if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });
+ return wrap(tag);
+ };
+ redefine($Symbol[PROTOTYPE], 'toString', function toString() {
+ return this._k;
+ });
+
+ $GOPD.f = $getOwnPropertyDescriptor;
+ $DP.f = $defineProperty;
+ __webpack_require__(36).f = gOPNExt.f = $getOwnPropertyNames;
+ __webpack_require__(26).f = $propertyIsEnumerable;
+ __webpack_require__(35).f = $getOwnPropertySymbols;
+
+ if (DESCRIPTORS && !__webpack_require__(9)) {
+ redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
+ }
+
+ wksExt.f = function (name) {
+ return wrap(wks(name));
+ };
+}
+
+$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });
+
+for (var es6Symbols = (
+ // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
+ 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
+).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);
+
+for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);
+
+$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
+ // 19.4.2.1 Symbol.for(key)
+ 'for': function (key) {
+ return has(SymbolRegistry, key += '')
+ ? SymbolRegistry[key]
+ : SymbolRegistry[key] = $Symbol(key);
+ },
+ // 19.4.2.5 Symbol.keyFor(sym)
+ keyFor: function keyFor(sym) {
+ if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');
+ for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;
+ },
+ useSetter: function () { setter = true; },
+ useSimple: function () { setter = false; }
+});
+
+$export($export.S + $export.F * !USE_NATIVE, 'Object', {
+ // 19.1.2.2 Object.create(O [, Properties])
+ create: $create,
+ // 19.1.2.4 Object.defineProperty(O, P, Attributes)
+ defineProperty: $defineProperty,
+ // 19.1.2.3 Object.defineProperties(O, Properties)
+ defineProperties: $defineProperties,
+ // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
+ getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
+ // 19.1.2.7 Object.getOwnPropertyNames(O)
+ getOwnPropertyNames: $getOwnPropertyNames,
+ // 19.1.2.8 Object.getOwnPropertySymbols(O)
+ getOwnPropertySymbols: $getOwnPropertySymbols
+});
+
+// 24.3.2 JSON.stringify(value [, replacer [, space]])
+$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {
+ var S = $Symbol();
+ // MS Edge converts symbol values to JSON as {}
+ // WebKit converts symbol values to JSON as null
+ // V8 throws on boxed symbols
+ return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';
+})), 'JSON', {
+ stringify: function stringify(it) {
+ var args = [it];
+ var i = 1;
+ var replacer, $replacer;
+ while (arguments.length > i) args.push(arguments[i++]);
+ $replacer = replacer = args[1];
+ if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
+ if (!isArray(replacer)) replacer = function (key, value) {
+ if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
+ if (!isSymbol(value)) return value;
+ };
+ args[1] = replacer;
+ return _stringify.apply($JSON, args);
+ }
+});
+
+// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
+$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(2)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
+// 19.4.3.5 Symbol.prototype[@@toStringTag]
+setToStringTag($Symbol, 'Symbol');
+// 20.2.1.9 Math[@@toStringTag]
+setToStringTag(Math, 'Math', true);
+// 24.3.3 JSON[@@toStringTag]
+setToStringTag(global.JSON, 'JSON', true);
+
+
+/***/ }),
+/* 65 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var META = __webpack_require__(13)('meta');
+var isObject = __webpack_require__(8);
+var has = __webpack_require__(1);
+var setDesc = __webpack_require__(3).f;
+var id = 0;
+var isExtensible = Object.isExtensible || function () {
+ return true;
+};
+var FREEZE = !__webpack_require__(11)(function () {
+ return isExtensible(Object.preventExtensions({}));
+});
+var setMeta = function (it) {
+ setDesc(it, META, { value: {
+ i: 'O' + ++id, // object ID
+ w: {} // weak collections IDs
+ } });
+};
+var fastKey = function (it, create) {
+ // return primitive with prefix
+ if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
+ if (!has(it, META)) {
+ // can't set metadata to uncaught frozen object
+ if (!isExtensible(it)) return 'F';
+ // not necessary to add metadata
+ if (!create) return 'E';
+ // add missing metadata
+ setMeta(it);
+ // return object ID
+ } return it[META].i;
+};
+var getWeak = function (it, create) {
+ if (!has(it, META)) {
+ // can't set metadata to uncaught frozen object
+ if (!isExtensible(it)) return true;
+ // not necessary to add metadata
+ if (!create) return false;
+ // add missing metadata
+ setMeta(it);
+ // return hash weak collections IDs
+ } return it[META].w;
+};
+// add metadata on freeze-family methods calling
+var onFreeze = function (it) {
+ if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);
+ return it;
+};
+var meta = module.exports = {
+ KEY: META,
+ NEED: false,
+ fastKey: fastKey,
+ getWeak: getWeak,
+ onFreeze: onFreeze
+};
+
+
+/***/ }),
+/* 66 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// all enumerable object keys, includes symbols
+var getKeys = __webpack_require__(19);
+var gOPS = __webpack_require__(35);
+var pIE = __webpack_require__(26);
+module.exports = function (it) {
+ var result = getKeys(it);
+ var getSymbols = gOPS.f;
+ if (getSymbols) {
+ var symbols = getSymbols(it);
+ var isEnum = pIE.f;
+ var i = 0;
+ var key;
+ while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);
+ } return result;
+};
+
+
+/***/ }),
+/* 67 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.2.2 IsArray(argument)
+var cof = __webpack_require__(34);
+module.exports = Array.isArray || function isArray(arg) {
+ return cof(arg) == 'Array';
+};
+
+
+/***/ }),
+/* 68 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
+var toIObject = __webpack_require__(5);
+var gOPN = __webpack_require__(36).f;
+var toString = {}.toString;
+
+var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
+ ? Object.getOwnPropertyNames(window) : [];
+
+var getWindowNames = function (it) {
+ try {
+ return gOPN(it);
+ } catch (e) {
+ return windowNames.slice();
+ }
+};
+
+module.exports.f = function getOwnPropertyNames(it) {
+ return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));
+};
+
+
+/***/ }),
+/* 69 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var pIE = __webpack_require__(26);
+var createDesc = __webpack_require__(12);
+var toIObject = __webpack_require__(5);
+var toPrimitive = __webpack_require__(17);
+var has = __webpack_require__(1);
+var IE8_DOM_DEFINE = __webpack_require__(29);
+var gOPD = Object.getOwnPropertyDescriptor;
+
+exports.f = __webpack_require__(4) ? gOPD : function getOwnPropertyDescriptor(O, P) {
+ O = toIObject(O);
+ P = toPrimitive(P, true);
+ if (IE8_DOM_DEFINE) try {
+ return gOPD(O, P);
+ } catch (e) { /* empty */ }
+ if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);
+};
+
+
+/***/ }),
+/* 70 */
+/***/ (function(module, exports) {
+
+
+
+/***/ }),
+/* 71 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(25)('asyncIterator');
+
+
+/***/ }),
+/* 72 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(25)('observable');
+
+
+/***/ }),
+/* 73 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __vue_exports__, __vue_options__
+var __vue_styles__ = []
+
+/* styles */
+__vue_styles__.push(__webpack_require__(74)
+)
+
+/* script */
+__vue_exports__ = __webpack_require__(75)
+
+/* template */
+var __vue_template__ = __webpack_require__(80)
+__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+if (
+ typeof __vue_exports__.default === "object" ||
+ typeof __vue_exports__.default === "function"
+) {
+if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+__vue_options__ = __vue_exports__ = __vue_exports__.default
+}
+if (typeof __vue_options__ === "function") {
+ __vue_options__ = __vue_options__.options
+}
+__vue_options__.__file = "/Users/kw/github/weex-vue-examples/src/pages/examples/Examples.vue"
+__vue_options__.render = __vue_template__.render
+__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+__vue_options__._scopeId = "data-v-694b6655"
+__vue_options__.style = __vue_options__.style || {}
+__vue_styles__.forEach(function (module) {
+ for (var name in module) {
+ __vue_options__.style[name] = module[name]
+ }
+})
+if (typeof __register_static_styles__ === "function") {
+ __register_static_styles__(__vue_options__._scopeId, __vue_styles__)
+}
+
+module.exports = __vue_exports__
+
+
+/***/ }),
+/* 74 */
+/***/ (function(module, exports) {
+
+module.exports = {
+ "example-list": {
+ "width": "750",
+ "position": "absolute",
+ "top": 0,
+ "bottom": "100",
+ "backgroundColor": "#F5F5F5"
+ },
+ "group-info": {
+ "backgroundColor": "#FFFFFF"
+ },
+ "loading": {
+ "flex": 1,
+ "justifyContent": "center",
+ "alignItems": "center"
+ },
+ "loading-text": {
+ "fontSize": "60",
+ "color": "#BBBBBB"
+ },
+ "group-title": {
+ "width": "750",
+ "paddingTop": "20",
+ "paddingBottom": "35",
+ "fontSize": "40",
+ "textAlign": "center",
+ "color": "#00B4FF",
+ "backgroundImage": "linear-gradient(to bottom, #E3F5FB, #F9FEFF)"
+ },
+ "group-desc": {
+ "fontSize": "28",
+ "color": "#999999",
+ "marginTop": "10",
+ "marginLeft": "30",
+ "marginRight": "40"
+ },
+ "doc-link": {
+ "fontSize": "26",
+ "color": "rgba(0,189,255,0.6)",
+ "textAlign": "right",
+ "marginTop": "10",
+ "marginRight": "60",
+ "marginBottom": "20"
+ },
+ "section": {
+ "paddingBottom": "30"
+ },
+ "tabbar": {
+ "width": "750",
+ "position": "fixed",
+ "bottom": 0,
+ "height": "100",
+ "flexDirection": "row",
+ "justifyContent": "space-around",
+ "alignItems": "flex-end",
+ "backgroundColor": "#E6E6E6"
+ },
+ "tab-cell": {
+ "width": "186",
+ "height": "100",
+ "borderTopWidth": "2",
+ "borderTopStyle": "solid",
+ "borderTopColor": "#DDDDDD",
+ "justifyContent": "center",
+ "backgroundColor": "#FCFCFC",
+ "transitionProperty": "backgroundColor",
+ "transitionDuration": 200
+ },
+ "@TRANSITION": {
+ "tab-cell": {
+ "property": "backgroundColor",
+ "duration": 200
+ },
+ "tab-name": {
+ "property": "color,fontSize",
+ "duration": 100
+ }
+ },
+ "active-tab-cell": {
+ "borderTopColor": "rgba(0,189,255,0.8)",
+ "backgroundColor": "#BDECFF"
+ },
+ "tab-name": {
+ "textAlign": "center",
+ "color": "#666666",
+ "transitionProperty": "color,fontSize",
+ "transitionDuration": 100
+ },
+ "tab-name-zh": {
+ "fontSize": "36"
+ },
+ "tab-name-en": {
+ "fontSize": "30"
+ },
+ "active-tab-name-zh": {
+ "color": "#00B4FF",
+ "fontSize": "42",
+ "fontWeight": "bold"
+ },
+ "active-tab-name-en": {
+ "color": "#00B4FF",
+ "fontSize": "30",
+ "fontWeight": "bold"
+ }
+}
+
+/***/ }),
+/* 75 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _utils = __webpack_require__(14);
+
+var _ExampleScroller = __webpack_require__(76);
+
+var _ExampleScroller2 = _interopRequireDefault(_ExampleScroller);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// import getExamples from '../../examples'
+// const exampleMap = getExamples({ scope: 'mobile', filterTODO: true })
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+var exampleMap = [];
+var useStorage = false;
+exports.default = {
+ components: { ExampleScroller: _ExampleScroller2.default },
+ data: function data() {
+ return {
+ navigationBarOptions: {
+ title: {
+ zh: '使用 Weex 的例子',
+ en: 'Weex Examples'
+ }
+ },
+ examples: exampleMap,
+ showLoading: false,
+ language: 'en',
+ activeTab: 'component',
+ activeGroup: 'div',
+ dict: {
+ READ_MORE: { en: 'read more', zh: '查看更多' }
+ }
+ };
+ },
+ beforeCreate: function beforeCreate() {
+ var _this = this;
+
+ // read examples from storage
+ (0, _utils.readExamples)(function (examples) {
+ _this.examples = examples;
+ if (WXEnvironment.platform.toLowerCase() !== 'web') {
+ useStorage = true;
+ }
+ });
+
+ // update examples to storage
+ (0, _utils.fetchExamples)(function (result) {
+ (0, _utils.saveExamples)(result);
+ if (!useStorage) {
+ _this.examples = result.examples;
+ }
+ });
+
+ setTimeout(function () {
+ _this.showLoading = true;
+ }, 400);
+ },
+
+ computed: {
+ tabs: function tabs() {
+ return this.examples.map(function (group) {
+ return {
+ type: group.type,
+ name: group.name
+ };
+ });
+ },
+ currentTab: function currentTab() {
+ var _this2 = this;
+
+ return this.examples.filter(function (tab) {
+ return tab.type === _this2.activeTab;
+ })[0];
+ }
+ },
+ methods: {
+ toggleTab: function toggleTab(tabType) {
+ this.activeTab = tabType;
+ this.activeGroup = this.currentTab.group[0].type;
+ }
+ }
+};
+
+/***/ }),
+/* 76 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __vue_exports__, __vue_options__
+var __vue_styles__ = []
+
+/* styles */
+__vue_styles__.push(__webpack_require__(77)
+)
+
+/* script */
+__vue_exports__ = __webpack_require__(78)
+
+/* template */
+var __vue_template__ = __webpack_require__(79)
+__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+if (
+ typeof __vue_exports__.default === "object" ||
+ typeof __vue_exports__.default === "function"
+) {
+if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+__vue_options__ = __vue_exports__ = __vue_exports__.default
+}
+if (typeof __vue_options__ === "function") {
+ __vue_options__ = __vue_options__.options
+}
+__vue_options__.__file = "/Users/kw/github/weex-vue-examples/src/components/ExampleScroller.vue"
+__vue_options__.render = __vue_template__.render
+__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+__vue_options__._scopeId = "data-v-1f23e14a"
+__vue_options__.style = __vue_options__.style || {}
+__vue_styles__.forEach(function (module) {
+ for (var name in module) {
+ __vue_options__.style[name] = module[name]
+ }
+})
+if (typeof __register_static_styles__ === "function") {
+ __register_static_styles__(__vue_options__._scopeId, __vue_styles__)
+}
+
+module.exports = __vue_exports__
+
+
+/***/ }),
+/* 77 */
+/***/ (function(module, exports) {
+
+module.exports = {
+ "scroller": {
+ "flexDirection": "row",
+ "backgroundColor": "#FDFDFD",
+ "paddingTop": "20",
+ "paddingRight": "20",
+ "paddingBottom": "20",
+ "paddingLeft": "20",
+ "height": "600"
+ },
+ "example-box": {
+ "justifyContent": "space-between",
+ "alignItems": "center",
+ "paddingLeft": "6",
+ "paddingRight": "6",
+ "width": "310"
+ },
+ "screenshot": {
+ "width": "270",
+ "height": "422",
+ "borderWidth": "1",
+ "borderColor": "#DDDDDD"
+ },
+ "title": {
+ "height": "75",
+ "justifyContent": "center"
+ },
+ "title-text": {
+ "fontSize": "32",
+ "textAlign": "center",
+ "color": "#606060",
+ "paddingTop": "10",
+ "paddingBottom": "10"
+ },
+ "example-tips": {
+ "fontSize": "28",
+ "textAlign": "center",
+ "color": "#A5A5A5",
+ "paddingTop": "10",
+ "paddingBottom": "10"
+ }
+}
+
+/***/ }),
+/* 78 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _utils = __webpack_require__(14);
+
+exports.default = {
+ methods: { viewSource: _utils.viewSource },
+ props: {
+ language: {
+ type: String,
+ default: 'en'
+ },
+ examples: {
+ type: Array,
+ required: true
+ }
+ },
+ data: function data() {
+ return {
+ VIEW_SOURCE: {
+ en: 'view source',
+ zh: '查看源码'
+ }
+ };
+ }
+}; //
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+/***/ }),
+/* 79 */
+/***/ (function(module, exports) {
+
+module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+ return _c('scroller', {
+ staticClass: ["scroller"],
+ attrs: {
+ "scrollDirection": "horizontal"
+ }
+ }, _vm._l((_vm.examples), function(example, i) {
+ return _c('div', {
+ key: i,
+ staticClass: ["example-box"]
+ }, [_c('div', {
+ staticClass: ["title"]
+ }, [_c('text', {
+ staticClass: ["title-text"]
+ }, [_vm._v(_vm._s(_vm.i18n(example.title)))])]), _c('div', {
+ staticStyle: {
+ alignItems: "center"
+ }
+ }, [_c('a', {
+ attrs: {
+ "href": _vm._f("url")(_vm.i18n(example.hash))
+ }
+ }, [_c('image', {
+ staticClass: ["screenshot"],
+ attrs: {
+ "src": _vm.i18n(example.screenshot)
+ }
+ })]), _c('text', {
+ staticClass: ["example-tips"],
+ on: {
+ "click": function($event) {
+ _vm.viewSource(_vm.i18n(example.hash))
+ }
+ }
+ }, [_vm._v(_vm._s(_vm.i18n(_vm.VIEW_SOURCE)))])])])
+ }))
+},staticRenderFns: []}
+module.exports.render._withStripped = true
+
+/***/ }),
+/* 80 */
+/***/ (function(module, exports) {
+
+module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+ return _c('div', {
+ staticClass: ["wrapper"]
+ }, [(_vm.examples && _vm.examples.length) ? _c('list', {
+ staticClass: ["example-list"]
+ }, [_vm._l((_vm.currentTab.group), function(exampleGroup) {
+ return [(exampleGroup && exampleGroup.title || exampleGroup.name) ? _c('cell', {
+ key: exampleGroup.type,
+ ref: exampleGroup.type,
+ refInFor: true,
+ staticClass: ["group-info"],
+ appendAsTree: true,
+ attrs: {
+ "append": "tree"
+ }
+ }, [_c('text', {
+ staticClass: ["group-title"]
+ }, [_vm._v(_vm._s(_vm.i18n(exampleGroup.title || exampleGroup.name)))]), (exampleGroup.desc) ? _c('text', {
+ staticClass: ["group-desc"]
+ }, [_vm._v(_vm._s(_vm.i18n(exampleGroup.desc)))]) : _vm._e(), (exampleGroup.desc && exampleGroup.docLink) ? _c('text', {
+ staticClass: ["doc-link"],
+ on: {
+ "click": function($event) {
+ _vm.jumpTo(_vm.i18n(exampleGroup.docLink))
+ }
+ }
+ }, [_vm._v(_vm._s(_vm.i18n(_vm.dict.READ_MORE)) + " >>")]) : _vm._e()]) : _vm._e(), _c('cell', {
+ key: exampleGroup.type + '-examples',
+ staticClass: ["section"],
+ appendAsTree: true,
+ attrs: {
+ "append": "tree"
+ }
+ }, [_c('example-scroller', {
+ attrs: {
+ "language": _vm.language,
+ "examples": exampleGroup.examples
+ }
+ })], 1)]
+ })], 2) : (_vm.showLoading) ? _c('div', {
+ staticClass: ["loading"]
+ }, [_c('text', {
+ staticClass: ["loading-text"]
+ }, [_vm._v("loading ...")])]) : _vm._e(), (_vm.tabs && _vm.tabs.length) ? _c('div', {
+ staticClass: ["tabbar"]
+ }, _vm._l((_vm.tabs), function(tab) {
+ return _c('div', {
+ key: tab.type,
+ class: ['tab-cell', tab.type === _vm.activeTab ? 'active-tab-cell' : ''],
+ on: {
+ "click": function($event) {
+ _vm.toggleTab(tab.type)
+ }
+ }
+ }, [_c('text', {
+ class: [
+ 'tab-name',
+ ("tab-name-" + _vm.language),
+ tab.type === _vm.activeTab ? ("active-tab-name-" + _vm.language) : ''
+ ]
+ }, [_vm._v(_vm._s(_vm.i18n(tab.name)))])])
+ })) : _vm._e()])
+},staticRenderFns: []}
+module.exports.render._withStripped = true
+
+/***/ })
+/******/ ]);
\ No newline at end of file
diff --git a/android/playground/src/main/assets/guide.weex.js b/android/playground/src/main/assets/guide.weex.js
new file mode 100644
index 0000000..aad4993
--- /dev/null
+++ b/android/playground/src/main/assets/guide.weex.js
@@ -0,0 +1,3191 @@
+// { "framework": "Vue" }
+"use weex:vue";
+
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 37);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports) {
+
+// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
+var global = module.exports = typeof window != 'undefined' && window.Math == Math
+ ? window : typeof self != 'undefined' && self.Math == Math ? self
+ // eslint-disable-next-line no-new-func
+ : Function('return this')();
+if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var anObject = __webpack_require__(10);
+var IE8_DOM_DEFINE = __webpack_require__(29);
+var toPrimitive = __webpack_require__(17);
+var dP = Object.defineProperty;
+
+exports.f = __webpack_require__(2) ? Object.defineProperty : function defineProperty(O, P, Attributes) {
+ anObject(O);
+ P = toPrimitive(P, true);
+ anObject(Attributes);
+ if (IE8_DOM_DEFINE) try {
+ return dP(O, P, Attributes);
+ } catch (e) { /* empty */ }
+ if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
+ if ('value' in Attributes) O[P] = Attributes.value;
+ return O;
+};
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// Thank's IE8 for his funny defineProperty
+module.exports = !__webpack_require__(11)(function () {
+ return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
+});
+
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports) {
+
+var hasOwnProperty = {}.hasOwnProperty;
+module.exports = function (it, key) {
+ return hasOwnProperty.call(it, key);
+};
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports) {
+
+var core = module.exports = { version: '2.5.7' };
+if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dP = __webpack_require__(1);
+var createDesc = __webpack_require__(12);
+module.exports = __webpack_require__(2) ? function (object, key, value) {
+ return dP.f(object, key, createDesc(1, value));
+} : function (object, key, value) {
+ object[key] = value;
+ return object;
+};
+
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// to indexed object, toObject with fallback for non-array-like ES3 strings
+var IObject = __webpack_require__(51);
+var defined = __webpack_require__(15);
+module.exports = function (it) {
+ return IObject(defined(it));
+};
+
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var store = __webpack_require__(21)('wks');
+var uid = __webpack_require__(13);
+var Symbol = __webpack_require__(0).Symbol;
+var USE_SYMBOL = typeof Symbol == 'function';
+
+var $exports = module.exports = function (name) {
+ return store[name] || (store[name] =
+ USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
+};
+
+$exports.store = store;
+
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports) {
+
+module.exports = function (it) {
+ return typeof it === 'object' ? it !== null : typeof it === 'function';
+};
+
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports) {
+
+module.exports = true;
+
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(8);
+module.exports = function (it) {
+ if (!isObject(it)) throw TypeError(it + ' is not an object!');
+ return it;
+};
+
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports) {
+
+module.exports = function (exec) {
+ try {
+ return !!exec();
+ } catch (e) {
+ return true;
+ }
+};
+
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports) {
+
+module.exports = function (bitmap, value) {
+ return {
+ enumerable: !(bitmap & 1),
+ configurable: !(bitmap & 2),
+ writable: !(bitmap & 4),
+ value: value
+ };
+};
+
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports) {
+
+var id = 0;
+var px = Math.random();
+module.exports = function (key) {
+ return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
+};
+
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports) {
+
+// 7.1.4 ToInteger
+var ceil = Math.ceil;
+var floor = Math.floor;
+module.exports = function (it) {
+ return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
+};
+
+
+/***/ }),
+/* 15 */
+/***/ (function(module, exports) {
+
+// 7.2.1 RequireObjectCoercible(argument)
+module.exports = function (it) {
+ if (it == undefined) throw TypeError("Can't call method on " + it);
+ return it;
+};
+
+
+/***/ }),
+/* 16 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(0);
+var core = __webpack_require__(4);
+var ctx = __webpack_require__(47);
+var hide = __webpack_require__(5);
+var has = __webpack_require__(3);
+var PROTOTYPE = 'prototype';
+
+var $export = function (type, name, source) {
+ var IS_FORCED = type & $export.F;
+ var IS_GLOBAL = type & $export.G;
+ var IS_STATIC = type & $export.S;
+ var IS_PROTO = type & $export.P;
+ var IS_BIND = type & $export.B;
+ var IS_WRAP = type & $export.W;
+ var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
+ var expProto = exports[PROTOTYPE];
+ var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];
+ var key, own, out;
+ if (IS_GLOBAL) source = name;
+ for (key in source) {
+ // contains in native
+ own = !IS_FORCED && target && target[key] !== undefined;
+ if (own && has(exports, key)) continue;
+ // export native or passed
+ out = own ? target[key] : source[key];
+ // prevent global pollution for namespaces
+ exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
+ // bind timers to global for call from export context
+ : IS_BIND && own ? ctx(out, global)
+ // wrap global constructors for prevent change them in library
+ : IS_WRAP && target[key] == out ? (function (C) {
+ var F = function (a, b, c) {
+ if (this instanceof C) {
+ switch (arguments.length) {
+ case 0: return new C();
+ case 1: return new C(a);
+ case 2: return new C(a, b);
+ } return new C(a, b, c);
+ } return C.apply(this, arguments);
+ };
+ F[PROTOTYPE] = C[PROTOTYPE];
+ return F;
+ // make static versions for prototype methods
+ })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
+ // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
+ if (IS_PROTO) {
+ (exports.virtual || (exports.virtual = {}))[key] = out;
+ // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
+ if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);
+ }
+ }
+};
+// type bitmap
+$export.F = 1; // forced
+$export.G = 2; // global
+$export.S = 4; // static
+$export.P = 8; // proto
+$export.B = 16; // bind
+$export.W = 32; // wrap
+$export.U = 64; // safe
+$export.R = 128; // real proto method for `library`
+module.exports = $export;
+
+
+/***/ }),
+/* 17 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.1 ToPrimitive(input [, PreferredType])
+var isObject = __webpack_require__(8);
+// instead of the ES6 spec version, we didn't implement @@toPrimitive case
+// and the second argument - flag - preferred type is a string
+module.exports = function (it, S) {
+ if (!isObject(it)) return it;
+ var fn, val;
+ if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+ if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;
+ if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+ throw TypeError("Can't convert object to primitive value");
+};
+
+
+/***/ }),
+/* 18 */
+/***/ (function(module, exports) {
+
+module.exports = {};
+
+
+/***/ }),
+/* 19 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.14 / 15.2.3.14 Object.keys(O)
+var $keys = __webpack_require__(33);
+var enumBugKeys = __webpack_require__(22);
+
+module.exports = Object.keys || function keys(O) {
+ return $keys(O, enumBugKeys);
+};
+
+
+/***/ }),
+/* 20 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var shared = __webpack_require__(21)('keys');
+var uid = __webpack_require__(13);
+module.exports = function (key) {
+ return shared[key] || (shared[key] = uid(key));
+};
+
+
+/***/ }),
+/* 21 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var core = __webpack_require__(4);
+var global = __webpack_require__(0);
+var SHARED = '__core-js_shared__';
+var store = global[SHARED] || (global[SHARED] = {});
+
+(module.exports = function (key, value) {
+ return store[key] || (store[key] = value !== undefined ? value : {});
+})('versions', []).push({
+ version: core.version,
+ mode: __webpack_require__(9) ? 'pure' : 'global',
+ copyright: '© 2018 Denis Pushkarev (zloirock.ru)'
+});
+
+
+/***/ }),
+/* 22 */
+/***/ (function(module, exports) {
+
+// IE 8- don't enum bug keys
+module.exports = (
+ 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
+).split(',');
+
+
+/***/ }),
+/* 23 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var def = __webpack_require__(1).f;
+var has = __webpack_require__(3);
+var TAG = __webpack_require__(7)('toStringTag');
+
+module.exports = function (it, tag, stat) {
+ if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });
+};
+
+
+/***/ }),
+/* 24 */
+/***/ (function(module, exports, __webpack_require__) {
+
+exports.f = __webpack_require__(7);
+
+
+/***/ }),
+/* 25 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(0);
+var core = __webpack_require__(4);
+var LIBRARY = __webpack_require__(9);
+var wksExt = __webpack_require__(24);
+var defineProperty = __webpack_require__(1).f;
+module.exports = function (name) {
+ var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
+ if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });
+};
+
+
+/***/ }),
+/* 26 */
+/***/ (function(module, exports) {
+
+exports.f = {}.propertyIsEnumerable;
+
+
+/***/ }),
+/* 27 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.fetchNews = exports.fetchDoodle = exports.readAbout = exports.saveAbout = exports.fetchAbout = exports.readGuide = exports.saveGuide = exports.fetchGuide = exports.readExamples = exports.saveExamples = exports.fetchExamples = undefined;
+
+var _stringify = __webpack_require__(40);
+
+var _stringify2 = _interopRequireDefault(_stringify);
+
+var _typeof2 = __webpack_require__(42);
+
+var _typeof3 = _interopRequireDefault(_typeof2);
+
+exports.createLink = createLink;
+exports.createURL = createURL;
+exports.i18n = i18n;
+exports.parseLanguage = parseLanguage;
+exports.setLanguage = setLanguage;
+exports.clearStorageLanguage = clearStorageLanguage;
+exports.getStorageLanguage = getStorageLanguage;
+exports.getSystemLanguage = getSystemLanguage;
+exports.getLanguage = getLanguage;
+exports.jumpTo = jumpTo;
+exports.viewSource = viewSource;
+exports.setTitleBar = setTitleBar;
+exports.fetchData = fetchData;
+exports.saveData = saveData;
+exports.readData = readData;
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var stream = weex.requireModule('stream');
+var storage = weex.requireModule('storage');
+var navigator = weex.requireModule('navigator');
+
+var encoder = typeof encodeURIComponent === 'function' ? encodeURIComponent : typeof encodeURI === 'function' ? encodeURI : function (x) {
+ return x;
+};
+
+function encodeParams(params) {
+ if (!params || (typeof params === 'undefined' ? 'undefined' : (0, _typeof3.default)(params)) !== 'object') {
+ return '';
+ }
+ var array = [];
+ for (var key in params) {
+ if (typeof params[key] === 'string') {
+ array.push(encoder(key) + '=' + encoder(params[key]));
+ }
+ }
+ return array.join('&');
+}
+
+function createLink(name) {
+ var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var args = [];
+ for (var key in params) {
+ if (typeof params[key] === 'string') {
+ args.push(encoder(key) + '=' + encoder(params[key]));
+ }
+ }
+ if (WXEnvironment.platform === 'Web') {
+ args.unshift('page=' + name + '.web.js');
+ return '/?' + args.join('&');
+ }
+ var base = getBaseURL();
+ return '' + base + name + '.weex.js' + (args.length ? '?' + args.join('&') : '');
+}
+
+function createURL(hash, params) {
+ if (WXEnvironment.platform === 'Web') {
+ return 'http://dotwe.org/raw/htmlVue/' + hash;
+ }
+ var url = 'http://dotwe.org/raw/dist/' + hash + '.bundle.wx';
+ var paramString = encodeParams(params);
+ if (WXEnvironment.appName === 'TB') {
+ return url + '?_wx_tpl=' + url + '&' + paramString;
+ }
+ if (WXEnvironment.appName === 'WXSample') {
+ return url + '?' + paramString;
+ }
+ return url + '?wx_weex=true&' + paramString;
+}
+
+function getBaseURL() {
+ var bundleUrl = weex.config.bundleUrl;
+ var isAndroidAssets = bundleUrl.indexOf('your_current_IP') >= 0 || bundleUrl.indexOf('file://assets/') >= 0;
+ var isiOSAssets = bundleUrl.indexOf('file:///') >= 0 && bundleUrl.indexOf('WeexDemo.app') > 0;
+ if (isAndroidAssets) {
+ return 'file://assets/';
+ } else if (isiOSAssets) {
+ // file:///var/mobile/Containers/Bundle/Application/{id}/WeexDemo.app/
+ // file:///Users/{user}/Library/Developer/CoreSimulator/Devices/{id}/data/Containers/Bundle/Application/{id}/WeexDemo.app/
+ return bundleUrl.substring(0, bundleUrl.lastIndexOf('/') + 1);
+ }
+ return '';
+}
+
+function i18n(text, language) {
+ if (typeof text === 'string') {
+ return text;
+ }
+ if (Object.prototype.toString.call(text) === '[object Object]') {
+ var lang = this && this.language || language || 'en';
+ return text[lang];
+ }
+}
+
+var supportedLanguageRE = /(en|zh)\_?\w*/i;
+function parseLanguage(language) {
+ var match = supportedLanguageRE.exec(language + '');
+ if (match && match[1]) {
+ return match[1];
+ }
+ return '';
+}
+
+function setLanguage(language) {
+ var lang = parseLanguage(language);
+ if (lang) {
+ storage.setItem('WEEX_PLAYGROUND_LANGUAGE', lang);
+ }
+}
+
+function clearStorageLanguage() {
+ storage.removeItem('WEEX_PLAYGROUND_LANGUAGE');
+}
+
+function getStorageLanguage(done) {
+ var fail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+
+ if (!(typeof done === 'undefined' ? 'undefined' : (0, _typeof3.default)(done)) === 'function') {
+ return;
+ }
+ try {
+ storage.getItem('WEEX_PLAYGROUND_LANGUAGE', function (event) {
+ if (event.result === 'success') {
+ var lang = parseLanguage(event.data);
+ lang ? done(lang) : fail();
+ } else {
+ fail(event);
+ }
+ });
+ } catch (err) {
+ fail(err);
+ }
+}
+
+function getSystemLanguage(done) {
+ var fail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+
+ if (!(typeof done === 'undefined' ? 'undefined' : (0, _typeof3.default)(done)) === 'function') {
+ return;
+ }
+ if (WXEnvironment.platform.toLowerCase() === 'web') {
+ var lang = parseLanguage(window.navigator.language);
+ lang ? done(lang) : fail();
+ } else {
+ try {
+ var locale = weex.requireModule('locale') || weex.requireModule('local');
+ var useSync = false;
+ var resSync = locale.getLanguage(function (language) {
+ var lang = parseLanguage(language);
+ if (lang) {
+ useSync || done(lang);
+ } else {
+ fail();
+ }
+ });
+ var langSync = parseLanguage(resSync);
+ if (langSync) {
+ useSync = true;
+ done(langSync);
+ } else {
+ fail();
+ }
+ } catch (e) {
+ fail(e);
+ }
+ }
+}
+
+var languageRE = /.+[\?\&]{1}language=([\d\w]+)[\?\&]?.*/i;
+function getLanguage() {
+ var done = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
+
+ var match = languageRE.exec(weex.config.bundleUrl || '');
+ var lang = parseLanguage(match && match[1]);
+ if (lang) {
+ done(lang);
+ } else {
+ getStorageLanguage(done, function () {
+ getSystemLanguage(done, function () {
+ done('en');
+ });
+ });
+ }
+}
+
+function jumpTo(url, title, lang) {
+ getLanguage(function (language) {
+ storage.setItem('CURRENT_DOCUMENT_URL', i18n(url, lang || language));
+ navigator.push({
+ url: createURL('bf0305c14b511b24a4e616f53926432b', { language: language, title: i18n(title, lang || language) })
+ });
+ });
+}
+
+function viewSource(hash) {
+ getLanguage(function (language) {
+ navigator.push({
+ url: createURL('f6ce29faf686eabc38b410bf4828fa5a', { hash: hash, language: language })
+ });
+ });
+}
+
+function setTitleBar(options) {
+ var language = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en';
+
+ if (Object.prototype.toString.apply(options) !== '[object Object]') {
+ return;
+ }
+ var titleBar = weex.requireModule('titleBar');
+ if (options.color || options.backgroundColor) {
+ try {
+ titleBar.setStyle({
+ foregroundColor: options.color || '#FFFFFF',
+ backgroundColor: options.backgroundColor || '#00B4FF'
+ });
+ } catch (e) {}
+ }
+ var title = i18n(options.title, language);
+ if (title) {
+ try {
+ titleBar.setTitle(title);
+ } catch (e) {}
+ }
+}
+
+var storageKeys = {
+ doodle: 'WEEX_PLAYGROUND_APP_DOODLE',
+ guide: 'WEEX_PLAYGROUND_APP_GUIDE',
+ examples: 'WEEX_PLAYGROUND_APP_EXAMPLES',
+ news: 'WEEX_PLAYGROUND_APP_NEWS',
+ about: 'WEEX_PLAYGROUND_APP_ABOUT'
+};
+function fetchData(name) {
+ var done = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+ var fail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
+
+ try {
+ stream.fetch({
+ url: 'http://dotwe.org/query/weex-playground-app',
+ method: 'post',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded'
+ },
+ type: 'json',
+ body: 'name=' + name
+ }, function (res) {
+ if (res.ok && res.data && res.data.success) {
+ done(res.data);
+ } else {
+ fail(res);
+ }
+ });
+ } catch (err) {
+ fail(err);
+ }
+}
+function saveData(name, result) {
+ var key = storageKeys[name];
+ if (!key) return;
+ if (result && (typeof result === 'undefined' ? 'undefined' : (0, _typeof3.default)(result)) === 'object') {
+ result.timestamp = Date.now();
+ storage.setItem(key, (0, _stringify2.default)(result));
+ }
+}
+function readData(name) {
+ var done = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+ var fail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
+
+ var key = storageKeys[name];
+ if (!key) return fail();
+ try {
+ storage.getItem(key, function (event) {
+ if (event.result === 'success') {
+ var result = JSON.parse(event.data);
+ if (result && Array.isArray(result[name])) {
+ return done(result[name]);
+ }
+ }
+ fail(event);
+ });
+ } catch (e) {
+ fail(e);
+ }
+}
+
+var fetchExamples = exports.fetchExamples = function fetchExamples() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ return fetchData.apply(undefined, ['examples'].concat(args));
+};
+var saveExamples = exports.saveExamples = function saveExamples() {
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ return saveData.apply(undefined, ['examples'].concat(args));
+};
+var readExamples = exports.readExamples = function readExamples() {
+ for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+ args[_key3] = arguments[_key3];
+ }
+
+ return readData.apply(undefined, ['examples'].concat(args));
+};
+
+var fetchGuide = exports.fetchGuide = function fetchGuide() {
+ for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
+ args[_key4] = arguments[_key4];
+ }
+
+ return fetchData.apply(undefined, ['guide'].concat(args));
+};
+var saveGuide = exports.saveGuide = function saveGuide() {
+ for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
+ args[_key5] = arguments[_key5];
+ }
+
+ return saveData.apply(undefined, ['guide'].concat(args));
+};
+var readGuide = exports.readGuide = function readGuide() {
+ for (var _len6 = arguments.length, args = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
+ args[_key6] = arguments[_key6];
+ }
+
+ return readData.apply(undefined, ['guide'].concat(args));
+};
+
+var fetchAbout = exports.fetchAbout = function fetchAbout() {
+ for (var _len7 = arguments.length, args = Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
+ args[_key7] = arguments[_key7];
+ }
+
+ return fetchData.apply(undefined, ['about'].concat(args));
+};
+var saveAbout = exports.saveAbout = function saveAbout() {
+ for (var _len8 = arguments.length, args = Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
+ args[_key8] = arguments[_key8];
+ }
+
+ return saveData.apply(undefined, ['about'].concat(args));
+};
+var readAbout = exports.readAbout = function readAbout() {
+ for (var _len9 = arguments.length, args = Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {
+ args[_key9] = arguments[_key9];
+ }
+
+ return readData.apply(undefined, ['about'].concat(args));
+};
+
+var fetchDoodle = exports.fetchDoodle = function fetchDoodle() {
+ for (var _len10 = arguments.length, args = Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {
+ args[_key10] = arguments[_key10];
+ }
+
+ return fetchData.apply(undefined, ['doodle'].concat(args));
+};
+var fetchNews = exports.fetchNews = function fetchNews() {
+ for (var _len11 = arguments.length, args = Array(_len11), _key11 = 0; _key11 < _len11; _key11++) {
+ args[_key11] = arguments[_key11];
+ }
+
+ return fetchData.apply(undefined, ['news'].concat(args));
+};
+
+/***/ }),
+/* 28 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var LIBRARY = __webpack_require__(9);
+var $export = __webpack_require__(16);
+var redefine = __webpack_require__(31);
+var hide = __webpack_require__(5);
+var Iterators = __webpack_require__(18);
+var $iterCreate = __webpack_require__(49);
+var setToStringTag = __webpack_require__(23);
+var getPrototypeOf = __webpack_require__(56);
+var ITERATOR = __webpack_require__(7)('iterator');
+var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
+var FF_ITERATOR = '@@iterator';
+var KEYS = 'keys';
+var VALUES = 'values';
+
+var returnThis = function () { return this; };
+
+module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
+ $iterCreate(Constructor, NAME, next);
+ var getMethod = function (kind) {
+ if (!BUGGY && kind in proto) return proto[kind];
+ switch (kind) {
+ case KEYS: return function keys() { return new Constructor(this, kind); };
+ case VALUES: return function values() { return new Constructor(this, kind); };
+ } return function entries() { return new Constructor(this, kind); };
+ };
+ var TAG = NAME + ' Iterator';
+ var DEF_VALUES = DEFAULT == VALUES;
+ var VALUES_BUG = false;
+ var proto = Base.prototype;
+ var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
+ var $default = $native || getMethod(DEFAULT);
+ var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
+ var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
+ var methods, key, IteratorPrototype;
+ // Fix native
+ if ($anyNative) {
+ IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));
+ if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
+ // Set @@toStringTag to native iterators
+ setToStringTag(IteratorPrototype, TAG, true);
+ // fix for some old engines
+ if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);
+ }
+ }
+ // fix Array#{values, @@iterator}.name in V8 / FF
+ if (DEF_VALUES && $native && $native.name !== VALUES) {
+ VALUES_BUG = true;
+ $default = function values() { return $native.call(this); };
+ }
+ // Define iterator
+ if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
+ hide(proto, ITERATOR, $default);
+ }
+ // Plug for library
+ Iterators[NAME] = $default;
+ Iterators[TAG] = returnThis;
+ if (DEFAULT) {
+ methods = {
+ values: DEF_VALUES ? $default : getMethod(VALUES),
+ keys: IS_SET ? $default : getMethod(KEYS),
+ entries: $entries
+ };
+ if (FORCED) for (key in methods) {
+ if (!(key in proto)) redefine(proto, key, methods[key]);
+ } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
+ }
+ return methods;
+};
+
+
+/***/ }),
+/* 29 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = !__webpack_require__(2) && !__webpack_require__(11)(function () {
+ return Object.defineProperty(__webpack_require__(30)('div'), 'a', { get: function () { return 7; } }).a != 7;
+});
+
+
+/***/ }),
+/* 30 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(8);
+var document = __webpack_require__(0).document;
+// typeof document.createElement is 'object' in old IE
+var is = isObject(document) && isObject(document.createElement);
+module.exports = function (it) {
+ return is ? document.createElement(it) : {};
+};
+
+
+/***/ }),
+/* 31 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(5);
+
+
+/***/ }),
+/* 32 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
+var anObject = __webpack_require__(10);
+var dPs = __webpack_require__(50);
+var enumBugKeys = __webpack_require__(22);
+var IE_PROTO = __webpack_require__(20)('IE_PROTO');
+var Empty = function () { /* empty */ };
+var PROTOTYPE = 'prototype';
+
+// Create object with fake `null` prototype: use iframe Object with cleared prototype
+var createDict = function () {
+ // Thrash, waste and sodomy: IE GC bug
+ var iframe = __webpack_require__(30)('iframe');
+ var i = enumBugKeys.length;
+ var lt = '<';
+ var gt = '>';
+ var iframeDocument;
+ iframe.style.display = 'none';
+ __webpack_require__(55).appendChild(iframe);
+ iframe.src = 'javascript:'; // eslint-disable-line no-script-url
+ // createDict = iframe.contentWindow.Object;
+ // html.removeChild(iframe);
+ iframeDocument = iframe.contentWindow.document;
+ iframeDocument.open();
+ iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
+ iframeDocument.close();
+ createDict = iframeDocument.F;
+ while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];
+ return createDict();
+};
+
+module.exports = Object.create || function create(O, Properties) {
+ var result;
+ if (O !== null) {
+ Empty[PROTOTYPE] = anObject(O);
+ result = new Empty();
+ Empty[PROTOTYPE] = null;
+ // add "__proto__" for Object.getPrototypeOf polyfill
+ result[IE_PROTO] = O;
+ } else result = createDict();
+ return Properties === undefined ? result : dPs(result, Properties);
+};
+
+
+/***/ }),
+/* 33 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var has = __webpack_require__(3);
+var toIObject = __webpack_require__(6);
+var arrayIndexOf = __webpack_require__(52)(false);
+var IE_PROTO = __webpack_require__(20)('IE_PROTO');
+
+module.exports = function (object, names) {
+ var O = toIObject(object);
+ var i = 0;
+ var result = [];
+ var key;
+ for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);
+ // Don't enum bug & hidden keys
+ while (names.length > i) if (has(O, key = names[i++])) {
+ ~arrayIndexOf(result, key) || result.push(key);
+ }
+ return result;
+};
+
+
+/***/ }),
+/* 34 */
+/***/ (function(module, exports) {
+
+var toString = {}.toString;
+
+module.exports = function (it) {
+ return toString.call(it).slice(8, -1);
+};
+
+
+/***/ }),
+/* 35 */
+/***/ (function(module, exports) {
+
+exports.f = Object.getOwnPropertySymbols;
+
+
+/***/ }),
+/* 36 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
+var $keys = __webpack_require__(33);
+var hiddenKeys = __webpack_require__(22).concat('length', 'prototype');
+
+exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
+ return $keys(O, hiddenKeys);
+};
+
+
+/***/ }),
+/* 37 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+__webpack_require__(38);
+
+var _Guide = __webpack_require__(73);
+
+var _Guide2 = _interopRequireDefault(_Guide);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// show title bar
+try {
+ var titleBar = weex.requireModule('titleBar');
+ titleBar.showTitleBar(true);
+} catch (e) {}
+
+_Guide2.default.el = '#root';
+new Vue(_Guide2.default);
+
+/***/ }),
+/* 38 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _mixin = __webpack_require__(39);
+
+var _mixin2 = _interopRequireDefault(_mixin);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// use shared mixins
+Vue.mixin(_mixin2.default);
+
+/***/ }),
+/* 39 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _index = __webpack_require__(27);
+
+var utils = _interopRequireWildcard(_index);
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
+
+var storage = weex.requireModule('storage');
+
+exports.default = {
+ filters: {
+ i18n: utils.i18n,
+ url: utils.createURL,
+ link: utils.createLink
+ },
+ methods: {
+ createLink: utils.createLink,
+ createURL: utils.createURL,
+ i18n: utils.i18n,
+ getLanguage: utils.getLanguage,
+ fetchData: utils.fetchData,
+ saveData: utils.saveData,
+ readData: utils.readData,
+ jumpTo: utils.jumpTo
+ },
+ created: function created() {
+ var _this = this;
+
+ // get and set language
+ utils.getLanguage(function (language) {
+ _this.language = language;
+ utils.setTitleBar(_this.navigationBarOptions, language);
+ });
+
+ // listen to the language change event
+ var channel = new BroadcastChannel('language');
+ channel.onmessage = function (event) {
+ if (event.data && event.data.language) {
+ _this.language = event.data.language;
+ }
+ };
+ },
+ beforeDestroy: function beforeDestroy() {
+ storage.removeItem('CURRENT_DOCUMENT_URL');
+ storage.removeItem('CURRENT_SOURCE_HASH');
+ }
+};
+
+/***/ }),
+/* 40 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(41), __esModule: true };
+
+/***/ }),
+/* 41 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var core = __webpack_require__(4);
+var $JSON = core.JSON || (core.JSON = { stringify: JSON.stringify });
+module.exports = function stringify(it) { // eslint-disable-line no-unused-vars
+ return $JSON.stringify.apply($JSON, arguments);
+};
+
+
+/***/ }),
+/* 42 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = true;
+
+var _iterator = __webpack_require__(43);
+
+var _iterator2 = _interopRequireDefault(_iterator);
+
+var _symbol = __webpack_require__(62);
+
+var _symbol2 = _interopRequireDefault(_symbol);
+
+var _typeof = typeof _symbol2.default === "function" && typeof _iterator2.default === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj; };
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.default) === "symbol" ? function (obj) {
+ return typeof obj === "undefined" ? "undefined" : _typeof(obj);
+} : function (obj) {
+ return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj);
+};
+
+/***/ }),
+/* 43 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(44), __esModule: true };
+
+/***/ }),
+/* 44 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(45);
+__webpack_require__(58);
+module.exports = __webpack_require__(24).f('iterator');
+
+
+/***/ }),
+/* 45 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $at = __webpack_require__(46)(true);
+
+// 21.1.3.27 String.prototype[@@iterator]()
+__webpack_require__(28)(String, 'String', function (iterated) {
+ this._t = String(iterated); // target
+ this._i = 0; // next index
+// 21.1.5.2.1 %StringIteratorPrototype%.next()
+}, function () {
+ var O = this._t;
+ var index = this._i;
+ var point;
+ if (index >= O.length) return { value: undefined, done: true };
+ point = $at(O, index);
+ this._i += point.length;
+ return { value: point, done: false };
+});
+
+
+/***/ }),
+/* 46 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(14);
+var defined = __webpack_require__(15);
+// true -> String#at
+// false -> String#codePointAt
+module.exports = function (TO_STRING) {
+ return function (that, pos) {
+ var s = String(defined(that));
+ var i = toInteger(pos);
+ var l = s.length;
+ var a, b;
+ if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
+ a = s.charCodeAt(i);
+ return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
+ ? TO_STRING ? s.charAt(i) : a
+ : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
+ };
+};
+
+
+/***/ }),
+/* 47 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// optional / simple context binding
+var aFunction = __webpack_require__(48);
+module.exports = function (fn, that, length) {
+ aFunction(fn);
+ if (that === undefined) return fn;
+ switch (length) {
+ case 1: return function (a) {
+ return fn.call(that, a);
+ };
+ case 2: return function (a, b) {
+ return fn.call(that, a, b);
+ };
+ case 3: return function (a, b, c) {
+ return fn.call(that, a, b, c);
+ };
+ }
+ return function (/* ...args */) {
+ return fn.apply(that, arguments);
+ };
+};
+
+
+/***/ }),
+/* 48 */
+/***/ (function(module, exports) {
+
+module.exports = function (it) {
+ if (typeof it != 'function') throw TypeError(it + ' is not a function!');
+ return it;
+};
+
+
+/***/ }),
+/* 49 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var create = __webpack_require__(32);
+var descriptor = __webpack_require__(12);
+var setToStringTag = __webpack_require__(23);
+var IteratorPrototype = {};
+
+// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
+__webpack_require__(5)(IteratorPrototype, __webpack_require__(7)('iterator'), function () { return this; });
+
+module.exports = function (Constructor, NAME, next) {
+ Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });
+ setToStringTag(Constructor, NAME + ' Iterator');
+};
+
+
+/***/ }),
+/* 50 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dP = __webpack_require__(1);
+var anObject = __webpack_require__(10);
+var getKeys = __webpack_require__(19);
+
+module.exports = __webpack_require__(2) ? Object.defineProperties : function defineProperties(O, Properties) {
+ anObject(O);
+ var keys = getKeys(Properties);
+ var length = keys.length;
+ var i = 0;
+ var P;
+ while (length > i) dP.f(O, P = keys[i++], Properties[P]);
+ return O;
+};
+
+
+/***/ }),
+/* 51 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// fallback for non-array-like ES3 and non-enumerable old V8 strings
+var cof = __webpack_require__(34);
+// eslint-disable-next-line no-prototype-builtins
+module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
+ return cof(it) == 'String' ? it.split('') : Object(it);
+};
+
+
+/***/ }),
+/* 52 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// false -> Array#indexOf
+// true -> Array#includes
+var toIObject = __webpack_require__(6);
+var toLength = __webpack_require__(53);
+var toAbsoluteIndex = __webpack_require__(54);
+module.exports = function (IS_INCLUDES) {
+ return function ($this, el, fromIndex) {
+ var O = toIObject($this);
+ var length = toLength(O.length);
+ var index = toAbsoluteIndex(fromIndex, length);
+ var value;
+ // Array#includes uses SameValueZero equality algorithm
+ // eslint-disable-next-line no-self-compare
+ if (IS_INCLUDES && el != el) while (length > index) {
+ value = O[index++];
+ // eslint-disable-next-line no-self-compare
+ if (value != value) return true;
+ // Array#indexOf ignores holes, Array#includes - not
+ } else for (;length > index; index++) if (IS_INCLUDES || index in O) {
+ if (O[index] === el) return IS_INCLUDES || index || 0;
+ } return !IS_INCLUDES && -1;
+ };
+};
+
+
+/***/ }),
+/* 53 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.15 ToLength
+var toInteger = __webpack_require__(14);
+var min = Math.min;
+module.exports = function (it) {
+ return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
+};
+
+
+/***/ }),
+/* 54 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(14);
+var max = Math.max;
+var min = Math.min;
+module.exports = function (index, length) {
+ index = toInteger(index);
+ return index < 0 ? max(index + length, 0) : min(index, length);
+};
+
+
+/***/ }),
+/* 55 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var document = __webpack_require__(0).document;
+module.exports = document && document.documentElement;
+
+
+/***/ }),
+/* 56 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
+var has = __webpack_require__(3);
+var toObject = __webpack_require__(57);
+var IE_PROTO = __webpack_require__(20)('IE_PROTO');
+var ObjectProto = Object.prototype;
+
+module.exports = Object.getPrototypeOf || function (O) {
+ O = toObject(O);
+ if (has(O, IE_PROTO)) return O[IE_PROTO];
+ if (typeof O.constructor == 'function' && O instanceof O.constructor) {
+ return O.constructor.prototype;
+ } return O instanceof Object ? ObjectProto : null;
+};
+
+
+/***/ }),
+/* 57 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.13 ToObject(argument)
+var defined = __webpack_require__(15);
+module.exports = function (it) {
+ return Object(defined(it));
+};
+
+
+/***/ }),
+/* 58 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(59);
+var global = __webpack_require__(0);
+var hide = __webpack_require__(5);
+var Iterators = __webpack_require__(18);
+var TO_STRING_TAG = __webpack_require__(7)('toStringTag');
+
+var DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +
+ 'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +
+ 'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +
+ 'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +
+ 'TextTrackList,TouchList').split(',');
+
+for (var i = 0; i < DOMIterables.length; i++) {
+ var NAME = DOMIterables[i];
+ var Collection = global[NAME];
+ var proto = Collection && Collection.prototype;
+ if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);
+ Iterators[NAME] = Iterators.Array;
+}
+
+
+/***/ }),
+/* 59 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var addToUnscopables = __webpack_require__(60);
+var step = __webpack_require__(61);
+var Iterators = __webpack_require__(18);
+var toIObject = __webpack_require__(6);
+
+// 22.1.3.4 Array.prototype.entries()
+// 22.1.3.13 Array.prototype.keys()
+// 22.1.3.29 Array.prototype.values()
+// 22.1.3.30 Array.prototype[@@iterator]()
+module.exports = __webpack_require__(28)(Array, 'Array', function (iterated, kind) {
+ this._t = toIObject(iterated); // target
+ this._i = 0; // next index
+ this._k = kind; // kind
+// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
+}, function () {
+ var O = this._t;
+ var kind = this._k;
+ var index = this._i++;
+ if (!O || index >= O.length) {
+ this._t = undefined;
+ return step(1);
+ }
+ if (kind == 'keys') return step(0, index);
+ if (kind == 'values') return step(0, O[index]);
+ return step(0, [index, O[index]]);
+}, 'values');
+
+// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
+Iterators.Arguments = Iterators.Array;
+
+addToUnscopables('keys');
+addToUnscopables('values');
+addToUnscopables('entries');
+
+
+/***/ }),
+/* 60 */
+/***/ (function(module, exports) {
+
+module.exports = function () { /* empty */ };
+
+
+/***/ }),
+/* 61 */
+/***/ (function(module, exports) {
+
+module.exports = function (done, value) {
+ return { value: value, done: !!done };
+};
+
+
+/***/ }),
+/* 62 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(63), __esModule: true };
+
+/***/ }),
+/* 63 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(64);
+__webpack_require__(70);
+__webpack_require__(71);
+__webpack_require__(72);
+module.exports = __webpack_require__(4).Symbol;
+
+
+/***/ }),
+/* 64 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// ECMAScript 6 symbols shim
+var global = __webpack_require__(0);
+var has = __webpack_require__(3);
+var DESCRIPTORS = __webpack_require__(2);
+var $export = __webpack_require__(16);
+var redefine = __webpack_require__(31);
+var META = __webpack_require__(65).KEY;
+var $fails = __webpack_require__(11);
+var shared = __webpack_require__(21);
+var setToStringTag = __webpack_require__(23);
+var uid = __webpack_require__(13);
+var wks = __webpack_require__(7);
+var wksExt = __webpack_require__(24);
+var wksDefine = __webpack_require__(25);
+var enumKeys = __webpack_require__(66);
+var isArray = __webpack_require__(67);
+var anObject = __webpack_require__(10);
+var isObject = __webpack_require__(8);
+var toIObject = __webpack_require__(6);
+var toPrimitive = __webpack_require__(17);
+var createDesc = __webpack_require__(12);
+var _create = __webpack_require__(32);
+var gOPNExt = __webpack_require__(68);
+var $GOPD = __webpack_require__(69);
+var $DP = __webpack_require__(1);
+var $keys = __webpack_require__(19);
+var gOPD = $GOPD.f;
+var dP = $DP.f;
+var gOPN = gOPNExt.f;
+var $Symbol = global.Symbol;
+var $JSON = global.JSON;
+var _stringify = $JSON && $JSON.stringify;
+var PROTOTYPE = 'prototype';
+var HIDDEN = wks('_hidden');
+var TO_PRIMITIVE = wks('toPrimitive');
+var isEnum = {}.propertyIsEnumerable;
+var SymbolRegistry = shared('symbol-registry');
+var AllSymbols = shared('symbols');
+var OPSymbols = shared('op-symbols');
+var ObjectProto = Object[PROTOTYPE];
+var USE_NATIVE = typeof $Symbol == 'function';
+var QObject = global.QObject;
+// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
+var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
+
+// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
+var setSymbolDesc = DESCRIPTORS && $fails(function () {
+ return _create(dP({}, 'a', {
+ get: function () { return dP(this, 'a', { value: 7 }).a; }
+ })).a != 7;
+}) ? function (it, key, D) {
+ var protoDesc = gOPD(ObjectProto, key);
+ if (protoDesc) delete ObjectProto[key];
+ dP(it, key, D);
+ if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);
+} : dP;
+
+var wrap = function (tag) {
+ var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);
+ sym._k = tag;
+ return sym;
+};
+
+var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {
+ return typeof it == 'symbol';
+} : function (it) {
+ return it instanceof $Symbol;
+};
+
+var $defineProperty = function defineProperty(it, key, D) {
+ if (it === ObjectProto) $defineProperty(OPSymbols, key, D);
+ anObject(it);
+ key = toPrimitive(key, true);
+ anObject(D);
+ if (has(AllSymbols, key)) {
+ if (!D.enumerable) {
+ if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));
+ it[HIDDEN][key] = true;
+ } else {
+ if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
+ D = _create(D, { enumerable: createDesc(0, false) });
+ } return setSymbolDesc(it, key, D);
+ } return dP(it, key, D);
+};
+var $defineProperties = function defineProperties(it, P) {
+ anObject(it);
+ var keys = enumKeys(P = toIObject(P));
+ var i = 0;
+ var l = keys.length;
+ var key;
+ while (l > i) $defineProperty(it, key = keys[i++], P[key]);
+ return it;
+};
+var $create = function create(it, P) {
+ return P === undefined ? _create(it) : $defineProperties(_create(it), P);
+};
+var $propertyIsEnumerable = function propertyIsEnumerable(key) {
+ var E = isEnum.call(this, key = toPrimitive(key, true));
+ if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;
+ return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
+};
+var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
+ it = toIObject(it);
+ key = toPrimitive(key, true);
+ if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;
+ var D = gOPD(it, key);
+ if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
+ return D;
+};
+var $getOwnPropertyNames = function getOwnPropertyNames(it) {
+ var names = gOPN(toIObject(it));
+ var result = [];
+ var i = 0;
+ var key;
+ while (names.length > i) {
+ if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
+ } return result;
+};
+var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
+ var IS_OP = it === ObjectProto;
+ var names = gOPN(IS_OP ? OPSymbols : toIObject(it));
+ var result = [];
+ var i = 0;
+ var key;
+ while (names.length > i) {
+ if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);
+ } return result;
+};
+
+// 19.4.1.1 Symbol([description])
+if (!USE_NATIVE) {
+ $Symbol = function Symbol() {
+ if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
+ var tag = uid(arguments.length > 0 ? arguments[0] : undefined);
+ var $set = function (value) {
+ if (this === ObjectProto) $set.call(OPSymbols, value);
+ if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
+ setSymbolDesc(this, tag, createDesc(1, value));
+ };
+ if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });
+ return wrap(tag);
+ };
+ redefine($Symbol[PROTOTYPE], 'toString', function toString() {
+ return this._k;
+ });
+
+ $GOPD.f = $getOwnPropertyDescriptor;
+ $DP.f = $defineProperty;
+ __webpack_require__(36).f = gOPNExt.f = $getOwnPropertyNames;
+ __webpack_require__(26).f = $propertyIsEnumerable;
+ __webpack_require__(35).f = $getOwnPropertySymbols;
+
+ if (DESCRIPTORS && !__webpack_require__(9)) {
+ redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
+ }
+
+ wksExt.f = function (name) {
+ return wrap(wks(name));
+ };
+}
+
+$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });
+
+for (var es6Symbols = (
+ // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
+ 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
+).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);
+
+for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);
+
+$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
+ // 19.4.2.1 Symbol.for(key)
+ 'for': function (key) {
+ return has(SymbolRegistry, key += '')
+ ? SymbolRegistry[key]
+ : SymbolRegistry[key] = $Symbol(key);
+ },
+ // 19.4.2.5 Symbol.keyFor(sym)
+ keyFor: function keyFor(sym) {
+ if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');
+ for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;
+ },
+ useSetter: function () { setter = true; },
+ useSimple: function () { setter = false; }
+});
+
+$export($export.S + $export.F * !USE_NATIVE, 'Object', {
+ // 19.1.2.2 Object.create(O [, Properties])
+ create: $create,
+ // 19.1.2.4 Object.defineProperty(O, P, Attributes)
+ defineProperty: $defineProperty,
+ // 19.1.2.3 Object.defineProperties(O, Properties)
+ defineProperties: $defineProperties,
+ // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
+ getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
+ // 19.1.2.7 Object.getOwnPropertyNames(O)
+ getOwnPropertyNames: $getOwnPropertyNames,
+ // 19.1.2.8 Object.getOwnPropertySymbols(O)
+ getOwnPropertySymbols: $getOwnPropertySymbols
+});
+
+// 24.3.2 JSON.stringify(value [, replacer [, space]])
+$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {
+ var S = $Symbol();
+ // MS Edge converts symbol values to JSON as {}
+ // WebKit converts symbol values to JSON as null
+ // V8 throws on boxed symbols
+ return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';
+})), 'JSON', {
+ stringify: function stringify(it) {
+ var args = [it];
+ var i = 1;
+ var replacer, $replacer;
+ while (arguments.length > i) args.push(arguments[i++]);
+ $replacer = replacer = args[1];
+ if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
+ if (!isArray(replacer)) replacer = function (key, value) {
+ if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
+ if (!isSymbol(value)) return value;
+ };
+ args[1] = replacer;
+ return _stringify.apply($JSON, args);
+ }
+});
+
+// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
+$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(5)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
+// 19.4.3.5 Symbol.prototype[@@toStringTag]
+setToStringTag($Symbol, 'Symbol');
+// 20.2.1.9 Math[@@toStringTag]
+setToStringTag(Math, 'Math', true);
+// 24.3.3 JSON[@@toStringTag]
+setToStringTag(global.JSON, 'JSON', true);
+
+
+/***/ }),
+/* 65 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var META = __webpack_require__(13)('meta');
+var isObject = __webpack_require__(8);
+var has = __webpack_require__(3);
+var setDesc = __webpack_require__(1).f;
+var id = 0;
+var isExtensible = Object.isExtensible || function () {
+ return true;
+};
+var FREEZE = !__webpack_require__(11)(function () {
+ return isExtensible(Object.preventExtensions({}));
+});
+var setMeta = function (it) {
+ setDesc(it, META, { value: {
+ i: 'O' + ++id, // object ID
+ w: {} // weak collections IDs
+ } });
+};
+var fastKey = function (it, create) {
+ // return primitive with prefix
+ if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
+ if (!has(it, META)) {
+ // can't set metadata to uncaught frozen object
+ if (!isExtensible(it)) return 'F';
+ // not necessary to add metadata
+ if (!create) return 'E';
+ // add missing metadata
+ setMeta(it);
+ // return object ID
+ } return it[META].i;
+};
+var getWeak = function (it, create) {
+ if (!has(it, META)) {
+ // can't set metadata to uncaught frozen object
+ if (!isExtensible(it)) return true;
+ // not necessary to add metadata
+ if (!create) return false;
+ // add missing metadata
+ setMeta(it);
+ // return hash weak collections IDs
+ } return it[META].w;
+};
+// add metadata on freeze-family methods calling
+var onFreeze = function (it) {
+ if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);
+ return it;
+};
+var meta = module.exports = {
+ KEY: META,
+ NEED: false,
+ fastKey: fastKey,
+ getWeak: getWeak,
+ onFreeze: onFreeze
+};
+
+
+/***/ }),
+/* 66 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// all enumerable object keys, includes symbols
+var getKeys = __webpack_require__(19);
+var gOPS = __webpack_require__(35);
+var pIE = __webpack_require__(26);
+module.exports = function (it) {
+ var result = getKeys(it);
+ var getSymbols = gOPS.f;
+ if (getSymbols) {
+ var symbols = getSymbols(it);
+ var isEnum = pIE.f;
+ var i = 0;
+ var key;
+ while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);
+ } return result;
+};
+
+
+/***/ }),
+/* 67 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.2.2 IsArray(argument)
+var cof = __webpack_require__(34);
+module.exports = Array.isArray || function isArray(arg) {
+ return cof(arg) == 'Array';
+};
+
+
+/***/ }),
+/* 68 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
+var toIObject = __webpack_require__(6);
+var gOPN = __webpack_require__(36).f;
+var toString = {}.toString;
+
+var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
+ ? Object.getOwnPropertyNames(window) : [];
+
+var getWindowNames = function (it) {
+ try {
+ return gOPN(it);
+ } catch (e) {
+ return windowNames.slice();
+ }
+};
+
+module.exports.f = function getOwnPropertyNames(it) {
+ return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));
+};
+
+
+/***/ }),
+/* 69 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var pIE = __webpack_require__(26);
+var createDesc = __webpack_require__(12);
+var toIObject = __webpack_require__(6);
+var toPrimitive = __webpack_require__(17);
+var has = __webpack_require__(3);
+var IE8_DOM_DEFINE = __webpack_require__(29);
+var gOPD = Object.getOwnPropertyDescriptor;
+
+exports.f = __webpack_require__(2) ? gOPD : function getOwnPropertyDescriptor(O, P) {
+ O = toIObject(O);
+ P = toPrimitive(P, true);
+ if (IE8_DOM_DEFINE) try {
+ return gOPD(O, P);
+ } catch (e) { /* empty */ }
+ if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);
+};
+
+
+/***/ }),
+/* 70 */
+/***/ (function(module, exports) {
+
+
+
+/***/ }),
+/* 71 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(25)('asyncIterator');
+
+
+/***/ }),
+/* 72 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(25)('observable');
+
+
+/***/ }),
+/* 73 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __vue_exports__, __vue_options__
+var __vue_styles__ = []
+
+/* styles */
+__vue_styles__.push(__webpack_require__(74)
+)
+
+/* script */
+__vue_exports__ = __webpack_require__(75)
+
+/* template */
+var __vue_template__ = __webpack_require__(86)
+__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+if (
+ typeof __vue_exports__.default === "object" ||
+ typeof __vue_exports__.default === "function"
+) {
+if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+__vue_options__ = __vue_exports__ = __vue_exports__.default
+}
+if (typeof __vue_options__ === "function") {
+ __vue_options__ = __vue_options__.options
+}
+__vue_options__.__file = "/Users/kw/github/weex-vue-examples/src/pages/guide/Guide.vue"
+__vue_options__.render = __vue_template__.render
+__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+__vue_options__._scopeId = "data-v-5490db22"
+__vue_options__.style = __vue_options__.style || {}
+__vue_styles__.forEach(function (module) {
+ for (var name in module) {
+ __vue_options__.style[name] = module[name]
+ }
+})
+if (typeof __register_static_styles__ === "function") {
+ __register_static_styles__(__vue_options__._scopeId, __vue_styles__)
+}
+
+module.exports = __vue_exports__
+
+
+/***/ }),
+/* 74 */
+/***/ (function(module, exports) {
+
+module.exports = {
+ "size": {
+ "width": "750",
+ "height": "320"
+ },
+ "center": {
+ "alignItems": "center",
+ "justifyContent": "center"
+ },
+ "slider": {
+ "width": "750",
+ "height": "400",
+ "boxShadow": "0 5px 10px rgba(0, 0, 0, 0.2)",
+ "marginBottom": "10"
+ },
+ "slider-title": {
+ "width": "750",
+ "paddingTop": 0,
+ "paddingRight": "30",
+ "paddingBottom": "30",
+ "paddingLeft": "30",
+ "fontSize": "46",
+ "textAlign": "center",
+ "color": "#FFFFFF"
+ },
+ "indicator": {
+ "position": "absolute",
+ "left": 0,
+ "right": 0,
+ "bottom": 0,
+ "width": "750",
+ "height": "30",
+ "itemSize": "12",
+ "itemColor": "#DDDDDD",
+ "itemSelectedColor": "rgb(0,180,255)"
+ }
+}
+
+/***/ }),
+/* 75 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _utils = __webpack_require__(27);
+
+var _Lesson = __webpack_require__(76);
+
+var _Lesson2 = _interopRequireDefault(_Lesson);
+
+var _mock = __webpack_require__(80);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var useStorage = false; //
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+exports.default = {
+ components: { Lesson: _Lesson2.default },
+ data: function data() {
+ return {
+ language: 'en',
+ navigationBarOptions: {
+ title: {
+ zh: 'Weex 入门',
+ en: 'Weex Guide'
+ }
+ },
+ lenssonIndex: 0,
+ guideLessons: _mock.guideLessons
+ };
+ },
+
+ computed: {
+ chosenLesson: function chosenLesson() {
+ return this.guideLessons[this.lenssonIndex];
+ }
+ },
+ watch: {
+ lenssonIndex: function lenssonIndex() {
+ this.navigationBarOptions.backgroundColor = this.chosenLesson.mainColor;
+ this.navigationBarOptions.title = this.chosenLesson.title;
+ },
+ navigationBarOptions: function navigationBarOptions() {
+ (0, _utils.setTitleBar)(this.navigationBarOptions, this.language);
+ }
+ },
+ beforeCreate: function beforeCreate() {
+ var _this = this;
+
+ (0, _utils.readGuide)(function (guide) {
+ _this.guideLessons = guide;
+ if (WXEnvironment.platform.toLowerCase() !== 'web') {
+ useStorage = true;
+ }
+ });
+ (0, _utils.fetchGuide)(function (result) {
+ (0, _utils.saveGuide)(result);
+ if (!useStorage) {
+ _this.guideLessons = result.guide;
+ }
+ });
+ }
+};
+
+/***/ }),
+/* 76 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __vue_exports__, __vue_options__
+var __vue_styles__ = []
+
+/* styles */
+__vue_styles__.push(__webpack_require__(77)
+)
+
+/* script */
+__vue_exports__ = __webpack_require__(78)
+
+/* template */
+var __vue_template__ = __webpack_require__(79)
+__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+if (
+ typeof __vue_exports__.default === "object" ||
+ typeof __vue_exports__.default === "function"
+) {
+if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+__vue_options__ = __vue_exports__ = __vue_exports__.default
+}
+if (typeof __vue_options__ === "function") {
+ __vue_options__ = __vue_options__.options
+}
+__vue_options__.__file = "/Users/kw/github/weex-vue-examples/src/components/Lesson.vue"
+__vue_options__.render = __vue_template__.render
+__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+__vue_options__._scopeId = "data-v-2c29cf22"
+__vue_options__.style = __vue_options__.style || {}
+__vue_styles__.forEach(function (module) {
+ for (var name in module) {
+ __vue_options__.style[name] = module[name]
+ }
+})
+if (typeof __register_static_styles__ === "function") {
+ __register_static_styles__(__vue_options__._scopeId, __vue_styles__)
+}
+
+module.exports = __vue_exports__
+
+
+/***/ }),
+/* 77 */
+/***/ (function(module, exports) {
+
+module.exports = {
+ "center": {
+ "alignItems": "center",
+ "justifyContent": "center"
+ },
+ "title": {
+ "fontSize": "60",
+ "textAlign": "center",
+ "marginTop": "60",
+ "marginBottom": "60",
+ "color": "#606060"
+ },
+ "lesson": {
+ "borderBottomWidth": "1",
+ "borderBottomStyle": "solid",
+ "borderBottomColor": "#EEEEEE",
+ "flexDirection": "row",
+ "alignItems": "center"
+ },
+ "lesson-zh": {
+ "width": "600"
+ },
+ "lesson-en": {
+ "width": "630"
+ },
+ "lesson-index": {
+ "color": "#777777",
+ "textAlign": "right",
+ "paddingRight": "30"
+ },
+ "lesson-title": {
+ "paddingTop": "35",
+ "paddingBottom": "35"
+ },
+ "lesson-index-zh": {
+ "fontSize": "46",
+ "width": "120"
+ },
+ "lesson-title-zh": {
+ "fontSize": "42",
+ "width": "480"
+ },
+ "lesson-index-en": {
+ "fontSize": "42",
+ "width": "100"
+ },
+ "lesson-title-en": {
+ "fontSize": "38",
+ "width": "530"
+ },
+ "footer": {
+ "height": "120",
+ "paddingTop": "40"
+ },
+ "copyright": {
+ "fontSize": "22",
+ "color": "#A0A0A0",
+ "textAlign": "center"
+ }
+}
+
+/***/ }),
+/* 78 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+exports.default = {
+ props: ['mainColor', 'title', 'copyright', 'lessons'],
+ data: function data() {
+ return {
+ language: 'en'
+ };
+ }
+};
+
+/***/ }),
+/* 79 */
+/***/ (function(module, exports) {
+
+module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+ return _c('div', {
+ staticClass: ["wrapper"]
+ }, [_c('div', {
+ staticClass: ["center"]
+ }, [_c('text', {
+ staticClass: ["title"]
+ }, [_vm._v(_vm._s(_vm.i18n(_vm.title)))])]), _vm._l((_vm.lessons), function(lesson, i) {
+ return _c('div', {
+ key: i,
+ staticClass: ["center"]
+ }, [_c('div', {
+ class: ['lesson', ("lesson-" + _vm.language)],
+ on: {
+ "click": function($event) {
+ _vm.jumpTo(lesson.docLink, lesson.title)
+ }
+ }
+ }, [_c('text', {
+ class: ['lesson-index', ("lesson-index-" + _vm.language)]
+ }, [_vm._v(_vm._s(i + 1) + ".")]), _c('text', {
+ class: ['lesson-title', ("lesson-title-" + _vm.language)],
+ style: {
+ color: _vm.mainColor
+ }
+ }, [_vm._v(_vm._s(_vm.i18n(lesson.title)))])])])
+ }), _c('div', {
+ staticClass: ["footer", "center"]
+ }, [_c('text', {
+ staticClass: ["copyright"]
+ }, [_vm._v(_vm._s(_vm.i18n(_vm.copyright)))])])], 2)
+},staticRenderFns: []}
+module.exports.render._withStripped = true
+
+/***/ }),
+/* 80 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.aboutApp = exports.guideLessons = undefined;
+
+var _sliders = __webpack_require__(81);
+
+var _sliders2 = _interopRequireDefault(_sliders);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var guideLessons = exports.guideLessons = _sliders2.default;
+
+var aboutApp = exports.aboutApp = [{
+ title: { en: 'Weex Official Website', zh: 'Weex 官方网站' },
+ link: {
+ en: 'http://weex-project.io/',
+ zh: 'http://weex-project.io/cn/'
+ }
+}, {
+ title: { en: 'Apache Software Foundation', zh: 'Apache 软件基金会' },
+ link: 'http://www.apache.org/'
+}, {
+ title: { en: 'Who is using Weex', zh: '谁在使用 Weex' },
+ link: {
+ en: 'http://weex-project.io/who-is-using-weex.html',
+ zh: 'http://weex-project.io/cn/who-is-using-weex.html'
+ }
+}, {
+ title: { en: 'Contribution', zh: '参与贡献' },
+ link: {
+ en: 'http://weex-project.io/guide/contributing.html',
+ zh: 'http://weex-project.io/cn/guide/contributing.html'
+ }
+}, {
+ title: { en: 'Release Note', zh: '版本变更' },
+ link: {
+ en: 'http://weex-project.io/releasenote.html',
+ zh: 'http://weex-project.io/cn/releasenote.html'
+ }
+}, {
+ title: { en: 'FAQ', zh: '常见问题' },
+ link: {
+ en: 'http://weex-project.io/faq.html',
+ zh: 'http://weex-project.io/cn/faq.html'
+ }
+}];
+
+/***/ }),
+/* 81 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _defineProperty2 = __webpack_require__(82);
+
+var _defineProperty3 = _interopRequireDefault(_defineProperty2);
+
+var _ref, _ref2, _ref3;
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+exports.default = [{
+ subject: 'weex',
+ mainColor: '#00B4FF',
+ title: { zh: '学习 Weex', en: 'Learn Weex' },
+ poster: 'https://gw.alicdn.com/tfs/TB1.8Vdl9_I8KJjy0FoXXaFnVXa-3799-1615.png',
+ posterBg: '#E5F7FF',
+ posterStyle: {
+ width: '650px',
+ height: '304px'
+ },
+ copyright: {
+ zh: '来自 http://weex-project.io/cn/',
+ en: 'From http://weex-project.io/'
+ },
+ lessons: [{
+ title: {
+ zh: '快速入门',
+ en: 'Getting Started'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/guide/index.html',
+ en: 'http://weex-project.io/guide/index.html'
+ }
+ }, {
+ title: {
+ zh: '工作原理',
+ en: 'How it Works'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/wiki/index.html',
+ en: 'http://weex-project.io/wiki/index.html'
+ }
+ }, {
+ title: {
+ zh: 'Weex 中的前端框架',
+ en: 'Front-end Frameworks'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/guide/front-end-frameworks.html',
+ en: 'http://weex-project.io/guide/front-end-frameworks.html'
+ }
+ }, {
+ title: {
+ zh: '在 Weex 中使用 Vue.js',
+ en: 'Use Vue.js on Weex'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/guide/use-vue.html',
+ en: 'http://weex-project.io/guide/use-vue.html'
+ }
+ }, {
+ title: {
+ zh: '与 Web 平台的差异',
+ en: 'Platform difference with Web'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/wiki/platform-difference.html',
+ en: 'http://weex-project.io/wiki/platform-difference.html'
+ }
+ }, {
+ title: {
+ zh: '集成 Weex 到已有应用',
+ en: 'Integrate to Your App'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/guide/integrate-to-your-app.html',
+ en: 'http://weex-project.io/guide/integrate-to-your-app.html'
+ }
+ }, {
+ title: {
+ zh: '搭建开发环境',
+ en: 'Set Up Dev Environment'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/guide/set-up-env.html',
+ en: 'http://weex-project.io/guide/set-up-env.html'
+ }
+ }, {
+ title: {
+ zh: '通用样式',
+ en: 'Common Styles'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/wiki/common-styles.html',
+ en: 'http://weex-project.io/wiki/common-styles.html'
+ }
+ }, {
+ title: {
+ zh: '通用事件',
+ en: 'Common Events'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/wiki/common-events.html',
+ en: 'http://weex-project.io/wiki/common-events.html'
+ }
+ }, {
+ title: {
+ zh: 'Weex 实例变量',
+ en: 'The "weex" Variable'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/references/weex-variable.html',
+ en: 'http://weex-project.io/references/weex-variable.html'
+ }
+ }, {
+ title: {
+ zh: '内置组件',
+ en: 'Built-in Components'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/references/components/index.html',
+ en: 'http://weex-project.io/references/components/index.html'
+ }
+ }, {
+ title: {
+ zh: '内置模块',
+ en: 'Built-in Modules'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/references/modules/index.html',
+ en: 'http://weex-project.io/references/modules/index.html'
+ }
+ }, {
+ title: {
+ zh: '扩展 Android 组件/模块',
+ en: 'Extend Android'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/guide/extend-android.html',
+ en: 'http://weex-project.io/guide/extend-android.html'
+ }
+ }, {
+ title: {
+ zh: '扩展 iOS 组件/模块',
+ en: 'Extend iOS'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/guide/extend-ios.html',
+ en: 'http://weex-project.io/guide/extend-ios.html'
+ }
+ }, {
+ title: {
+ zh: '使用 weex-toolkit',
+ en: 'Use weex-toolkit'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/tools/toolkit.html',
+ en: 'http://weex-project.io/tools/toolkit.html'
+ }
+ }, {
+ title: {
+ zh: '如何参与贡献',
+ en: 'How to Contribute'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/contributing.html',
+ en: 'http://weex-project.io/contributing.html'
+ }
+ }]
+}, (_ref = {
+ subject: 'vue',
+ mainColor: '#42b983',
+ title: { zh: '学习 Vue.js', en: 'Learn Vue.js' },
+ poster: 'https://gw.alicdn.com/tfs/TB1J_uKcMMPMeJjy1XdXXasrXXa-400-400.png',
+ posterBg: '#E7FBF2',
+ posterStyle: {
+ width: '300px',
+ height: '300px'
+ }
+}, (0, _defineProperty3.default)(_ref, 'title', {
+ zh: '学习 Vue.js',
+ en: 'Learn Vue.js'
+}), (0, _defineProperty3.default)(_ref, 'copyright', {
+ zh: '来自 https://cn.vuejs.org/',
+ en: 'From https://vuejs.org/'
+}), (0, _defineProperty3.default)(_ref, 'lessons', [{
+ title: {
+ zh: 'Vue.js 是什么?',
+ en: 'What is Vue.js ?'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/index.html',
+ en: 'https://vuejs.org/v2/guide/index.html'
+ }
+}, {
+ title: {
+ zh: '单文件组件',
+ en: 'Single File Components'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/single-file-components.html',
+ en: 'https://vuejs.org/v2/guide/single-file-components.html'
+ }
+}, {
+ title: {
+ zh: '模板语法',
+ en: 'Template Syntax'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/syntax.html',
+ en: 'https://vuejs.org/v2/guide/syntax.html'
+ }
+}, {
+ title: {
+ zh: 'Class 与 Style 绑定',
+ en: 'Class and Style Bindings'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/class-and-style.html',
+ en: 'https://vuejs.org/v2/guide/class-and-style.html'
+ }
+}, {
+ title: {
+ zh: '条件渲染',
+ en: 'Conditional Rendering'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/conditional.html',
+ en: 'https://vuejs.org/v2/guide/conditional.html'
+ }
+}, {
+ title: {
+ zh: '列表渲染',
+ en: 'List Rendering'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/list.html',
+ en: 'https://vuejs.org/v2/guide/list.html'
+ }
+}, {
+ title: {
+ zh: '事件处理',
+ en: 'Event Handling'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/events.html',
+ en: 'https://vuejs.org/v2/guide/events.html'
+ }
+}, {
+ title: {
+ zh: '表单输入绑定',
+ en: 'Form Input Bindings'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/forms.html',
+ en: 'https://vuejs.org/v2/guide/forms.html'
+ }
+}, {
+ title: {
+ zh: 'Vue 实例',
+ en: 'The Vue Instance'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/instance.html',
+ en: 'https://vuejs.org/v2/guide/instance.html'
+ }
+}, {
+ title: {
+ zh: '在 Weex 中使用 Vue.js',
+ en: 'Use Vue.js on Weex'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/guide/use-vue.html',
+ en: 'http://weex-project.io/guide/use-vue.html'
+ }
+}, {
+ title: {
+ zh: '混合(mixins)',
+ en: 'Mixins'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/mixins.html',
+ en: 'https://vuejs.org/v2/guide/mixins.html'
+ }
+}, {
+ title: {
+ zh: '过滤器(filters)',
+ en: 'Filters'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/filters.html',
+ en: 'https://vuejs.org/v2/guide/filters.html'
+ }
+}, {
+ title: {
+ zh: '插件(plugins)',
+ en: 'Plugins'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/plugins.html',
+ en: 'https://vuejs.org/v2/guide/plugins.html'
+ }
+}, {
+ title: {
+ zh: '自定义指令',
+ en: 'Custom Directives'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/custom-directive.html',
+ en: 'https://vuejs.org/v2/guide/custom-directive.html'
+ }
+}, {
+ title: {
+ zh: '状态管理',
+ en: 'State Management'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/state-management.html',
+ en: 'https://vuejs.org/v2/guide/state-management.html'
+ }
+}, {
+ title: {
+ zh: '深入响应式原理',
+ en: 'Reactivity in Depth'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/reactivity.html',
+ en: 'https://vuejs.org/v2/guide/reactivity.html'
+ }
+}, {
+ title: {
+ zh: '渲染函数',
+ en: 'Render Functions'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/render-function.html',
+ en: 'https://vuejs.org/v2/guide/render-function.html'
+ }
+}, {
+ title: {
+ zh: 'TypeScript 支持',
+ en: 'TypeScript Support'
+ },
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/guide/typescript.html',
+ en: 'https://vuejs.org/v2/guide/typescript.html'
+ }
+}, {
+ title: 'API',
+ docLink: {
+ zh: 'https://cn.vuejs.org/v2/api/',
+ en: 'https://vuejs.org/v2/api/'
+ }
+}]), _ref), (_ref2 = {
+ subject: 'javascript',
+ mainColor: '#F7BD2A',
+ title: { zh: '学习 Javascript', en: 'Learn Javascript' },
+ poster: 'https://gw.alicdn.com/tfs/TB1bT98hMoQMeJjy0FpXXcTxpXa-1500-700.png',
+ posterBg: '#FAF3EB',
+ posterStyle: {
+ width: '750px',
+ height: '350px'
+ }
+}, (0, _defineProperty3.default)(_ref2, 'title', {
+ zh: '学习 Javascript',
+ en: 'Learn Javascript'
+}), (0, _defineProperty3.default)(_ref2, 'copyright', {
+ zh: '来自 MDN (Mozilla Developer Network)',
+ en: 'From MDN (Mozilla Developer Network)'
+}), (0, _defineProperty3.default)(_ref2, 'lessons', [{
+ title: {
+ zh: '什么是 Javascript ?',
+ en: 'What is Javascript ?'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/What_is_JavaScript',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/What_is_JavaScript'
+ }
+}, {
+ title: {
+ zh: 'JavaScript基础',
+ en: 'JavaScript basics'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/Getting_started_with_the_web/JavaScript_basics',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/Getting_started_with_the_web/JavaScript_basics'
+ }
+}, {
+ title: {
+ zh: '重新介绍 JavaScript',
+ en: 'A re-introduction to JavaScript'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/A_re-introduction_to_JavaScript',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript'
+ }
+}, {
+ title: {
+ zh: '语法和数据类型',
+ en: 'Grammar and types'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Grammar_and_types#Variable_scope',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Variable_scope'
+ }
+}, {
+ title: {
+ zh: '数据类型和数据结构',
+ en: 'Data types and data structures'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures'
+ }
+}, {
+ title: {
+ zh: '变量',
+ en: 'Variables'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/Variables',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Variables'
+ }
+}, {
+ title: {
+ zh: '数字和操作符',
+ en: 'Numbers and operators'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/Math',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Math'
+ }
+}, {
+ title: {
+ zh: '字符串',
+ en: 'Handling text'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/Strings',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Strings'
+ }
+}, {
+ title: {
+ zh: '常用的 String 方法',
+ en: 'Useful string methods'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/Useful_string_methods',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Useful_string_methods'
+ }
+}, {
+ title: {
+ zh: '数组',
+ en: 'Arrays'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/Arrays',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Arrays'
+ }
+}, {
+ title: {
+ zh: '函数',
+ en: 'Functions'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Functions',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions'
+ }
+}, {
+ title: {
+ zh: 'JavaScript 对象基础',
+ en: 'JavaScript object basics'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/Basics',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Basics'
+ }
+}, {
+ title: {
+ zh: '使用对象',
+ en: 'Working with objects'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Working_with_Objects',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects'
+ }
+}, {
+ title: {
+ zh: '使用 JSON 数据',
+ en: 'Working with JSON'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/JSON',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/JSON'
+ }
+}, {
+ title: {
+ zh: '对象模型的细节',
+ en: 'Details of the object model'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Details_of_the_Object_Model',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Details_of_the_Object_Model'
+ }
+}, {
+ title: {
+ zh: '对象原型',
+ en: 'Object prototypes'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object_prototypes',
+ en: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/Object_prototypes'
+ }
+}, {
+ title: {
+ zh: 'JavaScript 中的继承',
+ en: 'Inheritance in JavaScript'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/Inheritance',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Inheritance'
+ }
+}, {
+ title: {
+ zh: '继承与原型链',
+ en: 'Inheritance and the prototype chain'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain'
+ }
+}, {
+ title: {
+ zh: '严格模式',
+ en: 'Strict mode'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Strict_mode',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode'
+ }
+}, {
+ title: {
+ zh: '内存管理',
+ en: 'Memory Management'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Memory_Management',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management'
+ }
+}, {
+ title: {
+ zh: '并发模型与事件循环',
+ en: 'Concurrency model and Event Loop'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/EventLoop',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop'
+ }
+}, {
+ // title: {
+ // zh: '索引集合类',
+ // en: 'Indexed collections'
+ // },
+ // docLink: {
+ // zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Indexed_collections',
+ // en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Indexed_collections'
+ // }
+ // }, {
+ // title: {
+ // zh: '带键的集合',
+ // en: 'Keyed collections'
+ // },
+ // docLink: {
+ // zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Keyed_collections',
+ // en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Keyed_collections'
+ // }
+ // }, {
+ title: {
+ zh: 'JavaScript 标准库',
+ en: 'Standard built-in objects'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects'
+ }
+}]), _ref2), (_ref3 = {
+ subject: 'css',
+ mainColor: '#F56FC6',
+ title: { zh: '学习 CSS', en: 'Learn CSS' },
+ titleColor: '#FFFFFF',
+ poster: 'https://gw.alicdn.com/tfs/TB1k6anhMMPMeJjy1XdXXasrXXa-427-190.jpg',
+ posterBg: '#FFA2DE',
+ posterStyle: {
+ width: '517px',
+ height: '230px'
+ }
+}, (0, _defineProperty3.default)(_ref3, 'title', {
+ zh: '学习 CSS',
+ en: 'Learn CSS'
+}), (0, _defineProperty3.default)(_ref3, 'copyright', {
+ zh: '来自 MDN (Mozilla Developer Network)',
+ en: 'From MDN (Mozilla Developer Network)'
+}), (0, _defineProperty3.default)(_ref3, 'lessons', [{
+ title: {
+ zh: '什么是 CSS ?',
+ en: 'What is CSS ?'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Getting_started/What_is_CSS',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_started/What_is_CSS'
+ }
+}, {
+ title: {
+ zh: 'CSS 语法',
+ en: 'CSS Syntax'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/CSS/Introduction_to_CSS/Syntax',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/CSS/Introduction_to_CSS/Syntax'
+ }
+}, {
+ title: {
+ zh: 'CSS的值和单位',
+ en: 'CSS Values and Units'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/CSS/Introduction_to_CSS/Values_and_units',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/CSS/Introduction_to_CSS/Values_and_units'
+ }
+}, {
+ title: {
+ zh: '盒模型',
+ en: 'The Box Model'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/CSS/Introduction_to_CSS/Box_model',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/CSS/Introduction_to_CSS/Box_model'
+ }
+}, {
+ title: {
+ zh: '盒模型的属性',
+ en: 'Box Model Properties'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Box_Model',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Box_Model'
+ }
+}, {
+ title: {
+ zh: '定位布局',
+ en: 'Positioning'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/CSS/CSS_layout/%E5%AE%9A%E4%BD%8Dx',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/positioning'
+ }
+}, {
+ title: {
+ zh: '定位布局的属性',
+ en: 'CSS Positioning'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Positioning',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning'
+ }
+}, {
+ title: {
+ zh: 'Flexbox 布局',
+ en: 'Flexbox Layout'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Learn/CSS/CSS_layout/Flexbox',
+ en: 'https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Flexbox'
+ }
+}, {
+ title: {
+ zh: 'Flexbox 布局的属性',
+ en: 'CSS Flexible Box Layout'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Flexible_Box_Layout',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout'
+ }
+}, {
+ title: {
+ zh: 'Weex 中的通用样式',
+ en: 'Common Styles in Weex'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/references/common-style.html',
+ en: 'http://weex-project.io/references/common-style.html'
+ }
+}, {
+ title: {
+ zh: 'Weex 中的文本样式',
+ en: 'Text Styles in Weex'
+ },
+ docLink: {
+ zh: 'http://weex-project.io/cn/references/text-style.html',
+ en: 'http://weex-project.io/references/text-style.html'
+ }
+}, {
+ title: {
+ zh: '块格式化上下文(BFC)',
+ en: 'Block Formatting Context'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Block_formatting_context',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Block_formatting_context'
+ }
+}, {
+ title: {
+ zh: '视觉格式化模型',
+ en: 'Visual Formatting Model'
+ },
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Visual_formatting_model',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Visual_formatting_model'
+ }
+}, {
+ title: 'CSS Reference',
+ docLink: {
+ zh: 'https://developer.mozilla.org/zh-CN/docs/Web/CSS/Reference',
+ en: 'https://developer.mozilla.org/en-US/docs/Web/CSS/Reference'
+ }
+}]), _ref3)];
+
+/***/ }),
+/* 82 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = true;
+
+var _defineProperty = __webpack_require__(83);
+
+var _defineProperty2 = _interopRequireDefault(_defineProperty);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+exports.default = function (obj, key, value) {
+ if (key in obj) {
+ (0, _defineProperty2.default)(obj, key, {
+ value: value,
+ enumerable: true,
+ configurable: true,
+ writable: true
+ });
+ } else {
+ obj[key] = value;
+ }
+
+ return obj;
+};
+
+/***/ }),
+/* 83 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(84), __esModule: true };
+
+/***/ }),
+/* 84 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(85);
+var $Object = __webpack_require__(4).Object;
+module.exports = function defineProperty(it, key, desc) {
+ return $Object.defineProperty(it, key, desc);
+};
+
+
+/***/ }),
+/* 85 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $export = __webpack_require__(16);
+// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)
+$export($export.S + $export.F * !__webpack_require__(2), 'Object', { defineProperty: __webpack_require__(1).f });
+
+
+/***/ }),
+/* 86 */
+/***/ (function(module, exports) {
+
+module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+ return _c('scroller', {
+ staticClass: ["wrapper"]
+ }, [_c('slider', {
+ staticClass: ["slider"],
+ attrs: {
+ "autoPlay": "true"
+ }
+ }, [_vm._l((_vm.guideLessons), function(item, i) {
+ return _c('div', {
+ key: item.subject,
+ staticClass: ["center"],
+ style: {
+ backgroundColor: item.posterBg
+ },
+ on: {
+ "click": function($event) {
+ _vm.lenssonIndex = i
+ }
+ }
+ }, [_c('div', {
+ staticClass: ["center", "size"]
+ }, [_c('image', {
+ style: item.posterStyle,
+ attrs: {
+ "resize": "cover",
+ "src": item.poster
+ }
+ })]), _c('text', {
+ staticClass: ["slider-title"],
+ style: {
+ color: item.titleColor || item.mainColor
+ }
+ }, [_vm._v(_vm._s(_vm.i18n(item.title)))])])
+ }), _c('indicator', {
+ staticClass: ["indicator"]
+ })], 2), _c('lesson', {
+ attrs: {
+ "mainColor": _vm.chosenLesson.mainColor,
+ "title": _vm.chosenLesson.title,
+ "lessons": _vm.chosenLesson.lessons,
+ "copyright": _vm.chosenLesson.copyright
+ }
+ })], 1)
+},staticRenderFns: []}
+module.exports.render._withStripped = true
+
+/***/ })
+/******/ ]);
\ No newline at end of file
diff --git a/android/playground/src/main/assets/landing.weex.js b/android/playground/src/main/assets/landing.weex.js
new file mode 100644
index 0000000..bbb0fb3
--- /dev/null
+++ b/android/playground/src/main/assets/landing.weex.js
@@ -0,0 +1,2319 @@
+// { "framework": "Vue" }
+"use weex:vue";
+
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 37);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports) {
+
+// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
+var global = module.exports = typeof window != 'undefined' && window.Math == Math
+ ? window : typeof self != 'undefined' && self.Math == Math ? self
+ // eslint-disable-next-line no-new-func
+ : Function('return this')();
+if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports) {
+
+var hasOwnProperty = {}.hasOwnProperty;
+module.exports = function (it, key) {
+ return hasOwnProperty.call(it, key);
+};
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dP = __webpack_require__(3);
+var createDesc = __webpack_require__(12);
+module.exports = __webpack_require__(4) ? function (object, key, value) {
+ return dP.f(object, key, createDesc(1, value));
+} : function (object, key, value) {
+ object[key] = value;
+ return object;
+};
+
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var anObject = __webpack_require__(10);
+var IE8_DOM_DEFINE = __webpack_require__(29);
+var toPrimitive = __webpack_require__(17);
+var dP = Object.defineProperty;
+
+exports.f = __webpack_require__(4) ? Object.defineProperty : function defineProperty(O, P, Attributes) {
+ anObject(O);
+ P = toPrimitive(P, true);
+ anObject(Attributes);
+ if (IE8_DOM_DEFINE) try {
+ return dP(O, P, Attributes);
+ } catch (e) { /* empty */ }
+ if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
+ if ('value' in Attributes) O[P] = Attributes.value;
+ return O;
+};
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// Thank's IE8 for his funny defineProperty
+module.exports = !__webpack_require__(11)(function () {
+ return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
+});
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// to indexed object, toObject with fallback for non-array-like ES3 strings
+var IObject = __webpack_require__(51);
+var defined = __webpack_require__(16);
+module.exports = function (it) {
+ return IObject(defined(it));
+};
+
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var store = __webpack_require__(21)('wks');
+var uid = __webpack_require__(13);
+var Symbol = __webpack_require__(0).Symbol;
+var USE_SYMBOL = typeof Symbol == 'function';
+
+var $exports = module.exports = function (name) {
+ return store[name] || (store[name] =
+ USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
+};
+
+$exports.store = store;
+
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports) {
+
+var core = module.exports = { version: '2.5.7' };
+if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
+
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports) {
+
+module.exports = function (it) {
+ return typeof it === 'object' ? it !== null : typeof it === 'function';
+};
+
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports) {
+
+module.exports = true;
+
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(8);
+module.exports = function (it) {
+ if (!isObject(it)) throw TypeError(it + ' is not an object!');
+ return it;
+};
+
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports) {
+
+module.exports = function (exec) {
+ try {
+ return !!exec();
+ } catch (e) {
+ return true;
+ }
+};
+
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports) {
+
+module.exports = function (bitmap, value) {
+ return {
+ enumerable: !(bitmap & 1),
+ configurable: !(bitmap & 2),
+ writable: !(bitmap & 4),
+ value: value
+ };
+};
+
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports) {
+
+var id = 0;
+var px = Math.random();
+module.exports = function (key) {
+ return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
+};
+
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.fetchNews = exports.fetchDoodle = exports.readAbout = exports.saveAbout = exports.fetchAbout = exports.readGuide = exports.saveGuide = exports.fetchGuide = exports.readExamples = exports.saveExamples = exports.fetchExamples = undefined;
+
+var _stringify = __webpack_require__(40);
+
+var _stringify2 = _interopRequireDefault(_stringify);
+
+var _typeof2 = __webpack_require__(42);
+
+var _typeof3 = _interopRequireDefault(_typeof2);
+
+exports.createLink = createLink;
+exports.createURL = createURL;
+exports.i18n = i18n;
+exports.parseLanguage = parseLanguage;
+exports.setLanguage = setLanguage;
+exports.clearStorageLanguage = clearStorageLanguage;
+exports.getStorageLanguage = getStorageLanguage;
+exports.getSystemLanguage = getSystemLanguage;
+exports.getLanguage = getLanguage;
+exports.jumpTo = jumpTo;
+exports.viewSource = viewSource;
+exports.setTitleBar = setTitleBar;
+exports.fetchData = fetchData;
+exports.saveData = saveData;
+exports.readData = readData;
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var stream = weex.requireModule('stream');
+var storage = weex.requireModule('storage');
+var navigator = weex.requireModule('navigator');
+
+var encoder = typeof encodeURIComponent === 'function' ? encodeURIComponent : typeof encodeURI === 'function' ? encodeURI : function (x) {
+ return x;
+};
+
+function encodeParams(params) {
+ if (!params || (typeof params === 'undefined' ? 'undefined' : (0, _typeof3.default)(params)) !== 'object') {
+ return '';
+ }
+ var array = [];
+ for (var key in params) {
+ if (typeof params[key] === 'string') {
+ array.push(encoder(key) + '=' + encoder(params[key]));
+ }
+ }
+ return array.join('&');
+}
+
+function createLink(name) {
+ var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var args = [];
+ for (var key in params) {
+ if (typeof params[key] === 'string') {
+ args.push(encoder(key) + '=' + encoder(params[key]));
+ }
+ }
+ if (WXEnvironment.platform === 'Web') {
+ args.unshift('page=' + name + '.web.js');
+ return '/?' + args.join('&');
+ }
+ var base = getBaseURL();
+ return '' + base + name + '.weex.js' + (args.length ? '?' + args.join('&') : '');
+}
+
+function createURL(hash, params) {
+ if (WXEnvironment.platform === 'Web') {
+ return 'http://dotwe.org/raw/htmlVue/' + hash;
+ }
+ var url = 'http://dotwe.org/raw/dist/' + hash + '.bundle.wx';
+ var paramString = encodeParams(params);
+ if (WXEnvironment.appName === 'TB') {
+ return url + '?_wx_tpl=' + url + '&' + paramString;
+ }
+ if (WXEnvironment.appName === 'WXSample') {
+ return url + '?' + paramString;
+ }
+ return url + '?wx_weex=true&' + paramString;
+}
+
+function getBaseURL() {
+ var bundleUrl = weex.config.bundleUrl;
+ var isAndroidAssets = bundleUrl.indexOf('your_current_IP') >= 0 || bundleUrl.indexOf('file://assets/') >= 0;
+ var isiOSAssets = bundleUrl.indexOf('file:///') >= 0 && bundleUrl.indexOf('WeexDemo.app') > 0;
+ if (isAndroidAssets) {
+ return 'file://assets/';
+ } else if (isiOSAssets) {
+ // file:///var/mobile/Containers/Bundle/Application/{id}/WeexDemo.app/
+ // file:///Users/{user}/Library/Developer/CoreSimulator/Devices/{id}/data/Containers/Bundle/Application/{id}/WeexDemo.app/
+ return bundleUrl.substring(0, bundleUrl.lastIndexOf('/') + 1);
+ }
+ return '';
+}
+
+function i18n(text, language) {
+ if (typeof text === 'string') {
+ return text;
+ }
+ if (Object.prototype.toString.call(text) === '[object Object]') {
+ var lang = this && this.language || language || 'en';
+ return text[lang];
+ }
+}
+
+var supportedLanguageRE = /(en|zh)\_?\w*/i;
+function parseLanguage(language) {
+ var match = supportedLanguageRE.exec(language + '');
+ if (match && match[1]) {
+ return match[1];
+ }
+ return '';
+}
+
+function setLanguage(language) {
+ var lang = parseLanguage(language);
+ if (lang) {
+ storage.setItem('WEEX_PLAYGROUND_LANGUAGE', lang);
+ }
+}
+
+function clearStorageLanguage() {
+ storage.removeItem('WEEX_PLAYGROUND_LANGUAGE');
+}
+
+function getStorageLanguage(done) {
+ var fail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+
+ if (!(typeof done === 'undefined' ? 'undefined' : (0, _typeof3.default)(done)) === 'function') {
+ return;
+ }
+ try {
+ storage.getItem('WEEX_PLAYGROUND_LANGUAGE', function (event) {
+ if (event.result === 'success') {
+ var lang = parseLanguage(event.data);
+ lang ? done(lang) : fail();
+ } else {
+ fail(event);
+ }
+ });
+ } catch (err) {
+ fail(err);
+ }
+}
+
+function getSystemLanguage(done) {
+ var fail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+
+ if (!(typeof done === 'undefined' ? 'undefined' : (0, _typeof3.default)(done)) === 'function') {
+ return;
+ }
+ if (WXEnvironment.platform.toLowerCase() === 'web') {
+ var lang = parseLanguage(window.navigator.language);
+ lang ? done(lang) : fail();
+ } else {
+ try {
+ var locale = weex.requireModule('locale') || weex.requireModule('local');
+ var useSync = false;
+ var resSync = locale.getLanguage(function (language) {
+ var lang = parseLanguage(language);
+ if (lang) {
+ useSync || done(lang);
+ } else {
+ fail();
+ }
+ });
+ var langSync = parseLanguage(resSync);
+ if (langSync) {
+ useSync = true;
+ done(langSync);
+ } else {
+ fail();
+ }
+ } catch (e) {
+ fail(e);
+ }
+ }
+}
+
+var languageRE = /.+[\?\&]{1}language=([\d\w]+)[\?\&]?.*/i;
+function getLanguage() {
+ var done = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
+
+ var match = languageRE.exec(weex.config.bundleUrl || '');
+ var lang = parseLanguage(match && match[1]);
+ if (lang) {
+ done(lang);
+ } else {
+ getStorageLanguage(done, function () {
+ getSystemLanguage(done, function () {
+ done('en');
+ });
+ });
+ }
+}
+
+function jumpTo(url, title, lang) {
+ getLanguage(function (language) {
+ storage.setItem('CURRENT_DOCUMENT_URL', i18n(url, lang || language));
+ navigator.push({
+ url: createURL('bf0305c14b511b24a4e616f53926432b', { language: language, title: i18n(title, lang || language) })
+ });
+ });
+}
+
+function viewSource(hash) {
+ getLanguage(function (language) {
+ navigator.push({
+ url: createURL('f6ce29faf686eabc38b410bf4828fa5a', { hash: hash, language: language })
+ });
+ });
+}
+
+function setTitleBar(options) {
+ var language = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en';
+
+ if (Object.prototype.toString.apply(options) !== '[object Object]') {
+ return;
+ }
+ var titleBar = weex.requireModule('titleBar');
+ if (options.color || options.backgroundColor) {
+ try {
+ titleBar.setStyle({
+ foregroundColor: options.color || '#FFFFFF',
+ backgroundColor: options.backgroundColor || '#00B4FF'
+ });
+ } catch (e) {}
+ }
+ var title = i18n(options.title, language);
+ if (title) {
+ try {
+ titleBar.setTitle(title);
+ } catch (e) {}
+ }
+}
+
+var storageKeys = {
+ doodle: 'WEEX_PLAYGROUND_APP_DOODLE',
+ guide: 'WEEX_PLAYGROUND_APP_GUIDE',
+ examples: 'WEEX_PLAYGROUND_APP_EXAMPLES',
+ news: 'WEEX_PLAYGROUND_APP_NEWS',
+ about: 'WEEX_PLAYGROUND_APP_ABOUT'
+};
+function fetchData(name) {
+ var done = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+ var fail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
+
+ try {
+ stream.fetch({
+ url: 'http://dotwe.org/query/weex-playground-app',
+ method: 'post',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded'
+ },
+ type: 'json',
+ body: 'name=' + name
+ }, function (res) {
+ if (res.ok && res.data && res.data.success) {
+ done(res.data);
+ } else {
+ fail(res);
+ }
+ });
+ } catch (err) {
+ fail(err);
+ }
+}
+function saveData(name, result) {
+ var key = storageKeys[name];
+ if (!key) return;
+ if (result && (typeof result === 'undefined' ? 'undefined' : (0, _typeof3.default)(result)) === 'object') {
+ result.timestamp = Date.now();
+ storage.setItem(key, (0, _stringify2.default)(result));
+ }
+}
+function readData(name) {
+ var done = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+ var fail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
+
+ var key = storageKeys[name];
+ if (!key) return fail();
+ try {
+ storage.getItem(key, function (event) {
+ if (event.result === 'success') {
+ var result = JSON.parse(event.data);
+ if (result && Array.isArray(result[name])) {
+ return done(result[name]);
+ }
+ }
+ fail(event);
+ });
+ } catch (e) {
+ fail(e);
+ }
+}
+
+var fetchExamples = exports.fetchExamples = function fetchExamples() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ return fetchData.apply(undefined, ['examples'].concat(args));
+};
+var saveExamples = exports.saveExamples = function saveExamples() {
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ return saveData.apply(undefined, ['examples'].concat(args));
+};
+var readExamples = exports.readExamples = function readExamples() {
+ for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+ args[_key3] = arguments[_key3];
+ }
+
+ return readData.apply(undefined, ['examples'].concat(args));
+};
+
+var fetchGuide = exports.fetchGuide = function fetchGuide() {
+ for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
+ args[_key4] = arguments[_key4];
+ }
+
+ return fetchData.apply(undefined, ['guide'].concat(args));
+};
+var saveGuide = exports.saveGuide = function saveGuide() {
+ for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
+ args[_key5] = arguments[_key5];
+ }
+
+ return saveData.apply(undefined, ['guide'].concat(args));
+};
+var readGuide = exports.readGuide = function readGuide() {
+ for (var _len6 = arguments.length, args = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
+ args[_key6] = arguments[_key6];
+ }
+
+ return readData.apply(undefined, ['guide'].concat(args));
+};
+
+var fetchAbout = exports.fetchAbout = function fetchAbout() {
+ for (var _len7 = arguments.length, args = Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
+ args[_key7] = arguments[_key7];
+ }
+
+ return fetchData.apply(undefined, ['about'].concat(args));
+};
+var saveAbout = exports.saveAbout = function saveAbout() {
+ for (var _len8 = arguments.length, args = Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
+ args[_key8] = arguments[_key8];
+ }
+
+ return saveData.apply(undefined, ['about'].concat(args));
+};
+var readAbout = exports.readAbout = function readAbout() {
+ for (var _len9 = arguments.length, args = Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {
+ args[_key9] = arguments[_key9];
+ }
+
+ return readData.apply(undefined, ['about'].concat(args));
+};
+
+var fetchDoodle = exports.fetchDoodle = function fetchDoodle() {
+ for (var _len10 = arguments.length, args = Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {
+ args[_key10] = arguments[_key10];
+ }
+
+ return fetchData.apply(undefined, ['doodle'].concat(args));
+};
+var fetchNews = exports.fetchNews = function fetchNews() {
+ for (var _len11 = arguments.length, args = Array(_len11), _key11 = 0; _key11 < _len11; _key11++) {
+ args[_key11] = arguments[_key11];
+ }
+
+ return fetchData.apply(undefined, ['news'].concat(args));
+};
+
+/***/ }),
+/* 15 */
+/***/ (function(module, exports) {
+
+// 7.1.4 ToInteger
+var ceil = Math.ceil;
+var floor = Math.floor;
+module.exports = function (it) {
+ return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
+};
+
+
+/***/ }),
+/* 16 */
+/***/ (function(module, exports) {
+
+// 7.2.1 RequireObjectCoercible(argument)
+module.exports = function (it) {
+ if (it == undefined) throw TypeError("Can't call method on " + it);
+ return it;
+};
+
+
+/***/ }),
+/* 17 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.1 ToPrimitive(input [, PreferredType])
+var isObject = __webpack_require__(8);
+// instead of the ES6 spec version, we didn't implement @@toPrimitive case
+// and the second argument - flag - preferred type is a string
+module.exports = function (it, S) {
+ if (!isObject(it)) return it;
+ var fn, val;
+ if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+ if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;
+ if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+ throw TypeError("Can't convert object to primitive value");
+};
+
+
+/***/ }),
+/* 18 */
+/***/ (function(module, exports) {
+
+module.exports = {};
+
+
+/***/ }),
+/* 19 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.14 / 15.2.3.14 Object.keys(O)
+var $keys = __webpack_require__(33);
+var enumBugKeys = __webpack_require__(22);
+
+module.exports = Object.keys || function keys(O) {
+ return $keys(O, enumBugKeys);
+};
+
+
+/***/ }),
+/* 20 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var shared = __webpack_require__(21)('keys');
+var uid = __webpack_require__(13);
+module.exports = function (key) {
+ return shared[key] || (shared[key] = uid(key));
+};
+
+
+/***/ }),
+/* 21 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var core = __webpack_require__(7);
+var global = __webpack_require__(0);
+var SHARED = '__core-js_shared__';
+var store = global[SHARED] || (global[SHARED] = {});
+
+(module.exports = function (key, value) {
+ return store[key] || (store[key] = value !== undefined ? value : {});
+})('versions', []).push({
+ version: core.version,
+ mode: __webpack_require__(9) ? 'pure' : 'global',
+ copyright: '© 2018 Denis Pushkarev (zloirock.ru)'
+});
+
+
+/***/ }),
+/* 22 */
+/***/ (function(module, exports) {
+
+// IE 8- don't enum bug keys
+module.exports = (
+ 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
+).split(',');
+
+
+/***/ }),
+/* 23 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var def = __webpack_require__(3).f;
+var has = __webpack_require__(1);
+var TAG = __webpack_require__(6)('toStringTag');
+
+module.exports = function (it, tag, stat) {
+ if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });
+};
+
+
+/***/ }),
+/* 24 */
+/***/ (function(module, exports, __webpack_require__) {
+
+exports.f = __webpack_require__(6);
+
+
+/***/ }),
+/* 25 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(0);
+var core = __webpack_require__(7);
+var LIBRARY = __webpack_require__(9);
+var wksExt = __webpack_require__(24);
+var defineProperty = __webpack_require__(3).f;
+module.exports = function (name) {
+ var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
+ if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });
+};
+
+
+/***/ }),
+/* 26 */
+/***/ (function(module, exports) {
+
+exports.f = {}.propertyIsEnumerable;
+
+
+/***/ }),
+/* 27 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var LIBRARY = __webpack_require__(9);
+var $export = __webpack_require__(28);
+var redefine = __webpack_require__(31);
+var hide = __webpack_require__(2);
+var Iterators = __webpack_require__(18);
+var $iterCreate = __webpack_require__(49);
+var setToStringTag = __webpack_require__(23);
+var getPrototypeOf = __webpack_require__(56);
+var ITERATOR = __webpack_require__(6)('iterator');
+var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
+var FF_ITERATOR = '@@iterator';
+var KEYS = 'keys';
+var VALUES = 'values';
+
+var returnThis = function () { return this; };
+
+module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
+ $iterCreate(Constructor, NAME, next);
+ var getMethod = function (kind) {
+ if (!BUGGY && kind in proto) return proto[kind];
+ switch (kind) {
+ case KEYS: return function keys() { return new Constructor(this, kind); };
+ case VALUES: return function values() { return new Constructor(this, kind); };
+ } return function entries() { return new Constructor(this, kind); };
+ };
+ var TAG = NAME + ' Iterator';
+ var DEF_VALUES = DEFAULT == VALUES;
+ var VALUES_BUG = false;
+ var proto = Base.prototype;
+ var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
+ var $default = $native || getMethod(DEFAULT);
+ var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
+ var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
+ var methods, key, IteratorPrototype;
+ // Fix native
+ if ($anyNative) {
+ IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));
+ if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
+ // Set @@toStringTag to native iterators
+ setToStringTag(IteratorPrototype, TAG, true);
+ // fix for some old engines
+ if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);
+ }
+ }
+ // fix Array#{values, @@iterator}.name in V8 / FF
+ if (DEF_VALUES && $native && $native.name !== VALUES) {
+ VALUES_BUG = true;
+ $default = function values() { return $native.call(this); };
+ }
+ // Define iterator
+ if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
+ hide(proto, ITERATOR, $default);
+ }
+ // Plug for library
+ Iterators[NAME] = $default;
+ Iterators[TAG] = returnThis;
+ if (DEFAULT) {
+ methods = {
+ values: DEF_VALUES ? $default : getMethod(VALUES),
+ keys: IS_SET ? $default : getMethod(KEYS),
+ entries: $entries
+ };
+ if (FORCED) for (key in methods) {
+ if (!(key in proto)) redefine(proto, key, methods[key]);
+ } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
+ }
+ return methods;
+};
+
+
+/***/ }),
+/* 28 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(0);
+var core = __webpack_require__(7);
+var ctx = __webpack_require__(47);
+var hide = __webpack_require__(2);
+var has = __webpack_require__(1);
+var PROTOTYPE = 'prototype';
+
+var $export = function (type, name, source) {
+ var IS_FORCED = type & $export.F;
+ var IS_GLOBAL = type & $export.G;
+ var IS_STATIC = type & $export.S;
+ var IS_PROTO = type & $export.P;
+ var IS_BIND = type & $export.B;
+ var IS_WRAP = type & $export.W;
+ var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
+ var expProto = exports[PROTOTYPE];
+ var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];
+ var key, own, out;
+ if (IS_GLOBAL) source = name;
+ for (key in source) {
+ // contains in native
+ own = !IS_FORCED && target && target[key] !== undefined;
+ if (own && has(exports, key)) continue;
+ // export native or passed
+ out = own ? target[key] : source[key];
+ // prevent global pollution for namespaces
+ exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
+ // bind timers to global for call from export context
+ : IS_BIND && own ? ctx(out, global)
+ // wrap global constructors for prevent change them in library
+ : IS_WRAP && target[key] == out ? (function (C) {
+ var F = function (a, b, c) {
+ if (this instanceof C) {
+ switch (arguments.length) {
+ case 0: return new C();
+ case 1: return new C(a);
+ case 2: return new C(a, b);
+ } return new C(a, b, c);
+ } return C.apply(this, arguments);
+ };
+ F[PROTOTYPE] = C[PROTOTYPE];
+ return F;
+ // make static versions for prototype methods
+ })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
+ // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
+ if (IS_PROTO) {
+ (exports.virtual || (exports.virtual = {}))[key] = out;
+ // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
+ if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);
+ }
+ }
+};
+// type bitmap
+$export.F = 1; // forced
+$export.G = 2; // global
+$export.S = 4; // static
+$export.P = 8; // proto
+$export.B = 16; // bind
+$export.W = 32; // wrap
+$export.U = 64; // safe
+$export.R = 128; // real proto method for `library`
+module.exports = $export;
+
+
+/***/ }),
+/* 29 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = !__webpack_require__(4) && !__webpack_require__(11)(function () {
+ return Object.defineProperty(__webpack_require__(30)('div'), 'a', { get: function () { return 7; } }).a != 7;
+});
+
+
+/***/ }),
+/* 30 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(8);
+var document = __webpack_require__(0).document;
+// typeof document.createElement is 'object' in old IE
+var is = isObject(document) && isObject(document.createElement);
+module.exports = function (it) {
+ return is ? document.createElement(it) : {};
+};
+
+
+/***/ }),
+/* 31 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(2);
+
+
+/***/ }),
+/* 32 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
+var anObject = __webpack_require__(10);
+var dPs = __webpack_require__(50);
+var enumBugKeys = __webpack_require__(22);
+var IE_PROTO = __webpack_require__(20)('IE_PROTO');
+var Empty = function () { /* empty */ };
+var PROTOTYPE = 'prototype';
+
+// Create object with fake `null` prototype: use iframe Object with cleared prototype
+var createDict = function () {
+ // Thrash, waste and sodomy: IE GC bug
+ var iframe = __webpack_require__(30)('iframe');
+ var i = enumBugKeys.length;
+ var lt = '<';
+ var gt = '>';
+ var iframeDocument;
+ iframe.style.display = 'none';
+ __webpack_require__(55).appendChild(iframe);
+ iframe.src = 'javascript:'; // eslint-disable-line no-script-url
+ // createDict = iframe.contentWindow.Object;
+ // html.removeChild(iframe);
+ iframeDocument = iframe.contentWindow.document;
+ iframeDocument.open();
+ iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
+ iframeDocument.close();
+ createDict = iframeDocument.F;
+ while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];
+ return createDict();
+};
+
+module.exports = Object.create || function create(O, Properties) {
+ var result;
+ if (O !== null) {
+ Empty[PROTOTYPE] = anObject(O);
+ result = new Empty();
+ Empty[PROTOTYPE] = null;
+ // add "__proto__" for Object.getPrototypeOf polyfill
+ result[IE_PROTO] = O;
+ } else result = createDict();
+ return Properties === undefined ? result : dPs(result, Properties);
+};
+
+
+/***/ }),
+/* 33 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var has = __webpack_require__(1);
+var toIObject = __webpack_require__(5);
+var arrayIndexOf = __webpack_require__(52)(false);
+var IE_PROTO = __webpack_require__(20)('IE_PROTO');
+
+module.exports = function (object, names) {
+ var O = toIObject(object);
+ var i = 0;
+ var result = [];
+ var key;
+ for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);
+ // Don't enum bug & hidden keys
+ while (names.length > i) if (has(O, key = names[i++])) {
+ ~arrayIndexOf(result, key) || result.push(key);
+ }
+ return result;
+};
+
+
+/***/ }),
+/* 34 */
+/***/ (function(module, exports) {
+
+var toString = {}.toString;
+
+module.exports = function (it) {
+ return toString.call(it).slice(8, -1);
+};
+
+
+/***/ }),
+/* 35 */
+/***/ (function(module, exports) {
+
+exports.f = Object.getOwnPropertySymbols;
+
+
+/***/ }),
+/* 36 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
+var $keys = __webpack_require__(33);
+var hiddenKeys = __webpack_require__(22).concat('length', 'prototype');
+
+exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
+ return $keys(O, hiddenKeys);
+};
+
+
+/***/ }),
+/* 37 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+__webpack_require__(38);
+
+var _utils = __webpack_require__(14);
+
+var utils = _interopRequireWildcard(_utils);
+
+var _Landing = __webpack_require__(73);
+
+var _Landing2 = _interopRequireDefault(_Landing);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
+
+// hide title bar
+try {
+ var titleBar = weex.requireModule('titleBar');
+ titleBar.showTitleBar(false);
+} catch (e) {}
+
+// fetch and save examples
+setTimeout(function () {
+ utils.fetchExamples(utils.saveExamples);
+ utils.fetchGuide(utils.saveGuide);
+ utils.fetchAbout(utils.saveAbout);
+}, 10);
+
+_Landing2.default.el = '#root';
+new Vue(_Landing2.default);
+
+/***/ }),
+/* 38 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _mixin = __webpack_require__(39);
+
+var _mixin2 = _interopRequireDefault(_mixin);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// use shared mixins
+Vue.mixin(_mixin2.default);
+
+/***/ }),
+/* 39 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _index = __webpack_require__(14);
+
+var utils = _interopRequireWildcard(_index);
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
+
+var storage = weex.requireModule('storage');
+
+exports.default = {
+ filters: {
+ i18n: utils.i18n,
+ url: utils.createURL,
+ link: utils.createLink
+ },
+ methods: {
+ createLink: utils.createLink,
+ createURL: utils.createURL,
+ i18n: utils.i18n,
+ getLanguage: utils.getLanguage,
+ fetchData: utils.fetchData,
+ saveData: utils.saveData,
+ readData: utils.readData,
+ jumpTo: utils.jumpTo
+ },
+ created: function created() {
+ var _this = this;
+
+ // get and set language
+ utils.getLanguage(function (language) {
+ _this.language = language;
+ utils.setTitleBar(_this.navigationBarOptions, language);
+ });
+
+ // listen to the language change event
+ var channel = new BroadcastChannel('language');
+ channel.onmessage = function (event) {
+ if (event.data && event.data.language) {
+ _this.language = event.data.language;
+ }
+ };
+ },
+ beforeDestroy: function beforeDestroy() {
+ storage.removeItem('CURRENT_DOCUMENT_URL');
+ storage.removeItem('CURRENT_SOURCE_HASH');
+ }
+};
+
+/***/ }),
+/* 40 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(41), __esModule: true };
+
+/***/ }),
+/* 41 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var core = __webpack_require__(7);
+var $JSON = core.JSON || (core.JSON = { stringify: JSON.stringify });
+module.exports = function stringify(it) { // eslint-disable-line no-unused-vars
+ return $JSON.stringify.apply($JSON, arguments);
+};
+
+
+/***/ }),
+/* 42 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = true;
+
+var _iterator = __webpack_require__(43);
+
+var _iterator2 = _interopRequireDefault(_iterator);
+
+var _symbol = __webpack_require__(62);
+
+var _symbol2 = _interopRequireDefault(_symbol);
+
+var _typeof = typeof _symbol2.default === "function" && typeof _iterator2.default === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj; };
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.default) === "symbol" ? function (obj) {
+ return typeof obj === "undefined" ? "undefined" : _typeof(obj);
+} : function (obj) {
+ return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj);
+};
+
+/***/ }),
+/* 43 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(44), __esModule: true };
+
+/***/ }),
+/* 44 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(45);
+__webpack_require__(58);
+module.exports = __webpack_require__(24).f('iterator');
+
+
+/***/ }),
+/* 45 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $at = __webpack_require__(46)(true);
+
+// 21.1.3.27 String.prototype[@@iterator]()
+__webpack_require__(27)(String, 'String', function (iterated) {
+ this._t = String(iterated); // target
+ this._i = 0; // next index
+// 21.1.5.2.1 %StringIteratorPrototype%.next()
+}, function () {
+ var O = this._t;
+ var index = this._i;
+ var point;
+ if (index >= O.length) return { value: undefined, done: true };
+ point = $at(O, index);
+ this._i += point.length;
+ return { value: point, done: false };
+});
+
+
+/***/ }),
+/* 46 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(15);
+var defined = __webpack_require__(16);
+// true -> String#at
+// false -> String#codePointAt
+module.exports = function (TO_STRING) {
+ return function (that, pos) {
+ var s = String(defined(that));
+ var i = toInteger(pos);
+ var l = s.length;
+ var a, b;
+ if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
+ a = s.charCodeAt(i);
+ return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
+ ? TO_STRING ? s.charAt(i) : a
+ : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
+ };
+};
+
+
+/***/ }),
+/* 47 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// optional / simple context binding
+var aFunction = __webpack_require__(48);
+module.exports = function (fn, that, length) {
+ aFunction(fn);
+ if (that === undefined) return fn;
+ switch (length) {
+ case 1: return function (a) {
+ return fn.call(that, a);
+ };
+ case 2: return function (a, b) {
+ return fn.call(that, a, b);
+ };
+ case 3: return function (a, b, c) {
+ return fn.call(that, a, b, c);
+ };
+ }
+ return function (/* ...args */) {
+ return fn.apply(that, arguments);
+ };
+};
+
+
+/***/ }),
+/* 48 */
+/***/ (function(module, exports) {
+
+module.exports = function (it) {
+ if (typeof it != 'function') throw TypeError(it + ' is not a function!');
+ return it;
+};
+
+
+/***/ }),
+/* 49 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var create = __webpack_require__(32);
+var descriptor = __webpack_require__(12);
+var setToStringTag = __webpack_require__(23);
+var IteratorPrototype = {};
+
+// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
+__webpack_require__(2)(IteratorPrototype, __webpack_require__(6)('iterator'), function () { return this; });
+
+module.exports = function (Constructor, NAME, next) {
+ Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });
+ setToStringTag(Constructor, NAME + ' Iterator');
+};
+
+
+/***/ }),
+/* 50 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dP = __webpack_require__(3);
+var anObject = __webpack_require__(10);
+var getKeys = __webpack_require__(19);
+
+module.exports = __webpack_require__(4) ? Object.defineProperties : function defineProperties(O, Properties) {
+ anObject(O);
+ var keys = getKeys(Properties);
+ var length = keys.length;
+ var i = 0;
+ var P;
+ while (length > i) dP.f(O, P = keys[i++], Properties[P]);
+ return O;
+};
+
+
+/***/ }),
+/* 51 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// fallback for non-array-like ES3 and non-enumerable old V8 strings
+var cof = __webpack_require__(34);
+// eslint-disable-next-line no-prototype-builtins
+module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
+ return cof(it) == 'String' ? it.split('') : Object(it);
+};
+
+
+/***/ }),
+/* 52 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// false -> Array#indexOf
+// true -> Array#includes
+var toIObject = __webpack_require__(5);
+var toLength = __webpack_require__(53);
+var toAbsoluteIndex = __webpack_require__(54);
+module.exports = function (IS_INCLUDES) {
+ return function ($this, el, fromIndex) {
+ var O = toIObject($this);
+ var length = toLength(O.length);
+ var index = toAbsoluteIndex(fromIndex, length);
+ var value;
+ // Array#includes uses SameValueZero equality algorithm
+ // eslint-disable-next-line no-self-compare
+ if (IS_INCLUDES && el != el) while (length > index) {
+ value = O[index++];
+ // eslint-disable-next-line no-self-compare
+ if (value != value) return true;
+ // Array#indexOf ignores holes, Array#includes - not
+ } else for (;length > index; index++) if (IS_INCLUDES || index in O) {
+ if (O[index] === el) return IS_INCLUDES || index || 0;
+ } return !IS_INCLUDES && -1;
+ };
+};
+
+
+/***/ }),
+/* 53 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.15 ToLength
+var toInteger = __webpack_require__(15);
+var min = Math.min;
+module.exports = function (it) {
+ return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
+};
+
+
+/***/ }),
+/* 54 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(15);
+var max = Math.max;
+var min = Math.min;
+module.exports = function (index, length) {
+ index = toInteger(index);
+ return index < 0 ? max(index + length, 0) : min(index, length);
+};
+
+
+/***/ }),
+/* 55 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var document = __webpack_require__(0).document;
+module.exports = document && document.documentElement;
+
+
+/***/ }),
+/* 56 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
+var has = __webpack_require__(1);
+var toObject = __webpack_require__(57);
+var IE_PROTO = __webpack_require__(20)('IE_PROTO');
+var ObjectProto = Object.prototype;
+
+module.exports = Object.getPrototypeOf || function (O) {
+ O = toObject(O);
+ if (has(O, IE_PROTO)) return O[IE_PROTO];
+ if (typeof O.constructor == 'function' && O instanceof O.constructor) {
+ return O.constructor.prototype;
+ } return O instanceof Object ? ObjectProto : null;
+};
+
+
+/***/ }),
+/* 57 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.13 ToObject(argument)
+var defined = __webpack_require__(16);
+module.exports = function (it) {
+ return Object(defined(it));
+};
+
+
+/***/ }),
+/* 58 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(59);
+var global = __webpack_require__(0);
+var hide = __webpack_require__(2);
+var Iterators = __webpack_require__(18);
+var TO_STRING_TAG = __webpack_require__(6)('toStringTag');
+
+var DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +
+ 'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +
+ 'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +
+ 'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +
+ 'TextTrackList,TouchList').split(',');
+
+for (var i = 0; i < DOMIterables.length; i++) {
+ var NAME = DOMIterables[i];
+ var Collection = global[NAME];
+ var proto = Collection && Collection.prototype;
+ if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);
+ Iterators[NAME] = Iterators.Array;
+}
+
+
+/***/ }),
+/* 59 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var addToUnscopables = __webpack_require__(60);
+var step = __webpack_require__(61);
+var Iterators = __webpack_require__(18);
+var toIObject = __webpack_require__(5);
+
+// 22.1.3.4 Array.prototype.entries()
+// 22.1.3.13 Array.prototype.keys()
+// 22.1.3.29 Array.prototype.values()
+// 22.1.3.30 Array.prototype[@@iterator]()
+module.exports = __webpack_require__(27)(Array, 'Array', function (iterated, kind) {
+ this._t = toIObject(iterated); // target
+ this._i = 0; // next index
+ this._k = kind; // kind
+// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
+}, function () {
+ var O = this._t;
+ var kind = this._k;
+ var index = this._i++;
+ if (!O || index >= O.length) {
+ this._t = undefined;
+ return step(1);
+ }
+ if (kind == 'keys') return step(0, index);
+ if (kind == 'values') return step(0, O[index]);
+ return step(0, [index, O[index]]);
+}, 'values');
+
+// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
+Iterators.Arguments = Iterators.Array;
+
+addToUnscopables('keys');
+addToUnscopables('values');
+addToUnscopables('entries');
+
+
+/***/ }),
+/* 60 */
+/***/ (function(module, exports) {
+
+module.exports = function () { /* empty */ };
+
+
+/***/ }),
+/* 61 */
+/***/ (function(module, exports) {
+
+module.exports = function (done, value) {
+ return { value: value, done: !!done };
+};
+
+
+/***/ }),
+/* 62 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(63), __esModule: true };
+
+/***/ }),
+/* 63 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(64);
+__webpack_require__(70);
+__webpack_require__(71);
+__webpack_require__(72);
+module.exports = __webpack_require__(7).Symbol;
+
+
+/***/ }),
+/* 64 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// ECMAScript 6 symbols shim
+var global = __webpack_require__(0);
+var has = __webpack_require__(1);
+var DESCRIPTORS = __webpack_require__(4);
+var $export = __webpack_require__(28);
+var redefine = __webpack_require__(31);
+var META = __webpack_require__(65).KEY;
+var $fails = __webpack_require__(11);
+var shared = __webpack_require__(21);
+var setToStringTag = __webpack_require__(23);
+var uid = __webpack_require__(13);
+var wks = __webpack_require__(6);
+var wksExt = __webpack_require__(24);
+var wksDefine = __webpack_require__(25);
+var enumKeys = __webpack_require__(66);
+var isArray = __webpack_require__(67);
+var anObject = __webpack_require__(10);
+var isObject = __webpack_require__(8);
+var toIObject = __webpack_require__(5);
+var toPrimitive = __webpack_require__(17);
+var createDesc = __webpack_require__(12);
+var _create = __webpack_require__(32);
+var gOPNExt = __webpack_require__(68);
+var $GOPD = __webpack_require__(69);
+var $DP = __webpack_require__(3);
+var $keys = __webpack_require__(19);
+var gOPD = $GOPD.f;
+var dP = $DP.f;
+var gOPN = gOPNExt.f;
+var $Symbol = global.Symbol;
+var $JSON = global.JSON;
+var _stringify = $JSON && $JSON.stringify;
+var PROTOTYPE = 'prototype';
+var HIDDEN = wks('_hidden');
+var TO_PRIMITIVE = wks('toPrimitive');
+var isEnum = {}.propertyIsEnumerable;
+var SymbolRegistry = shared('symbol-registry');
+var AllSymbols = shared('symbols');
+var OPSymbols = shared('op-symbols');
+var ObjectProto = Object[PROTOTYPE];
+var USE_NATIVE = typeof $Symbol == 'function';
+var QObject = global.QObject;
+// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
+var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
+
+// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
+var setSymbolDesc = DESCRIPTORS && $fails(function () {
+ return _create(dP({}, 'a', {
+ get: function () { return dP(this, 'a', { value: 7 }).a; }
+ })).a != 7;
+}) ? function (it, key, D) {
+ var protoDesc = gOPD(ObjectProto, key);
+ if (protoDesc) delete ObjectProto[key];
+ dP(it, key, D);
+ if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);
+} : dP;
+
+var wrap = function (tag) {
+ var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);
+ sym._k = tag;
+ return sym;
+};
+
+var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {
+ return typeof it == 'symbol';
+} : function (it) {
+ return it instanceof $Symbol;
+};
+
+var $defineProperty = function defineProperty(it, key, D) {
+ if (it === ObjectProto) $defineProperty(OPSymbols, key, D);
+ anObject(it);
+ key = toPrimitive(key, true);
+ anObject(D);
+ if (has(AllSymbols, key)) {
+ if (!D.enumerable) {
+ if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));
+ it[HIDDEN][key] = true;
+ } else {
+ if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
+ D = _create(D, { enumerable: createDesc(0, false) });
+ } return setSymbolDesc(it, key, D);
+ } return dP(it, key, D);
+};
+var $defineProperties = function defineProperties(it, P) {
+ anObject(it);
+ var keys = enumKeys(P = toIObject(P));
+ var i = 0;
+ var l = keys.length;
+ var key;
+ while (l > i) $defineProperty(it, key = keys[i++], P[key]);
+ return it;
+};
+var $create = function create(it, P) {
+ return P === undefined ? _create(it) : $defineProperties(_create(it), P);
+};
+var $propertyIsEnumerable = function propertyIsEnumerable(key) {
+ var E = isEnum.call(this, key = toPrimitive(key, true));
+ if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;
+ return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
+};
+var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
+ it = toIObject(it);
+ key = toPrimitive(key, true);
+ if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;
+ var D = gOPD(it, key);
+ if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
+ return D;
+};
+var $getOwnPropertyNames = function getOwnPropertyNames(it) {
+ var names = gOPN(toIObject(it));
+ var result = [];
+ var i = 0;
+ var key;
+ while (names.length > i) {
+ if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
+ } return result;
+};
+var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
+ var IS_OP = it === ObjectProto;
+ var names = gOPN(IS_OP ? OPSymbols : toIObject(it));
+ var result = [];
+ var i = 0;
+ var key;
+ while (names.length > i) {
+ if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);
+ } return result;
+};
+
+// 19.4.1.1 Symbol([description])
+if (!USE_NATIVE) {
+ $Symbol = function Symbol() {
+ if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
+ var tag = uid(arguments.length > 0 ? arguments[0] : undefined);
+ var $set = function (value) {
+ if (this === ObjectProto) $set.call(OPSymbols, value);
+ if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
+ setSymbolDesc(this, tag, createDesc(1, value));
+ };
+ if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });
+ return wrap(tag);
+ };
+ redefine($Symbol[PROTOTYPE], 'toString', function toString() {
+ return this._k;
+ });
+
+ $GOPD.f = $getOwnPropertyDescriptor;
+ $DP.f = $defineProperty;
+ __webpack_require__(36).f = gOPNExt.f = $getOwnPropertyNames;
+ __webpack_require__(26).f = $propertyIsEnumerable;
+ __webpack_require__(35).f = $getOwnPropertySymbols;
+
+ if (DESCRIPTORS && !__webpack_require__(9)) {
+ redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
+ }
+
+ wksExt.f = function (name) {
+ return wrap(wks(name));
+ };
+}
+
+$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });
+
+for (var es6Symbols = (
+ // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
+ 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
+).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);
+
+for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);
+
+$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
+ // 19.4.2.1 Symbol.for(key)
+ 'for': function (key) {
+ return has(SymbolRegistry, key += '')
+ ? SymbolRegistry[key]
+ : SymbolRegistry[key] = $Symbol(key);
+ },
+ // 19.4.2.5 Symbol.keyFor(sym)
+ keyFor: function keyFor(sym) {
+ if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');
+ for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;
+ },
+ useSetter: function () { setter = true; },
+ useSimple: function () { setter = false; }
+});
+
+$export($export.S + $export.F * !USE_NATIVE, 'Object', {
+ // 19.1.2.2 Object.create(O [, Properties])
+ create: $create,
+ // 19.1.2.4 Object.defineProperty(O, P, Attributes)
+ defineProperty: $defineProperty,
+ // 19.1.2.3 Object.defineProperties(O, Properties)
+ defineProperties: $defineProperties,
+ // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
+ getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
+ // 19.1.2.7 Object.getOwnPropertyNames(O)
+ getOwnPropertyNames: $getOwnPropertyNames,
+ // 19.1.2.8 Object.getOwnPropertySymbols(O)
+ getOwnPropertySymbols: $getOwnPropertySymbols
+});
+
+// 24.3.2 JSON.stringify(value [, replacer [, space]])
+$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {
+ var S = $Symbol();
+ // MS Edge converts symbol values to JSON as {}
+ // WebKit converts symbol values to JSON as null
+ // V8 throws on boxed symbols
+ return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';
+})), 'JSON', {
+ stringify: function stringify(it) {
+ var args = [it];
+ var i = 1;
+ var replacer, $replacer;
+ while (arguments.length > i) args.push(arguments[i++]);
+ $replacer = replacer = args[1];
+ if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
+ if (!isArray(replacer)) replacer = function (key, value) {
+ if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
+ if (!isSymbol(value)) return value;
+ };
+ args[1] = replacer;
+ return _stringify.apply($JSON, args);
+ }
+});
+
+// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
+$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(2)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
+// 19.4.3.5 Symbol.prototype[@@toStringTag]
+setToStringTag($Symbol, 'Symbol');
+// 20.2.1.9 Math[@@toStringTag]
+setToStringTag(Math, 'Math', true);
+// 24.3.3 JSON[@@toStringTag]
+setToStringTag(global.JSON, 'JSON', true);
+
+
+/***/ }),
+/* 65 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var META = __webpack_require__(13)('meta');
+var isObject = __webpack_require__(8);
+var has = __webpack_require__(1);
+var setDesc = __webpack_require__(3).f;
+var id = 0;
+var isExtensible = Object.isExtensible || function () {
+ return true;
+};
+var FREEZE = !__webpack_require__(11)(function () {
+ return isExtensible(Object.preventExtensions({}));
+});
+var setMeta = function (it) {
+ setDesc(it, META, { value: {
+ i: 'O' + ++id, // object ID
+ w: {} // weak collections IDs
+ } });
+};
+var fastKey = function (it, create) {
+ // return primitive with prefix
+ if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
+ if (!has(it, META)) {
+ // can't set metadata to uncaught frozen object
+ if (!isExtensible(it)) return 'F';
+ // not necessary to add metadata
+ if (!create) return 'E';
+ // add missing metadata
+ setMeta(it);
+ // return object ID
+ } return it[META].i;
+};
+var getWeak = function (it, create) {
+ if (!has(it, META)) {
+ // can't set metadata to uncaught frozen object
+ if (!isExtensible(it)) return true;
+ // not necessary to add metadata
+ if (!create) return false;
+ // add missing metadata
+ setMeta(it);
+ // return hash weak collections IDs
+ } return it[META].w;
+};
+// add metadata on freeze-family methods calling
+var onFreeze = function (it) {
+ if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);
+ return it;
+};
+var meta = module.exports = {
+ KEY: META,
+ NEED: false,
+ fastKey: fastKey,
+ getWeak: getWeak,
+ onFreeze: onFreeze
+};
+
+
+/***/ }),
+/* 66 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// all enumerable object keys, includes symbols
+var getKeys = __webpack_require__(19);
+var gOPS = __webpack_require__(35);
+var pIE = __webpack_require__(26);
+module.exports = function (it) {
+ var result = getKeys(it);
+ var getSymbols = gOPS.f;
+ if (getSymbols) {
+ var symbols = getSymbols(it);
+ var isEnum = pIE.f;
+ var i = 0;
+ var key;
+ while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);
+ } return result;
+};
+
+
+/***/ }),
+/* 67 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.2.2 IsArray(argument)
+var cof = __webpack_require__(34);
+module.exports = Array.isArray || function isArray(arg) {
+ return cof(arg) == 'Array';
+};
+
+
+/***/ }),
+/* 68 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
+var toIObject = __webpack_require__(5);
+var gOPN = __webpack_require__(36).f;
+var toString = {}.toString;
+
+var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
+ ? Object.getOwnPropertyNames(window) : [];
+
+var getWindowNames = function (it) {
+ try {
+ return gOPN(it);
+ } catch (e) {
+ return windowNames.slice();
+ }
+};
+
+module.exports.f = function getOwnPropertyNames(it) {
+ return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));
+};
+
+
+/***/ }),
+/* 69 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var pIE = __webpack_require__(26);
+var createDesc = __webpack_require__(12);
+var toIObject = __webpack_require__(5);
+var toPrimitive = __webpack_require__(17);
+var has = __webpack_require__(1);
+var IE8_DOM_DEFINE = __webpack_require__(29);
+var gOPD = Object.getOwnPropertyDescriptor;
+
+exports.f = __webpack_require__(4) ? gOPD : function getOwnPropertyDescriptor(O, P) {
+ O = toIObject(O);
+ P = toPrimitive(P, true);
+ if (IE8_DOM_DEFINE) try {
+ return gOPD(O, P);
+ } catch (e) { /* empty */ }
+ if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);
+};
+
+
+/***/ }),
+/* 70 */
+/***/ (function(module, exports) {
+
+
+
+/***/ }),
+/* 71 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(25)('asyncIterator');
+
+
+/***/ }),
+/* 72 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(25)('observable');
+
+
+/***/ }),
+/* 73 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __vue_exports__, __vue_options__
+var __vue_styles__ = []
+
+/* styles */
+__vue_styles__.push(__webpack_require__(74)
+)
+
+/* script */
+__vue_exports__ = __webpack_require__(75)
+
+/* template */
+var __vue_template__ = __webpack_require__(80)
+__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+if (
+ typeof __vue_exports__.default === "object" ||
+ typeof __vue_exports__.default === "function"
+) {
+if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+__vue_options__ = __vue_exports__ = __vue_exports__.default
+}
+if (typeof __vue_options__ === "function") {
+ __vue_options__ = __vue_options__.options
+}
+__vue_options__.__file = "/Users/kw/github/weex-vue-examples/src/pages/landing/Landing.vue"
+__vue_options__.render = __vue_template__.render
+__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+__vue_options__._scopeId = "data-v-6b061736"
+__vue_options__.style = __vue_options__.style || {}
+__vue_styles__.forEach(function (module) {
+ for (var name in module) {
+ __vue_options__.style[name] = module[name]
+ }
+})
+if (typeof __register_static_styles__ === "function") {
+ __register_static_styles__(__vue_options__._scopeId, __vue_styles__)
+}
+
+module.exports = __vue_exports__
+
+
+/***/ }),
+/* 74 */
+/***/ (function(module, exports) {
+
+module.exports = {
+ "doodle": {
+ "width": "750",
+ "height": "880"
+ },
+ "menu-list": {
+ "flex": 1
+ },
+ "menu-row": {
+ "flex": 1,
+ "flexDirection": "row",
+ "justifyContent": "center",
+ "borderTopWidth": "1",
+ "borderTopStyle": "solid",
+ "borderTopColor": "#CCCCCC"
+ },
+ "menu-item": {
+ "flex": 1,
+ "backgroundColor": "#FBFBFB",
+ "justifyContent": "center",
+ "paddingTop": "50",
+ "paddingBottom": "50",
+ "backgroundColor:active": "#F2F2F2"
+ },
+ "menu-item-1": {
+ "borderRightWidth": "1",
+ "borderRightStyle": "solid",
+ "borderRightColor": "#CCCCCC"
+ },
+ "menu-text": {
+ "textAlign": "center",
+ "fontSize": "52",
+ "fontWeight": "bold",
+ "color": "#8B8B8B"
+ },
+ "menu-text-zh": {
+ "fontSize": "56"
+ }
+}
+
+/***/ }),
+/* 75 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _Doodle = __webpack_require__(76);
+
+var _Doodle2 = _interopRequireDefault(_Doodle);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+exports.default = {
+ components: { Doodle: _Doodle2.default },
+ data: function data() {
+ return {
+ language: 'en',
+ menus: [[{ name: 'guide', title: { en: 'Guide', zh: '教程' } }, { name: 'examples', title: { en: 'Examples', zh: '实例' } }], [{ name: 'news', title: { en: 'News', zh: '资讯' } }, { name: 'about', title: { en: 'About', zh: '关于' } }]]
+ };
+ }
+}; //
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+/***/ }),
+/* 76 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __vue_exports__, __vue_options__
+var __vue_styles__ = []
+
+/* styles */
+__vue_styles__.push(__webpack_require__(77)
+)
+
+/* script */
+__vue_exports__ = __webpack_require__(78)
+
+/* template */
+var __vue_template__ = __webpack_require__(79)
+__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+if (
+ typeof __vue_exports__.default === "object" ||
+ typeof __vue_exports__.default === "function"
+) {
+if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+__vue_options__ = __vue_exports__ = __vue_exports__.default
+}
+if (typeof __vue_options__ === "function") {
+ __vue_options__ = __vue_options__.options
+}
+__vue_options__.__file = "/Users/kw/github/weex-vue-examples/src/components/Doodle.vue"
+__vue_options__.render = __vue_template__.render
+__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+__vue_options__._scopeId = "data-v-d429dafa"
+__vue_options__.style = __vue_options__.style || {}
+__vue_styles__.forEach(function (module) {
+ for (var name in module) {
+ __vue_options__.style[name] = module[name]
+ }
+})
+if (typeof __register_static_styles__ === "function") {
+ __register_static_styles__(__vue_options__._scopeId, __vue_styles__)
+}
+
+module.exports = __vue_exports__
+
+
+/***/ }),
+/* 77 */
+/***/ (function(module, exports) {
+
+module.exports = {
+ "wrapper": {
+ "alignItems": "center",
+ "justifyContent": "space-between",
+ "backgroundColor": "#FFFFFF"
+ },
+ "center": {
+ "alignItems": "center",
+ "justifyContent": "center"
+ },
+ "logo": {
+ "width": "750",
+ "height": "318"
+ },
+ "btn": {
+ "width": "450",
+ "height": "160",
+ "marginTop": "50",
+ "marginRight": "50",
+ "marginBottom": "50",
+ "marginLeft": "50",
+ "opacity": 0.7,
+ "opacity:active": 1
+ },
+ "scan-bg": {
+ "width": "450",
+ "height": "160",
+ "position": "absolute",
+ "top": 0,
+ "left": 0
+ },
+ "btn-text": {
+ "color": "#505050",
+ "fontSize": "56",
+ "textAlign": "center"
+ },
+ "btn-text-zh": {
+ "fontSize": "64"
+ }
+}
+
+/***/ }),
+/* 78 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _utils = __webpack_require__(14);
+
+var modal = weex.requireModule('modal'); //
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+var navigator = weex.requireModule('navigator');
+var event = weex.requireModule('event');
+
+function isValidDoodle(doodle) {
+ var now = new Date().getTime();
+ return doodle && doodle.src && parseInt(doodle.from, 10) < now && now < parseInt(doodle.to, 10);
+}
+
+exports.default = {
+ props: ['lang'],
+ data: function data() {
+ return {
+ language: this.lang || 'en',
+ showDoodle: false,
+ seenDoodle: false,
+ SCAN: { en: 'Scan QR Code', zh: '扫描二维码' },
+ doodle: {}
+ };
+ },
+ beforeCreate: function beforeCreate() {
+ var _this = this;
+
+ (0, _utils.fetchDoodle)(function (_ref) {
+ var doodle = _ref.doodle;
+
+ if (isValidDoodle(doodle) && !_this.seenDoodle) {
+ _this.doodle = doodle;
+ _this.showDoodle = true;
+ doodle.duration && setTimeout(function () {
+ _this.showDoodle = false;
+ _this.seenDoodle = true;
+ }, parseInt(doodle.duration, 10));
+ }
+ });
+ },
+
+ methods: {
+ scan: function scan() {
+ try {
+ event.openURL('weex://go/scan');
+ } catch (e) {
+ try {
+ navigator.push({ url: 'weex://go/scan' });
+ } catch (e) {}
+ }
+ },
+ magic: function magic() {
+ if (this.doodle && this.doodle.next) {
+ this.showDoodle = false;
+ navigator.push({
+ url: this.createURL(this.doodle.next, {
+ language: this.language
+ })
+ });
+ }
+ }
+ }
+};
+
+/***/ }),
+/* 79 */
+/***/ (function(module, exports) {
+
+module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+ return _c('div', {
+ staticClass: ["wrapper"]
+ }, [(_vm.showDoodle && _vm.doodle.src) ? _c('embed', {
+ staticStyle: {
+ flex: "1"
+ },
+ attrs: {
+ "src": _vm._f("url")(_vm.doodle.src)
+ },
+ on: {
+ "click": _vm.magic
+ }
+ }) : _c('div', {
+ staticClass: ["center"],
+ staticStyle: {
+ flex: "1"
+ }
+ }, [_c('image', {
+ staticClass: ["logo"],
+ attrs: {
+ "src": "https://gw.alicdn.com/tfs/TB1Q9VBkRfH8KJjy1XbXXbLdXXa-3799-1615.png"
+ }
+ }), _c('div', {
+ staticClass: ["btn", "center"],
+ on: {
+ "click": _vm.scan
+ }
+ }, [_c('image', {
+ staticClass: ["scan-bg"],
+ attrs: {
+ "src": "https://gw.alicdn.com/tfs/TB1qnO0kLDH8KJjy1XcXXcpdXXa-900-320.png"
+ }
+ }), _c('text', {
+ class: ['btn-text', 'btn-text-' + _vm.language]
+ }, [_vm._v(_vm._s(_vm.i18n(_vm.SCAN)))])])])])
+},staticRenderFns: []}
+module.exports.render._withStripped = true
+
+/***/ }),
+/* 80 */
+/***/ (function(module, exports) {
+
+module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+ return _c('div', {
+ staticClass: ["wrapper"]
+ }, [_c('doodle', {
+ staticClass: ["doodle"],
+ attrs: {
+ "lang": _vm.language
+ }
+ }), _c('div', {
+ staticClass: ["menu-list"]
+ }, _vm._l((_vm.menus), function(row, r) {
+ return _c('div', {
+ key: r,
+ class: ['menu-row', ("menu-row-" + (r+1))]
+ }, _vm._l((row), function(menu, i) {
+ return _c('a', {
+ key: menu.name,
+ class: ['menu-item', ("menu-item-" + (i+1))],
+ attrs: {
+ "href": _vm._f("link")(menu.name, {
+ language: _vm.language
+ })
+ }
+ }, [_c('text', {
+ class: ['menu-text', ("menu-text-" + _vm.language)]
+ }, [_vm._v(_vm._s(_vm.i18n(menu.title)))])])
+ }))
+ }))], 1)
+},staticRenderFns: []}
+module.exports.render._withStripped = true
+
+/***/ })
+/******/ ]);
\ No newline at end of file
diff --git a/android/playground/src/main/assets/lite_template/card.wasm b/android/playground/src/main/assets/lite_template/card.wasm
new file mode 100644
index 0000000..ad43e9e
--- /dev/null
+++ b/android/playground/src/main/assets/lite_template/card.wasm
Binary files differ
diff --git a/android/playground/src/main/assets/lite_template/case.js b/android/playground/src/main/assets/lite_template/case.js
new file mode 100644
index 0000000..1463c8d
--- /dev/null
+++ b/android/playground/src/main/assets/lite_template/case.js
@@ -0,0 +1,469 @@
+/* eslint-disable react/react-in-jsx-scope */
+/* global __weex_data__, print, createElement */
+
+try{
+ console.log("abc in try");
+} catch(err) {
+ console.log("err");
+} finally{
+ console.log("finally");
+}
+
+var a= /(a.)/g;
+var b = a.exec('abc,aac, ssa2, dda');
+console.log(b);
+
+console.log('aabccbddBc'.match(/(bss.)/g));
+
+console.log("ceil");
+console.log(Math.ceil(0.95)," == 1");
+console.log(Math.ceil(4)," == 4");
+console.log(Math.ceil(7.004)," == 8");
+console.log(Math.ceil(-0.95)," == -0");
+console.log(Math.ceil(-4)," == -4");
+console.log(Math.ceil(-7.004)," == -7");
+
+console.log("floor");
+console.log(Math.floor( 45.95)," == 45");
+console.log(Math.floor( 45.05)," == 45");
+console.log(Math.floor( 4 )," == 4");
+console.log(Math.floor(-45.05)," == -46");
+console.log(Math.floor(-45.95)," == -46");
+
+console.log("random");
+console.log(Math.random());
+console.log(Math.random());
+console.log(Math.random());
+console.log(Math.random());
+
+console.log("max");
+console.log(Math.max(1,2,3)," == 3");
+console.log(Math.max(1,2.2, 4.2), "== 4.2");
+console.log(Math.max(1,"a"),"== null");
+console.log(Math.max(),"== INT_MIN");
+
+console.log("min");
+console.log(Math.min(1,2,3)," == 1");
+console.log(Math.min(0.5,2.2, 4), "== 0.5");
+console.log(Math.min(1,"a"),"== null");
+console.log(Math.min(),"== INT_MAX");
+
+var a = 3;
+
+console.log('start');
+switch(a){
+ case 1:
+ console.log('switch 1');
+ break;
+ case 2:
+ console.log('switch 2');
+ break;
+ default:
+ console.log('default branch');
+}
+console.log('end');
+class Component {
+ constructor(props) {
+ this.props = props;
+ }
+
+ setState(newData) {
+ this.state = { ...this.state,
+ ...newData
+ };
+ var prev = this.vcompoent_ptr;
+ var next = this.render();
+ updateElement(prev, next);
+ this.vcompoent_ptr = next;
+ }
+}
+var nativeModules = {};
+
+const registerModule = moduleName => {
+ var sourceKeys = Object.keys(moduleName);
+ var key;
+
+ for (var i = 0; i < sourceKeys.length; i++) {
+ key = sourceKeys[i];
+ nativeModules[key] = moduleName[key];
+ }
+};
+
+const require = name => {
+ const requireModule = name => {
+ var methods = nativeModules[name];
+ var target = {};
+ var loop = function (methodName) {
+ target[methodName] = function () {
+ var args = __arguments.length > 2 ? __arguments.slice(2) : [];
+ __callNativeModule({
+ module: name,
+ method: __arguments[1],
+ args: args
+ });
+ };
+ };
+ if (methods && Array.isArray(methods)) {
+ for (var i = 0; i < methods.length; i++) {
+ loop(methods[i]);
+ }
+ }
+ console.log("register",methods);
+ return target;
+ };
+
+ const MODULE_NAME_PREFIX = '@weex-module/';
+
+ if (name.split(MODULE_NAME_PREFIX).length > 1) {
+ const weexModuleName = name.split(MODULE_NAME_PREFIX)[1];
+ return requireModule(weexModuleName);
+ }
+};
+
+__registerModules(['searchEvent']);
+
+const render = segment => <root>{segment}</root>;
+
+const View = props => <div {...props} />;
+
+const Touchable = props => {
+ return <div {...props} onClick={props.onPress} />;
+};
+
+const Text = props => <text {...props} />;
+
+const NXImage = props => <image {...props} />;
+
+const NXLink = props => <a {...props} />;
+
+const searchEvent = require('@weex-module/searchEvent');
+
+const WFWIDTH = 342;
+const waterfallStyles = {
+titleText: {
+maxWidth: 290,
+minWidth: 30,
+height: 30,
+marginLeft: 28,
+marginRight: 28,
+fontSize: 26,
+lineHeight: 30,
+color: '#444444'
+},
+divideLine: {
+width: 180,
+height: 1.5,
+backgroundColor: '#cdcdcd'
+},
+wfDivideLine: {
+width: 90,
+height: 1.5,
+backgroundColor: '#cdcdcd'
+},
+wfWrapper: {
+minHeight: 100,
+width: WFWIDTH,
+flexDirection: 'column',
+justifyContent: 'center',
+alignItems: 'center'
+},
+wfLineWrap: {
+width: WFWIDTH,
+height: 64,
+marginBottom: 20,
+paddingLeft: 9.5,
+paddingRight: 9.5,
+flexDirection: 'row',
+justifyContent: 'center',
+alignItems: 'center'
+},
+wfTitle: {
+width: WFWIDTH - 40,
+marginTop: 24,
+marginBottom: 16,
+flexDirection: 'row',
+alignItems: 'center',
+justifyContent: 'center'
+}
+};
+
+const styles = {
+tag: {
+flex: 1,
+backgroundColor: '#FFFFFF',
+marginLeft: 9,
+marginRight: 9,
+paddingLeft: 16,
+paddingRight: 16,
+height: 64,
+borderRadius: 32
+},
+tagText: {
+flex: 1,
+lineHeight: 64,
+textAlign: 'center',
+color: '#444444',
+fontSize: 26
+}
+};
+
+class TipTag extends Component {
+ constructor(props) {
+ super(props);
+ }
+ _onClick = e => {
+ console.log("click go");
+ let searchParams = {};
+ if (this.props.data.q) {
+ searchParams.q = this.props.data.q;
+ }
+
+ if (this.props.data.params && this.props.data.params.length > 0) {
+ this.props.data.params.forEach(item => {
+ if (item.key) {
+ searchParams[item.key] = item.value;
+ }
+ });
+ }
+ if (this.props.tiptype && this.props.tiptype == 'voice_smarttips') {
+ searchParams['voiceFrom'] = '1';
+ console.log("se go");
+ searchEvent.searchOption("searchOption", {
+ params: searchParams
+ });
+ } else {
+ console.log("se go2");
+ searchEvent.search("search", {
+ params: searchParams
+ });
+ }
+ };
+
+ render() {
+ let data = this.props.data;
+ let tagStyle = styles.tag;
+
+ if (!this.props.isListMode) {
+ tagStyle = { ...styles.tag,
+ marginLeft: 5.5,
+ marginRight: 5.5
+ };
+ } else {
+ tagStyle = styles.tag;
+ }
+ return <View style={tagStyle} onClick={this._onClick}>
+ <Text style={styles.tagText}>{data.show}</Text>
+ </View>;
+ }
+
+}
+
+const _tiptag_export = {
+default: TipTag
+};
+
+const TipTag_import_default_from__WidgetInWFStyle__tiptag = _tiptag_export.default;
+
+const WidgetInWFStyle = props => {
+ let tips = props.tips,
+ tiptype = props.tiptype;
+
+ if (!tips || tips.length === 0) {
+ return null;
+ }
+
+ if (tips.length > 8) {
+ tips = tips.slice(0, 8);
+ }
+
+ let wfTitle = <View style={waterfallStyles.wfTitle}>
+ <View style={waterfallStyles.wfDivideLine} />
+ <Text style={waterfallStyles.titleText}>{props.topic || '相关搜索'}</Text>
+ <View style={waterfallStyles.wfDivideLine} />
+ </View>;
+ let wfLines = [];
+ let tipLength = tips.length;
+
+ function createWfLine(leftTip, rightTip) {
+ let tag1 = <TipTag_import_default_from__WidgetInWFStyle__tiptag data={leftTip} isListMode={false} tiptype={tiptype} />;
+ let tag2 = rightTip ? <TipTag_import_default_from__WidgetInWFStyle__tiptag data={rightTip} isListMode={false} tiptype={tiptype} /> : null;
+ return <View style={waterfallStyles.wfLineWrap}>
+ {tag1}
+ {tag2}
+ </View>;
+ }
+ for (var i = 0; i < tipLength; i += 2) {
+ let wfLine = null;
+ if (tipLength === 2) {
+ wfLine = createWfLine(tips[i]);
+ wfLines.push(wfLine);
+ wfLine = createWfLine(tips[i + 1]);
+ }
+ else {
+ if (i + 1 === tipLength) {
+ wfLine = createWfLine(tips[i], null);
+ }
+ else {
+ wfLine = createWfLine(tips[i], tips[i + 1]);
+ }
+ }
+ wfLines.push(wfLine);
+ }
+ return <View style={waterfallStyles.wfWrapper}>
+ {wfTitle}
+ {wfLines}
+ </View>;
+};
+
+const _WidgetInWFStyle_export = {
+default: WidgetInWFStyle
+};
+
+
+const TipTag_import_default_from__WidgetInListStyle__tiptag = _tiptag_export.default;
+const listStyles = {
+listWrapper: {
+width: 750,
+minHeight: 162,
+flexDirection: 'column',
+justifyContent: 'center',
+alignItems: 'center',
+paddingBottom: 16
+},
+listLineWrap: {
+width: 750,
+height: 64,
+flexDirection: 'row',
+justifyContent: 'space-between',
+alignItems: 'center',
+marginBottom: 20,
+paddingLeft: 11,
+paddingRight: 11
+},
+listTitle: {
+width: 750,
+marginTop: 28,
+marginBottom: 20,
+flexDirection: 'row',
+alignItems: 'center',
+justifyContent: 'center'
+},
+titleText: {
+maxWidth: 290,
+minWidth: 30,
+height: 30,
+marginLeft: 28,
+marginRight: 28,
+fontSize: 26,
+lineHeight: 30,
+color: '#444444'
+},
+divideLine: {
+width: 180,
+height: 1.5,
+backgroundColor: '#cdcdcd'
+}
+};
+
+const WidgetInListStyle = props => {
+ let tips = props.tips,
+ tiptype = props.tiptype;
+ if (!tips || tips.length === 0) {
+ return null;
+ }
+
+ if (tips.length > 8) {
+ tips = tips.slice(0, 8);
+ }
+
+ const listTitle = <View style={listStyles.listTitle}>
+ <View style={listStyles.divideLine} />
+ <Text style={listStyles.titleText}>{props.topic || '相关搜索'}</Text>
+ <View style={listStyles.divideLine} />
+ </View>;
+ let firstLineTips = [];
+ let secondLineTips = [];
+ tips.forEach((tip, index) => {
+ const tipTag = <TipTag_import_default_from__WidgetInListStyle__tiptag data={tip} isListMode={true} tiptype={tiptype} />;
+ if (tips.length / 2 < 2) {
+ firstLineTips.push(tipTag);
+ } else {
+ const firstLineCount = parseInt(tips.length / 2, 10) + tips.length % 2;
+
+ if (index < firstLineCount) {
+ firstLineTips.push(tipTag);
+ } else if (index < 8) {
+ secondLineTips.push(tipTag);
+ } else {}
+ }
+ });
+ const firstLine = <View style={listStyles.listLineWrap}>{firstLineTips}</View>;
+ const secondLine = secondLineTips.length > 0 ? <View style={listStyles.listLineWrap}>{secondLineTips}</View> : null;
+ const listContent = [firstLine, secondLine];
+ return <View style={listStyles.listWrapper}>
+ {listTitle}
+ {listContent}
+ </View>;
+};
+
+const _WidgetInListStyle_export = {
+default: WidgetInListStyle
+};
+const WidgetInListStyle_import_default_from__lib__WidgetInListStyle = _WidgetInListStyle_export.default;
+const WidgetInWFStyle_import_default_from__lib__WidgetInWFStyle = _WidgetInWFStyle_export.default;
+const defaultStyle__lib = {
+container: {
+backgroundColor: '#f2f2f2'
+}
+};
+
+class Widget extends Component {
+ constructor(props) {
+ super(props);
+ }
+ render() {
+ const _this$props = this.props,
+ _this$props$model = _this$props.model,
+ model = _this$props$model === "undefined" ? {} : _this$props$model,
+ _this$props$status = _this$props.status,
+ status = _this$props$status === "undefined" ? {} : _this$props$status;
+ const _status$layoutStyle = status.layoutStyle,
+ layoutStyle = _status$layoutStyle === "undefined" ? 0 : _status$layoutStyle;
+ const content = parseInt(layoutStyle, 10) === 1 ? <WidgetInWFStyle_import_default_from__lib__WidgetInWFStyle {...model} /> : <WidgetInListStyle_import_default_from__lib__WidgetInListStyle {...model} />;
+ return <View style={{ ...defaultStyle__lib.container
+ }}>{content}</View>;
+ }
+
+}
+
+const _lib_export = {
+default: Widget
+};
+const Widget_import_default_from___lib = _lib_export.default;
+const _data = __weex_data__;
+const defaultStyle = {
+container: {
+backgroundColor: '#ffffff'
+}
+};
+
+class Segment extends Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ data: _data
+ };
+ }
+ render() {
+ const _this$state$data = this.state.data,
+ data = _this$state$data === "undefined" ? {} : _this$state$data;
+ return <View style={{ ...defaultStyle.container
+ }}>
+ <Widget_import_default_from___lib {...data} />
+ </View>;
+ }
+
+}
+
+render(<Segment />);
+
diff --git a/android/playground/src/main/assets/news.weex.js b/android/playground/src/main/assets/news.weex.js
new file mode 100644
index 0000000..b8fc988
--- /dev/null
+++ b/android/playground/src/main/assets/news.weex.js
@@ -0,0 +1,2266 @@
+// { "framework": "Vue" }
+"use weex:vue";
+
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 37);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports) {
+
+// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
+var global = module.exports = typeof window != 'undefined' && window.Math == Math
+ ? window : typeof self != 'undefined' && self.Math == Math ? self
+ // eslint-disable-next-line no-new-func
+ : Function('return this')();
+if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports) {
+
+var hasOwnProperty = {}.hasOwnProperty;
+module.exports = function (it, key) {
+ return hasOwnProperty.call(it, key);
+};
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dP = __webpack_require__(3);
+var createDesc = __webpack_require__(12);
+module.exports = __webpack_require__(4) ? function (object, key, value) {
+ return dP.f(object, key, createDesc(1, value));
+} : function (object, key, value) {
+ object[key] = value;
+ return object;
+};
+
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var anObject = __webpack_require__(10);
+var IE8_DOM_DEFINE = __webpack_require__(29);
+var toPrimitive = __webpack_require__(16);
+var dP = Object.defineProperty;
+
+exports.f = __webpack_require__(4) ? Object.defineProperty : function defineProperty(O, P, Attributes) {
+ anObject(O);
+ P = toPrimitive(P, true);
+ anObject(Attributes);
+ if (IE8_DOM_DEFINE) try {
+ return dP(O, P, Attributes);
+ } catch (e) { /* empty */ }
+ if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
+ if ('value' in Attributes) O[P] = Attributes.value;
+ return O;
+};
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// Thank's IE8 for his funny defineProperty
+module.exports = !__webpack_require__(11)(function () {
+ return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
+});
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// to indexed object, toObject with fallback for non-array-like ES3 strings
+var IObject = __webpack_require__(51);
+var defined = __webpack_require__(15);
+module.exports = function (it) {
+ return IObject(defined(it));
+};
+
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var store = __webpack_require__(20)('wks');
+var uid = __webpack_require__(13);
+var Symbol = __webpack_require__(0).Symbol;
+var USE_SYMBOL = typeof Symbol == 'function';
+
+var $exports = module.exports = function (name) {
+ return store[name] || (store[name] =
+ USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
+};
+
+$exports.store = store;
+
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports) {
+
+var core = module.exports = { version: '2.5.7' };
+if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
+
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports) {
+
+module.exports = function (it) {
+ return typeof it === 'object' ? it !== null : typeof it === 'function';
+};
+
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports) {
+
+module.exports = true;
+
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(8);
+module.exports = function (it) {
+ if (!isObject(it)) throw TypeError(it + ' is not an object!');
+ return it;
+};
+
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports) {
+
+module.exports = function (exec) {
+ try {
+ return !!exec();
+ } catch (e) {
+ return true;
+ }
+};
+
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports) {
+
+module.exports = function (bitmap, value) {
+ return {
+ enumerable: !(bitmap & 1),
+ configurable: !(bitmap & 2),
+ writable: !(bitmap & 4),
+ value: value
+ };
+};
+
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports) {
+
+var id = 0;
+var px = Math.random();
+module.exports = function (key) {
+ return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
+};
+
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports) {
+
+// 7.1.4 ToInteger
+var ceil = Math.ceil;
+var floor = Math.floor;
+module.exports = function (it) {
+ return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
+};
+
+
+/***/ }),
+/* 15 */
+/***/ (function(module, exports) {
+
+// 7.2.1 RequireObjectCoercible(argument)
+module.exports = function (it) {
+ if (it == undefined) throw TypeError("Can't call method on " + it);
+ return it;
+};
+
+
+/***/ }),
+/* 16 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.1 ToPrimitive(input [, PreferredType])
+var isObject = __webpack_require__(8);
+// instead of the ES6 spec version, we didn't implement @@toPrimitive case
+// and the second argument - flag - preferred type is a string
+module.exports = function (it, S) {
+ if (!isObject(it)) return it;
+ var fn, val;
+ if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+ if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;
+ if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+ throw TypeError("Can't convert object to primitive value");
+};
+
+
+/***/ }),
+/* 17 */
+/***/ (function(module, exports) {
+
+module.exports = {};
+
+
+/***/ }),
+/* 18 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.14 / 15.2.3.14 Object.keys(O)
+var $keys = __webpack_require__(33);
+var enumBugKeys = __webpack_require__(21);
+
+module.exports = Object.keys || function keys(O) {
+ return $keys(O, enumBugKeys);
+};
+
+
+/***/ }),
+/* 19 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var shared = __webpack_require__(20)('keys');
+var uid = __webpack_require__(13);
+module.exports = function (key) {
+ return shared[key] || (shared[key] = uid(key));
+};
+
+
+/***/ }),
+/* 20 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var core = __webpack_require__(7);
+var global = __webpack_require__(0);
+var SHARED = '__core-js_shared__';
+var store = global[SHARED] || (global[SHARED] = {});
+
+(module.exports = function (key, value) {
+ return store[key] || (store[key] = value !== undefined ? value : {});
+})('versions', []).push({
+ version: core.version,
+ mode: __webpack_require__(9) ? 'pure' : 'global',
+ copyright: '© 2018 Denis Pushkarev (zloirock.ru)'
+});
+
+
+/***/ }),
+/* 21 */
+/***/ (function(module, exports) {
+
+// IE 8- don't enum bug keys
+module.exports = (
+ 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
+).split(',');
+
+
+/***/ }),
+/* 22 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var def = __webpack_require__(3).f;
+var has = __webpack_require__(1);
+var TAG = __webpack_require__(6)('toStringTag');
+
+module.exports = function (it, tag, stat) {
+ if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });
+};
+
+
+/***/ }),
+/* 23 */
+/***/ (function(module, exports, __webpack_require__) {
+
+exports.f = __webpack_require__(6);
+
+
+/***/ }),
+/* 24 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(0);
+var core = __webpack_require__(7);
+var LIBRARY = __webpack_require__(9);
+var wksExt = __webpack_require__(23);
+var defineProperty = __webpack_require__(3).f;
+module.exports = function (name) {
+ var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
+ if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });
+};
+
+
+/***/ }),
+/* 25 */
+/***/ (function(module, exports) {
+
+exports.f = {}.propertyIsEnumerable;
+
+
+/***/ }),
+/* 26 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.fetchNews = exports.fetchDoodle = exports.readAbout = exports.saveAbout = exports.fetchAbout = exports.readGuide = exports.saveGuide = exports.fetchGuide = exports.readExamples = exports.saveExamples = exports.fetchExamples = undefined;
+
+var _stringify = __webpack_require__(40);
+
+var _stringify2 = _interopRequireDefault(_stringify);
+
+var _typeof2 = __webpack_require__(42);
+
+var _typeof3 = _interopRequireDefault(_typeof2);
+
+exports.createLink = createLink;
+exports.createURL = createURL;
+exports.i18n = i18n;
+exports.parseLanguage = parseLanguage;
+exports.setLanguage = setLanguage;
+exports.clearStorageLanguage = clearStorageLanguage;
+exports.getStorageLanguage = getStorageLanguage;
+exports.getSystemLanguage = getSystemLanguage;
+exports.getLanguage = getLanguage;
+exports.jumpTo = jumpTo;
+exports.viewSource = viewSource;
+exports.setTitleBar = setTitleBar;
+exports.fetchData = fetchData;
+exports.saveData = saveData;
+exports.readData = readData;
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var stream = weex.requireModule('stream');
+var storage = weex.requireModule('storage');
+var navigator = weex.requireModule('navigator');
+
+var encoder = typeof encodeURIComponent === 'function' ? encodeURIComponent : typeof encodeURI === 'function' ? encodeURI : function (x) {
+ return x;
+};
+
+function encodeParams(params) {
+ if (!params || (typeof params === 'undefined' ? 'undefined' : (0, _typeof3.default)(params)) !== 'object') {
+ return '';
+ }
+ var array = [];
+ for (var key in params) {
+ if (typeof params[key] === 'string') {
+ array.push(encoder(key) + '=' + encoder(params[key]));
+ }
+ }
+ return array.join('&');
+}
+
+function createLink(name) {
+ var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var args = [];
+ for (var key in params) {
+ if (typeof params[key] === 'string') {
+ args.push(encoder(key) + '=' + encoder(params[key]));
+ }
+ }
+ if (WXEnvironment.platform === 'Web') {
+ args.unshift('page=' + name + '.web.js');
+ return '/?' + args.join('&');
+ }
+ var base = getBaseURL();
+ return '' + base + name + '.weex.js' + (args.length ? '?' + args.join('&') : '');
+}
+
+function createURL(hash, params) {
+ if (WXEnvironment.platform === 'Web') {
+ return 'http://dotwe.org/raw/htmlVue/' + hash;
+ }
+ var url = 'http://dotwe.org/raw/dist/' + hash + '.bundle.wx';
+ var paramString = encodeParams(params);
+ if (WXEnvironment.appName === 'TB') {
+ return url + '?_wx_tpl=' + url + '&' + paramString;
+ }
+ if (WXEnvironment.appName === 'WXSample') {
+ return url + '?' + paramString;
+ }
+ return url + '?wx_weex=true&' + paramString;
+}
+
+function getBaseURL() {
+ var bundleUrl = weex.config.bundleUrl;
+ var isAndroidAssets = bundleUrl.indexOf('your_current_IP') >= 0 || bundleUrl.indexOf('file://assets/') >= 0;
+ var isiOSAssets = bundleUrl.indexOf('file:///') >= 0 && bundleUrl.indexOf('WeexDemo.app') > 0;
+ if (isAndroidAssets) {
+ return 'file://assets/';
+ } else if (isiOSAssets) {
+ // file:///var/mobile/Containers/Bundle/Application/{id}/WeexDemo.app/
+ // file:///Users/{user}/Library/Developer/CoreSimulator/Devices/{id}/data/Containers/Bundle/Application/{id}/WeexDemo.app/
+ return bundleUrl.substring(0, bundleUrl.lastIndexOf('/') + 1);
+ }
+ return '';
+}
+
+function i18n(text, language) {
+ if (typeof text === 'string') {
+ return text;
+ }
+ if (Object.prototype.toString.call(text) === '[object Object]') {
+ var lang = this && this.language || language || 'en';
+ return text[lang];
+ }
+}
+
+var supportedLanguageRE = /(en|zh)\_?\w*/i;
+function parseLanguage(language) {
+ var match = supportedLanguageRE.exec(language + '');
+ if (match && match[1]) {
+ return match[1];
+ }
+ return '';
+}
+
+function setLanguage(language) {
+ var lang = parseLanguage(language);
+ if (lang) {
+ storage.setItem('WEEX_PLAYGROUND_LANGUAGE', lang);
+ }
+}
+
+function clearStorageLanguage() {
+ storage.removeItem('WEEX_PLAYGROUND_LANGUAGE');
+}
+
+function getStorageLanguage(done) {
+ var fail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+
+ if (!(typeof done === 'undefined' ? 'undefined' : (0, _typeof3.default)(done)) === 'function') {
+ return;
+ }
+ try {
+ storage.getItem('WEEX_PLAYGROUND_LANGUAGE', function (event) {
+ if (event.result === 'success') {
+ var lang = parseLanguage(event.data);
+ lang ? done(lang) : fail();
+ } else {
+ fail(event);
+ }
+ });
+ } catch (err) {
+ fail(err);
+ }
+}
+
+function getSystemLanguage(done) {
+ var fail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+
+ if (!(typeof done === 'undefined' ? 'undefined' : (0, _typeof3.default)(done)) === 'function') {
+ return;
+ }
+ if (WXEnvironment.platform.toLowerCase() === 'web') {
+ var lang = parseLanguage(window.navigator.language);
+ lang ? done(lang) : fail();
+ } else {
+ try {
+ var locale = weex.requireModule('locale') || weex.requireModule('local');
+ var useSync = false;
+ var resSync = locale.getLanguage(function (language) {
+ var lang = parseLanguage(language);
+ if (lang) {
+ useSync || done(lang);
+ } else {
+ fail();
+ }
+ });
+ var langSync = parseLanguage(resSync);
+ if (langSync) {
+ useSync = true;
+ done(langSync);
+ } else {
+ fail();
+ }
+ } catch (e) {
+ fail(e);
+ }
+ }
+}
+
+var languageRE = /.+[\?\&]{1}language=([\d\w]+)[\?\&]?.*/i;
+function getLanguage() {
+ var done = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
+
+ var match = languageRE.exec(weex.config.bundleUrl || '');
+ var lang = parseLanguage(match && match[1]);
+ if (lang) {
+ done(lang);
+ } else {
+ getStorageLanguage(done, function () {
+ getSystemLanguage(done, function () {
+ done('en');
+ });
+ });
+ }
+}
+
+function jumpTo(url, title, lang) {
+ getLanguage(function (language) {
+ storage.setItem('CURRENT_DOCUMENT_URL', i18n(url, lang || language));
+ navigator.push({
+ url: createURL('bf0305c14b511b24a4e616f53926432b', { language: language, title: i18n(title, lang || language) })
+ });
+ });
+}
+
+function viewSource(hash) {
+ getLanguage(function (language) {
+ navigator.push({
+ url: createURL('f6ce29faf686eabc38b410bf4828fa5a', { hash: hash, language: language })
+ });
+ });
+}
+
+function setTitleBar(options) {
+ var language = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en';
+
+ if (Object.prototype.toString.apply(options) !== '[object Object]') {
+ return;
+ }
+ var titleBar = weex.requireModule('titleBar');
+ if (options.color || options.backgroundColor) {
+ try {
+ titleBar.setStyle({
+ foregroundColor: options.color || '#FFFFFF',
+ backgroundColor: options.backgroundColor || '#00B4FF'
+ });
+ } catch (e) {}
+ }
+ var title = i18n(options.title, language);
+ if (title) {
+ try {
+ titleBar.setTitle(title);
+ } catch (e) {}
+ }
+}
+
+var storageKeys = {
+ doodle: 'WEEX_PLAYGROUND_APP_DOODLE',
+ guide: 'WEEX_PLAYGROUND_APP_GUIDE',
+ examples: 'WEEX_PLAYGROUND_APP_EXAMPLES',
+ news: 'WEEX_PLAYGROUND_APP_NEWS',
+ about: 'WEEX_PLAYGROUND_APP_ABOUT'
+};
+function fetchData(name) {
+ var done = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+ var fail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
+
+ try {
+ stream.fetch({
+ url: 'http://dotwe.org/query/weex-playground-app',
+ method: 'post',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded'
+ },
+ type: 'json',
+ body: 'name=' + name
+ }, function (res) {
+ if (res.ok && res.data && res.data.success) {
+ done(res.data);
+ } else {
+ fail(res);
+ }
+ });
+ } catch (err) {
+ fail(err);
+ }
+}
+function saveData(name, result) {
+ var key = storageKeys[name];
+ if (!key) return;
+ if (result && (typeof result === 'undefined' ? 'undefined' : (0, _typeof3.default)(result)) === 'object') {
+ result.timestamp = Date.now();
+ storage.setItem(key, (0, _stringify2.default)(result));
+ }
+}
+function readData(name) {
+ var done = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
+ var fail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
+
+ var key = storageKeys[name];
+ if (!key) return fail();
+ try {
+ storage.getItem(key, function (event) {
+ if (event.result === 'success') {
+ var result = JSON.parse(event.data);
+ if (result && Array.isArray(result[name])) {
+ return done(result[name]);
+ }
+ }
+ fail(event);
+ });
+ } catch (e) {
+ fail(e);
+ }
+}
+
+var fetchExamples = exports.fetchExamples = function fetchExamples() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ return fetchData.apply(undefined, ['examples'].concat(args));
+};
+var saveExamples = exports.saveExamples = function saveExamples() {
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ return saveData.apply(undefined, ['examples'].concat(args));
+};
+var readExamples = exports.readExamples = function readExamples() {
+ for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+ args[_key3] = arguments[_key3];
+ }
+
+ return readData.apply(undefined, ['examples'].concat(args));
+};
+
+var fetchGuide = exports.fetchGuide = function fetchGuide() {
+ for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
+ args[_key4] = arguments[_key4];
+ }
+
+ return fetchData.apply(undefined, ['guide'].concat(args));
+};
+var saveGuide = exports.saveGuide = function saveGuide() {
+ for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
+ args[_key5] = arguments[_key5];
+ }
+
+ return saveData.apply(undefined, ['guide'].concat(args));
+};
+var readGuide = exports.readGuide = function readGuide() {
+ for (var _len6 = arguments.length, args = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
+ args[_key6] = arguments[_key6];
+ }
+
+ return readData.apply(undefined, ['guide'].concat(args));
+};
+
+var fetchAbout = exports.fetchAbout = function fetchAbout() {
+ for (var _len7 = arguments.length, args = Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
+ args[_key7] = arguments[_key7];
+ }
+
+ return fetchData.apply(undefined, ['about'].concat(args));
+};
+var saveAbout = exports.saveAbout = function saveAbout() {
+ for (var _len8 = arguments.length, args = Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
+ args[_key8] = arguments[_key8];
+ }
+
+ return saveData.apply(undefined, ['about'].concat(args));
+};
+var readAbout = exports.readAbout = function readAbout() {
+ for (var _len9 = arguments.length, args = Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {
+ args[_key9] = arguments[_key9];
+ }
+
+ return readData.apply(undefined, ['about'].concat(args));
+};
+
+var fetchDoodle = exports.fetchDoodle = function fetchDoodle() {
+ for (var _len10 = arguments.length, args = Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {
+ args[_key10] = arguments[_key10];
+ }
+
+ return fetchData.apply(undefined, ['doodle'].concat(args));
+};
+var fetchNews = exports.fetchNews = function fetchNews() {
+ for (var _len11 = arguments.length, args = Array(_len11), _key11 = 0; _key11 < _len11; _key11++) {
+ args[_key11] = arguments[_key11];
+ }
+
+ return fetchData.apply(undefined, ['news'].concat(args));
+};
+
+/***/ }),
+/* 27 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var LIBRARY = __webpack_require__(9);
+var $export = __webpack_require__(28);
+var redefine = __webpack_require__(31);
+var hide = __webpack_require__(2);
+var Iterators = __webpack_require__(17);
+var $iterCreate = __webpack_require__(49);
+var setToStringTag = __webpack_require__(22);
+var getPrototypeOf = __webpack_require__(56);
+var ITERATOR = __webpack_require__(6)('iterator');
+var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
+var FF_ITERATOR = '@@iterator';
+var KEYS = 'keys';
+var VALUES = 'values';
+
+var returnThis = function () { return this; };
+
+module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
+ $iterCreate(Constructor, NAME, next);
+ var getMethod = function (kind) {
+ if (!BUGGY && kind in proto) return proto[kind];
+ switch (kind) {
+ case KEYS: return function keys() { return new Constructor(this, kind); };
+ case VALUES: return function values() { return new Constructor(this, kind); };
+ } return function entries() { return new Constructor(this, kind); };
+ };
+ var TAG = NAME + ' Iterator';
+ var DEF_VALUES = DEFAULT == VALUES;
+ var VALUES_BUG = false;
+ var proto = Base.prototype;
+ var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
+ var $default = $native || getMethod(DEFAULT);
+ var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
+ var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
+ var methods, key, IteratorPrototype;
+ // Fix native
+ if ($anyNative) {
+ IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));
+ if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
+ // Set @@toStringTag to native iterators
+ setToStringTag(IteratorPrototype, TAG, true);
+ // fix for some old engines
+ if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);
+ }
+ }
+ // fix Array#{values, @@iterator}.name in V8 / FF
+ if (DEF_VALUES && $native && $native.name !== VALUES) {
+ VALUES_BUG = true;
+ $default = function values() { return $native.call(this); };
+ }
+ // Define iterator
+ if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
+ hide(proto, ITERATOR, $default);
+ }
+ // Plug for library
+ Iterators[NAME] = $default;
+ Iterators[TAG] = returnThis;
+ if (DEFAULT) {
+ methods = {
+ values: DEF_VALUES ? $default : getMethod(VALUES),
+ keys: IS_SET ? $default : getMethod(KEYS),
+ entries: $entries
+ };
+ if (FORCED) for (key in methods) {
+ if (!(key in proto)) redefine(proto, key, methods[key]);
+ } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
+ }
+ return methods;
+};
+
+
+/***/ }),
+/* 28 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(0);
+var core = __webpack_require__(7);
+var ctx = __webpack_require__(47);
+var hide = __webpack_require__(2);
+var has = __webpack_require__(1);
+var PROTOTYPE = 'prototype';
+
+var $export = function (type, name, source) {
+ var IS_FORCED = type & $export.F;
+ var IS_GLOBAL = type & $export.G;
+ var IS_STATIC = type & $export.S;
+ var IS_PROTO = type & $export.P;
+ var IS_BIND = type & $export.B;
+ var IS_WRAP = type & $export.W;
+ var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
+ var expProto = exports[PROTOTYPE];
+ var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];
+ var key, own, out;
+ if (IS_GLOBAL) source = name;
+ for (key in source) {
+ // contains in native
+ own = !IS_FORCED && target && target[key] !== undefined;
+ if (own && has(exports, key)) continue;
+ // export native or passed
+ out = own ? target[key] : source[key];
+ // prevent global pollution for namespaces
+ exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
+ // bind timers to global for call from export context
+ : IS_BIND && own ? ctx(out, global)
+ // wrap global constructors for prevent change them in library
+ : IS_WRAP && target[key] == out ? (function (C) {
+ var F = function (a, b, c) {
+ if (this instanceof C) {
+ switch (arguments.length) {
+ case 0: return new C();
+ case 1: return new C(a);
+ case 2: return new C(a, b);
+ } return new C(a, b, c);
+ } return C.apply(this, arguments);
+ };
+ F[PROTOTYPE] = C[PROTOTYPE];
+ return F;
+ // make static versions for prototype methods
+ })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
+ // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
+ if (IS_PROTO) {
+ (exports.virtual || (exports.virtual = {}))[key] = out;
+ // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
+ if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);
+ }
+ }
+};
+// type bitmap
+$export.F = 1; // forced
+$export.G = 2; // global
+$export.S = 4; // static
+$export.P = 8; // proto
+$export.B = 16; // bind
+$export.W = 32; // wrap
+$export.U = 64; // safe
+$export.R = 128; // real proto method for `library`
+module.exports = $export;
+
+
+/***/ }),
+/* 29 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = !__webpack_require__(4) && !__webpack_require__(11)(function () {
+ return Object.defineProperty(__webpack_require__(30)('div'), 'a', { get: function () { return 7; } }).a != 7;
+});
+
+
+/***/ }),
+/* 30 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(8);
+var document = __webpack_require__(0).document;
+// typeof document.createElement is 'object' in old IE
+var is = isObject(document) && isObject(document.createElement);
+module.exports = function (it) {
+ return is ? document.createElement(it) : {};
+};
+
+
+/***/ }),
+/* 31 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(2);
+
+
+/***/ }),
+/* 32 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
+var anObject = __webpack_require__(10);
+var dPs = __webpack_require__(50);
+var enumBugKeys = __webpack_require__(21);
+var IE_PROTO = __webpack_require__(19)('IE_PROTO');
+var Empty = function () { /* empty */ };
+var PROTOTYPE = 'prototype';
+
+// Create object with fake `null` prototype: use iframe Object with cleared prototype
+var createDict = function () {
+ // Thrash, waste and sodomy: IE GC bug
+ var iframe = __webpack_require__(30)('iframe');
+ var i = enumBugKeys.length;
+ var lt = '<';
+ var gt = '>';
+ var iframeDocument;
+ iframe.style.display = 'none';
+ __webpack_require__(55).appendChild(iframe);
+ iframe.src = 'javascript:'; // eslint-disable-line no-script-url
+ // createDict = iframe.contentWindow.Object;
+ // html.removeChild(iframe);
+ iframeDocument = iframe.contentWindow.document;
+ iframeDocument.open();
+ iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
+ iframeDocument.close();
+ createDict = iframeDocument.F;
+ while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];
+ return createDict();
+};
+
+module.exports = Object.create || function create(O, Properties) {
+ var result;
+ if (O !== null) {
+ Empty[PROTOTYPE] = anObject(O);
+ result = new Empty();
+ Empty[PROTOTYPE] = null;
+ // add "__proto__" for Object.getPrototypeOf polyfill
+ result[IE_PROTO] = O;
+ } else result = createDict();
+ return Properties === undefined ? result : dPs(result, Properties);
+};
+
+
+/***/ }),
+/* 33 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var has = __webpack_require__(1);
+var toIObject = __webpack_require__(5);
+var arrayIndexOf = __webpack_require__(52)(false);
+var IE_PROTO = __webpack_require__(19)('IE_PROTO');
+
+module.exports = function (object, names) {
+ var O = toIObject(object);
+ var i = 0;
+ var result = [];
+ var key;
+ for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);
+ // Don't enum bug & hidden keys
+ while (names.length > i) if (has(O, key = names[i++])) {
+ ~arrayIndexOf(result, key) || result.push(key);
+ }
+ return result;
+};
+
+
+/***/ }),
+/* 34 */
+/***/ (function(module, exports) {
+
+var toString = {}.toString;
+
+module.exports = function (it) {
+ return toString.call(it).slice(8, -1);
+};
+
+
+/***/ }),
+/* 35 */
+/***/ (function(module, exports) {
+
+exports.f = Object.getOwnPropertySymbols;
+
+
+/***/ }),
+/* 36 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
+var $keys = __webpack_require__(33);
+var hiddenKeys = __webpack_require__(21).concat('length', 'prototype');
+
+exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
+ return $keys(O, hiddenKeys);
+};
+
+
+/***/ }),
+/* 37 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+__webpack_require__(38);
+
+var _News = __webpack_require__(73);
+
+var _News2 = _interopRequireDefault(_News);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// show title bar
+try {
+ var titleBar = weex.requireModule('titleBar');
+ titleBar.showTitleBar(true);
+} catch (e) {}
+
+_News2.default.el = '#root';
+new Vue(_News2.default);
+
+/***/ }),
+/* 38 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _mixin = __webpack_require__(39);
+
+var _mixin2 = _interopRequireDefault(_mixin);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// use shared mixins
+Vue.mixin(_mixin2.default);
+
+/***/ }),
+/* 39 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _index = __webpack_require__(26);
+
+var utils = _interopRequireWildcard(_index);
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
+
+var storage = weex.requireModule('storage');
+
+exports.default = {
+ filters: {
+ i18n: utils.i18n,
+ url: utils.createURL,
+ link: utils.createLink
+ },
+ methods: {
+ createLink: utils.createLink,
+ createURL: utils.createURL,
+ i18n: utils.i18n,
+ getLanguage: utils.getLanguage,
+ fetchData: utils.fetchData,
+ saveData: utils.saveData,
+ readData: utils.readData,
+ jumpTo: utils.jumpTo
+ },
+ created: function created() {
+ var _this = this;
+
+ // get and set language
+ utils.getLanguage(function (language) {
+ _this.language = language;
+ utils.setTitleBar(_this.navigationBarOptions, language);
+ });
+
+ // listen to the language change event
+ var channel = new BroadcastChannel('language');
+ channel.onmessage = function (event) {
+ if (event.data && event.data.language) {
+ _this.language = event.data.language;
+ }
+ };
+ },
+ beforeDestroy: function beforeDestroy() {
+ storage.removeItem('CURRENT_DOCUMENT_URL');
+ storage.removeItem('CURRENT_SOURCE_HASH');
+ }
+};
+
+/***/ }),
+/* 40 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(41), __esModule: true };
+
+/***/ }),
+/* 41 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var core = __webpack_require__(7);
+var $JSON = core.JSON || (core.JSON = { stringify: JSON.stringify });
+module.exports = function stringify(it) { // eslint-disable-line no-unused-vars
+ return $JSON.stringify.apply($JSON, arguments);
+};
+
+
+/***/ }),
+/* 42 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = true;
+
+var _iterator = __webpack_require__(43);
+
+var _iterator2 = _interopRequireDefault(_iterator);
+
+var _symbol = __webpack_require__(62);
+
+var _symbol2 = _interopRequireDefault(_symbol);
+
+var _typeof = typeof _symbol2.default === "function" && typeof _iterator2.default === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj; };
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.default) === "symbol" ? function (obj) {
+ return typeof obj === "undefined" ? "undefined" : _typeof(obj);
+} : function (obj) {
+ return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj);
+};
+
+/***/ }),
+/* 43 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(44), __esModule: true };
+
+/***/ }),
+/* 44 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(45);
+__webpack_require__(58);
+module.exports = __webpack_require__(23).f('iterator');
+
+
+/***/ }),
+/* 45 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $at = __webpack_require__(46)(true);
+
+// 21.1.3.27 String.prototype[@@iterator]()
+__webpack_require__(27)(String, 'String', function (iterated) {
+ this._t = String(iterated); // target
+ this._i = 0; // next index
+// 21.1.5.2.1 %StringIteratorPrototype%.next()
+}, function () {
+ var O = this._t;
+ var index = this._i;
+ var point;
+ if (index >= O.length) return { value: undefined, done: true };
+ point = $at(O, index);
+ this._i += point.length;
+ return { value: point, done: false };
+});
+
+
+/***/ }),
+/* 46 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(14);
+var defined = __webpack_require__(15);
+// true -> String#at
+// false -> String#codePointAt
+module.exports = function (TO_STRING) {
+ return function (that, pos) {
+ var s = String(defined(that));
+ var i = toInteger(pos);
+ var l = s.length;
+ var a, b;
+ if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
+ a = s.charCodeAt(i);
+ return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
+ ? TO_STRING ? s.charAt(i) : a
+ : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
+ };
+};
+
+
+/***/ }),
+/* 47 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// optional / simple context binding
+var aFunction = __webpack_require__(48);
+module.exports = function (fn, that, length) {
+ aFunction(fn);
+ if (that === undefined) return fn;
+ switch (length) {
+ case 1: return function (a) {
+ return fn.call(that, a);
+ };
+ case 2: return function (a, b) {
+ return fn.call(that, a, b);
+ };
+ case 3: return function (a, b, c) {
+ return fn.call(that, a, b, c);
+ };
+ }
+ return function (/* ...args */) {
+ return fn.apply(that, arguments);
+ };
+};
+
+
+/***/ }),
+/* 48 */
+/***/ (function(module, exports) {
+
+module.exports = function (it) {
+ if (typeof it != 'function') throw TypeError(it + ' is not a function!');
+ return it;
+};
+
+
+/***/ }),
+/* 49 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var create = __webpack_require__(32);
+var descriptor = __webpack_require__(12);
+var setToStringTag = __webpack_require__(22);
+var IteratorPrototype = {};
+
+// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
+__webpack_require__(2)(IteratorPrototype, __webpack_require__(6)('iterator'), function () { return this; });
+
+module.exports = function (Constructor, NAME, next) {
+ Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });
+ setToStringTag(Constructor, NAME + ' Iterator');
+};
+
+
+/***/ }),
+/* 50 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dP = __webpack_require__(3);
+var anObject = __webpack_require__(10);
+var getKeys = __webpack_require__(18);
+
+module.exports = __webpack_require__(4) ? Object.defineProperties : function defineProperties(O, Properties) {
+ anObject(O);
+ var keys = getKeys(Properties);
+ var length = keys.length;
+ var i = 0;
+ var P;
+ while (length > i) dP.f(O, P = keys[i++], Properties[P]);
+ return O;
+};
+
+
+/***/ }),
+/* 51 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// fallback for non-array-like ES3 and non-enumerable old V8 strings
+var cof = __webpack_require__(34);
+// eslint-disable-next-line no-prototype-builtins
+module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
+ return cof(it) == 'String' ? it.split('') : Object(it);
+};
+
+
+/***/ }),
+/* 52 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// false -> Array#indexOf
+// true -> Array#includes
+var toIObject = __webpack_require__(5);
+var toLength = __webpack_require__(53);
+var toAbsoluteIndex = __webpack_require__(54);
+module.exports = function (IS_INCLUDES) {
+ return function ($this, el, fromIndex) {
+ var O = toIObject($this);
+ var length = toLength(O.length);
+ var index = toAbsoluteIndex(fromIndex, length);
+ var value;
+ // Array#includes uses SameValueZero equality algorithm
+ // eslint-disable-next-line no-self-compare
+ if (IS_INCLUDES && el != el) while (length > index) {
+ value = O[index++];
+ // eslint-disable-next-line no-self-compare
+ if (value != value) return true;
+ // Array#indexOf ignores holes, Array#includes - not
+ } else for (;length > index; index++) if (IS_INCLUDES || index in O) {
+ if (O[index] === el) return IS_INCLUDES || index || 0;
+ } return !IS_INCLUDES && -1;
+ };
+};
+
+
+/***/ }),
+/* 53 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.15 ToLength
+var toInteger = __webpack_require__(14);
+var min = Math.min;
+module.exports = function (it) {
+ return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
+};
+
+
+/***/ }),
+/* 54 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(14);
+var max = Math.max;
+var min = Math.min;
+module.exports = function (index, length) {
+ index = toInteger(index);
+ return index < 0 ? max(index + length, 0) : min(index, length);
+};
+
+
+/***/ }),
+/* 55 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var document = __webpack_require__(0).document;
+module.exports = document && document.documentElement;
+
+
+/***/ }),
+/* 56 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
+var has = __webpack_require__(1);
+var toObject = __webpack_require__(57);
+var IE_PROTO = __webpack_require__(19)('IE_PROTO');
+var ObjectProto = Object.prototype;
+
+module.exports = Object.getPrototypeOf || function (O) {
+ O = toObject(O);
+ if (has(O, IE_PROTO)) return O[IE_PROTO];
+ if (typeof O.constructor == 'function' && O instanceof O.constructor) {
+ return O.constructor.prototype;
+ } return O instanceof Object ? ObjectProto : null;
+};
+
+
+/***/ }),
+/* 57 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.13 ToObject(argument)
+var defined = __webpack_require__(15);
+module.exports = function (it) {
+ return Object(defined(it));
+};
+
+
+/***/ }),
+/* 58 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(59);
+var global = __webpack_require__(0);
+var hide = __webpack_require__(2);
+var Iterators = __webpack_require__(17);
+var TO_STRING_TAG = __webpack_require__(6)('toStringTag');
+
+var DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +
+ 'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +
+ 'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +
+ 'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +
+ 'TextTrackList,TouchList').split(',');
+
+for (var i = 0; i < DOMIterables.length; i++) {
+ var NAME = DOMIterables[i];
+ var Collection = global[NAME];
+ var proto = Collection && Collection.prototype;
+ if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);
+ Iterators[NAME] = Iterators.Array;
+}
+
+
+/***/ }),
+/* 59 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var addToUnscopables = __webpack_require__(60);
+var step = __webpack_require__(61);
+var Iterators = __webpack_require__(17);
+var toIObject = __webpack_require__(5);
+
+// 22.1.3.4 Array.prototype.entries()
+// 22.1.3.13 Array.prototype.keys()
+// 22.1.3.29 Array.prototype.values()
+// 22.1.3.30 Array.prototype[@@iterator]()
+module.exports = __webpack_require__(27)(Array, 'Array', function (iterated, kind) {
+ this._t = toIObject(iterated); // target
+ this._i = 0; // next index
+ this._k = kind; // kind
+// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
+}, function () {
+ var O = this._t;
+ var kind = this._k;
+ var index = this._i++;
+ if (!O || index >= O.length) {
+ this._t = undefined;
+ return step(1);
+ }
+ if (kind == 'keys') return step(0, index);
+ if (kind == 'values') return step(0, O[index]);
+ return step(0, [index, O[index]]);
+}, 'values');
+
+// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
+Iterators.Arguments = Iterators.Array;
+
+addToUnscopables('keys');
+addToUnscopables('values');
+addToUnscopables('entries');
+
+
+/***/ }),
+/* 60 */
+/***/ (function(module, exports) {
+
+module.exports = function () { /* empty */ };
+
+
+/***/ }),
+/* 61 */
+/***/ (function(module, exports) {
+
+module.exports = function (done, value) {
+ return { value: value, done: !!done };
+};
+
+
+/***/ }),
+/* 62 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(63), __esModule: true };
+
+/***/ }),
+/* 63 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(64);
+__webpack_require__(70);
+__webpack_require__(71);
+__webpack_require__(72);
+module.exports = __webpack_require__(7).Symbol;
+
+
+/***/ }),
+/* 64 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// ECMAScript 6 symbols shim
+var global = __webpack_require__(0);
+var has = __webpack_require__(1);
+var DESCRIPTORS = __webpack_require__(4);
+var $export = __webpack_require__(28);
+var redefine = __webpack_require__(31);
+var META = __webpack_require__(65).KEY;
+var $fails = __webpack_require__(11);
+var shared = __webpack_require__(20);
+var setToStringTag = __webpack_require__(22);
+var uid = __webpack_require__(13);
+var wks = __webpack_require__(6);
+var wksExt = __webpack_require__(23);
+var wksDefine = __webpack_require__(24);
+var enumKeys = __webpack_require__(66);
+var isArray = __webpack_require__(67);
+var anObject = __webpack_require__(10);
+var isObject = __webpack_require__(8);
+var toIObject = __webpack_require__(5);
+var toPrimitive = __webpack_require__(16);
+var createDesc = __webpack_require__(12);
+var _create = __webpack_require__(32);
+var gOPNExt = __webpack_require__(68);
+var $GOPD = __webpack_require__(69);
+var $DP = __webpack_require__(3);
+var $keys = __webpack_require__(18);
+var gOPD = $GOPD.f;
+var dP = $DP.f;
+var gOPN = gOPNExt.f;
+var $Symbol = global.Symbol;
+var $JSON = global.JSON;
+var _stringify = $JSON && $JSON.stringify;
+var PROTOTYPE = 'prototype';
+var HIDDEN = wks('_hidden');
+var TO_PRIMITIVE = wks('toPrimitive');
+var isEnum = {}.propertyIsEnumerable;
+var SymbolRegistry = shared('symbol-registry');
+var AllSymbols = shared('symbols');
+var OPSymbols = shared('op-symbols');
+var ObjectProto = Object[PROTOTYPE];
+var USE_NATIVE = typeof $Symbol == 'function';
+var QObject = global.QObject;
+// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
+var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
+
+// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
+var setSymbolDesc = DESCRIPTORS && $fails(function () {
+ return _create(dP({}, 'a', {
+ get: function () { return dP(this, 'a', { value: 7 }).a; }
+ })).a != 7;
+}) ? function (it, key, D) {
+ var protoDesc = gOPD(ObjectProto, key);
+ if (protoDesc) delete ObjectProto[key];
+ dP(it, key, D);
+ if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);
+} : dP;
+
+var wrap = function (tag) {
+ var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);
+ sym._k = tag;
+ return sym;
+};
+
+var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {
+ return typeof it == 'symbol';
+} : function (it) {
+ return it instanceof $Symbol;
+};
+
+var $defineProperty = function defineProperty(it, key, D) {
+ if (it === ObjectProto) $defineProperty(OPSymbols, key, D);
+ anObject(it);
+ key = toPrimitive(key, true);
+ anObject(D);
+ if (has(AllSymbols, key)) {
+ if (!D.enumerable) {
+ if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));
+ it[HIDDEN][key] = true;
+ } else {
+ if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
+ D = _create(D, { enumerable: createDesc(0, false) });
+ } return setSymbolDesc(it, key, D);
+ } return dP(it, key, D);
+};
+var $defineProperties = function defineProperties(it, P) {
+ anObject(it);
+ var keys = enumKeys(P = toIObject(P));
+ var i = 0;
+ var l = keys.length;
+ var key;
+ while (l > i) $defineProperty(it, key = keys[i++], P[key]);
+ return it;
+};
+var $create = function create(it, P) {
+ return P === undefined ? _create(it) : $defineProperties(_create(it), P);
+};
+var $propertyIsEnumerable = function propertyIsEnumerable(key) {
+ var E = isEnum.call(this, key = toPrimitive(key, true));
+ if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;
+ return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
+};
+var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
+ it = toIObject(it);
+ key = toPrimitive(key, true);
+ if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;
+ var D = gOPD(it, key);
+ if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
+ return D;
+};
+var $getOwnPropertyNames = function getOwnPropertyNames(it) {
+ var names = gOPN(toIObject(it));
+ var result = [];
+ var i = 0;
+ var key;
+ while (names.length > i) {
+ if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
+ } return result;
+};
+var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
+ var IS_OP = it === ObjectProto;
+ var names = gOPN(IS_OP ? OPSymbols : toIObject(it));
+ var result = [];
+ var i = 0;
+ var key;
+ while (names.length > i) {
+ if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);
+ } return result;
+};
+
+// 19.4.1.1 Symbol([description])
+if (!USE_NATIVE) {
+ $Symbol = function Symbol() {
+ if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
+ var tag = uid(arguments.length > 0 ? arguments[0] : undefined);
+ var $set = function (value) {
+ if (this === ObjectProto) $set.call(OPSymbols, value);
+ if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
+ setSymbolDesc(this, tag, createDesc(1, value));
+ };
+ if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });
+ return wrap(tag);
+ };
+ redefine($Symbol[PROTOTYPE], 'toString', function toString() {
+ return this._k;
+ });
+
+ $GOPD.f = $getOwnPropertyDescriptor;
+ $DP.f = $defineProperty;
+ __webpack_require__(36).f = gOPNExt.f = $getOwnPropertyNames;
+ __webpack_require__(25).f = $propertyIsEnumerable;
+ __webpack_require__(35).f = $getOwnPropertySymbols;
+
+ if (DESCRIPTORS && !__webpack_require__(9)) {
+ redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
+ }
+
+ wksExt.f = function (name) {
+ return wrap(wks(name));
+ };
+}
+
+$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });
+
+for (var es6Symbols = (
+ // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
+ 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
+).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);
+
+for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);
+
+$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
+ // 19.4.2.1 Symbol.for(key)
+ 'for': function (key) {
+ return has(SymbolRegistry, key += '')
+ ? SymbolRegistry[key]
+ : SymbolRegistry[key] = $Symbol(key);
+ },
+ // 19.4.2.5 Symbol.keyFor(sym)
+ keyFor: function keyFor(sym) {
+ if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');
+ for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;
+ },
+ useSetter: function () { setter = true; },
+ useSimple: function () { setter = false; }
+});
+
+$export($export.S + $export.F * !USE_NATIVE, 'Object', {
+ // 19.1.2.2 Object.create(O [, Properties])
+ create: $create,
+ // 19.1.2.4 Object.defineProperty(O, P, Attributes)
+ defineProperty: $defineProperty,
+ // 19.1.2.3 Object.defineProperties(O, Properties)
+ defineProperties: $defineProperties,
+ // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
+ getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
+ // 19.1.2.7 Object.getOwnPropertyNames(O)
+ getOwnPropertyNames: $getOwnPropertyNames,
+ // 19.1.2.8 Object.getOwnPropertySymbols(O)
+ getOwnPropertySymbols: $getOwnPropertySymbols
+});
+
+// 24.3.2 JSON.stringify(value [, replacer [, space]])
+$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {
+ var S = $Symbol();
+ // MS Edge converts symbol values to JSON as {}
+ // WebKit converts symbol values to JSON as null
+ // V8 throws on boxed symbols
+ return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';
+})), 'JSON', {
+ stringify: function stringify(it) {
+ var args = [it];
+ var i = 1;
+ var replacer, $replacer;
+ while (arguments.length > i) args.push(arguments[i++]);
+ $replacer = replacer = args[1];
+ if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
+ if (!isArray(replacer)) replacer = function (key, value) {
+ if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
+ if (!isSymbol(value)) return value;
+ };
+ args[1] = replacer;
+ return _stringify.apply($JSON, args);
+ }
+});
+
+// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
+$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(2)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
+// 19.4.3.5 Symbol.prototype[@@toStringTag]
+setToStringTag($Symbol, 'Symbol');
+// 20.2.1.9 Math[@@toStringTag]
+setToStringTag(Math, 'Math', true);
+// 24.3.3 JSON[@@toStringTag]
+setToStringTag(global.JSON, 'JSON', true);
+
+
+/***/ }),
+/* 65 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var META = __webpack_require__(13)('meta');
+var isObject = __webpack_require__(8);
+var has = __webpack_require__(1);
+var setDesc = __webpack_require__(3).f;
+var id = 0;
+var isExtensible = Object.isExtensible || function () {
+ return true;
+};
+var FREEZE = !__webpack_require__(11)(function () {
+ return isExtensible(Object.preventExtensions({}));
+});
+var setMeta = function (it) {
+ setDesc(it, META, { value: {
+ i: 'O' + ++id, // object ID
+ w: {} // weak collections IDs
+ } });
+};
+var fastKey = function (it, create) {
+ // return primitive with prefix
+ if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
+ if (!has(it, META)) {
+ // can't set metadata to uncaught frozen object
+ if (!isExtensible(it)) return 'F';
+ // not necessary to add metadata
+ if (!create) return 'E';
+ // add missing metadata
+ setMeta(it);
+ // return object ID
+ } return it[META].i;
+};
+var getWeak = function (it, create) {
+ if (!has(it, META)) {
+ // can't set metadata to uncaught frozen object
+ if (!isExtensible(it)) return true;
+ // not necessary to add metadata
+ if (!create) return false;
+ // add missing metadata
+ setMeta(it);
+ // return hash weak collections IDs
+ } return it[META].w;
+};
+// add metadata on freeze-family methods calling
+var onFreeze = function (it) {
+ if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);
+ return it;
+};
+var meta = module.exports = {
+ KEY: META,
+ NEED: false,
+ fastKey: fastKey,
+ getWeak: getWeak,
+ onFreeze: onFreeze
+};
+
+
+/***/ }),
+/* 66 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// all enumerable object keys, includes symbols
+var getKeys = __webpack_require__(18);
+var gOPS = __webpack_require__(35);
+var pIE = __webpack_require__(25);
+module.exports = function (it) {
+ var result = getKeys(it);
+ var getSymbols = gOPS.f;
+ if (getSymbols) {
+ var symbols = getSymbols(it);
+ var isEnum = pIE.f;
+ var i = 0;
+ var key;
+ while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);
+ } return result;
+};
+
+
+/***/ }),
+/* 67 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.2.2 IsArray(argument)
+var cof = __webpack_require__(34);
+module.exports = Array.isArray || function isArray(arg) {
+ return cof(arg) == 'Array';
+};
+
+
+/***/ }),
+/* 68 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
+var toIObject = __webpack_require__(5);
+var gOPN = __webpack_require__(36).f;
+var toString = {}.toString;
+
+var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
+ ? Object.getOwnPropertyNames(window) : [];
+
+var getWindowNames = function (it) {
+ try {
+ return gOPN(it);
+ } catch (e) {
+ return windowNames.slice();
+ }
+};
+
+module.exports.f = function getOwnPropertyNames(it) {
+ return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));
+};
+
+
+/***/ }),
+/* 69 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var pIE = __webpack_require__(25);
+var createDesc = __webpack_require__(12);
+var toIObject = __webpack_require__(5);
+var toPrimitive = __webpack_require__(16);
+var has = __webpack_require__(1);
+var IE8_DOM_DEFINE = __webpack_require__(29);
+var gOPD = Object.getOwnPropertyDescriptor;
+
+exports.f = __webpack_require__(4) ? gOPD : function getOwnPropertyDescriptor(O, P) {
+ O = toIObject(O);
+ P = toPrimitive(P, true);
+ if (IE8_DOM_DEFINE) try {
+ return gOPD(O, P);
+ } catch (e) { /* empty */ }
+ if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);
+};
+
+
+/***/ }),
+/* 70 */
+/***/ (function(module, exports) {
+
+
+
+/***/ }),
+/* 71 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(24)('asyncIterator');
+
+
+/***/ }),
+/* 72 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(24)('observable');
+
+
+/***/ }),
+/* 73 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __vue_exports__, __vue_options__
+var __vue_styles__ = []
+
+/* styles */
+__vue_styles__.push(__webpack_require__(74)
+)
+
+/* script */
+__vue_exports__ = __webpack_require__(75)
+
+/* template */
+var __vue_template__ = __webpack_require__(76)
+__vue_options__ = __vue_exports__ = __vue_exports__ || {}
+if (
+ typeof __vue_exports__.default === "object" ||
+ typeof __vue_exports__.default === "function"
+) {
+if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")}
+__vue_options__ = __vue_exports__ = __vue_exports__.default
+}
+if (typeof __vue_options__ === "function") {
+ __vue_options__ = __vue_options__.options
+}
+__vue_options__.__file = "/Users/kw/github/weex-vue-examples/src/pages/news/News.vue"
+__vue_options__.render = __vue_template__.render
+__vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+__vue_options__._scopeId = "data-v-59a504d6"
+__vue_options__.style = __vue_options__.style || {}
+__vue_styles__.forEach(function (module) {
+ for (var name in module) {
+ __vue_options__.style[name] = module[name]
+ }
+})
+if (typeof __register_static_styles__ === "function") {
+ __register_static_styles__(__vue_options__._scopeId, __vue_styles__)
+}
+
+module.exports = __vue_exports__
+
+
+/***/ }),
+/* 74 */
+/***/ (function(module, exports) {
+
+module.exports = {
+ "list": {
+ "backgroundColor": "#F1F1F1"
+ },
+ "refresh": {
+ "width": "750",
+ "alignItems": "center",
+ "backgroundColor": "#808080"
+ },
+ "indicator-text": {
+ "color": "#C5C5C5",
+ "fontSize": "34",
+ "paddingTop": "50",
+ "paddingRight": "50",
+ "paddingBottom": "50",
+ "paddingLeft": "50",
+ "textAlign": "center"
+ },
+ "cell": {
+ "alignItems": "center"
+ },
+ "message-time": {
+ "marginTop": "25",
+ "justifyContent": "center"
+ },
+ "time-text": {
+ "paddingTop": "5",
+ "paddingBottom": "5",
+ "paddingLeft": "18",
+ "paddingRight": "18",
+ "backgroundColor": "rgba(0,0,0,0.1)",
+ "fontSize": "25",
+ "borderRadius": "8",
+ "color": "#FEFEFE"
+ },
+ "message-box": {
+ "borderWidth": "1",
+ "borderColor": "#DDDDDD",
+ "borderRadius": "15",
+ "backgroundColor": "#FFFFFF",
+ "marginTop": "25",
+ "marginBottom": "35",
+ "backgroundColor:active": "#F8F8F8"
+ },
+ "related-article": {
+ "borderTopWidth": "1",
+ "borderTopColor": "#E6E6E6",
+ "flexDirection": "row",
+ "alignItems": "center",
+ "paddingTop": "10",
+ "paddingBottom": "15",
+ "paddingLeft": "30",
+ "paddingRight": "20",
+ "backgroundColor": "#FEFEFE"
+ },
+ "poster": {
+ "width": "680",
+ "height": "340",
+ "backgroundColor": "#D2D2D2"
+ },
+ "title": {
+ "width": "680",
+ "paddingTop": "30",
+ "paddingRight": "30",
+ "paddingBottom": "30",
+ "paddingLeft": "30",
+ "fontSize": "38",
+ "color": "#323232"
+ },
+ "shortcut": {
+ "width": "80",
+ "height": "80"
+ },
+ "subtitle": {
+ "width": "550",
+ "paddingRight": "25",
+ "fontSize": "34",
+ "color": "#454545"
+ },
+ "summary": {
+ "width": "680",
+ "marginTop": "-20",
+ "paddingLeft": "30",
+ "paddingRight": "30",
+ "paddingBottom": "30",
+ "fontSize": "28",
+ "color": "#929292",
+ "lines": 3
+ }
+}
+
+/***/ }),
+/* 75 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _utils = __webpack_require__(26);
+
+var modal = weex.requireModule('modal'); //
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+exports.default = {
+ data: function data() {
+ var dict = {
+ REFRESH: { en: 'Release to refresh', zh: '释放刷新' },
+ REFRESHING: { en: 'Fetching ...', zh: '正在加载……' },
+ UPDATED: { en: 'Updated', zh: '已更新' },
+ LOAD_MERE: { en: 'Load more', zh: '加载更多' },
+ NO_MORE_NEWS: { en: 'No more news', zh: '到底了' }
+ };
+ return {
+ language: 'en',
+ navigationBarOptions: {
+ // backgroundColor: '#5F5F5F',
+ title: {
+ zh: '资讯',
+ en: 'News'
+ }
+ },
+ dict: dict,
+ refreshNote: dict.REFRESH,
+ refreshing: false,
+ visibleCount: 6,
+ news: []
+ };
+ },
+
+ computed: {
+ visibleNews: function visibleNews() {
+ return this.news.slice(0, this.visibleCount);
+ }
+ },
+ beforeCreate: function beforeCreate() {
+ var _this = this;
+
+ (0, _utils.fetchNews)(function (res) {
+ if (Array.isArray(res.news)) {
+ _this.news = res.news;
+ }
+ });
+ },
+
+ methods: {
+ refresh: function refresh() {
+ var _this2 = this;
+
+ this.refreshing = true;
+ this.refreshNote = this.dict.REFRESHING;
+ var finish = function finish() {
+ _this2.refreshing = false;
+ setTimeout(function () {
+ _this2.refreshNote = _this2.dict.REFRESH;
+ }, 500);
+ };
+ (0, _utils.fetchNews)(function (res) {
+ if (Array.isArray(res.news)) {
+ if (_this2.news.length === res.news.length) {
+ modal.toast({
+ message: _this2.i18n(_this2.dict.UPDATED)
+ });
+ }
+ _this2.news = res.news;
+ finish();
+ }
+ setTimeout(function () {
+ return finish();
+ }, 5000);
+ });
+ },
+ loadmore: function loadmore() {
+ var step = 4;
+ var currentCount = this.visibleCount;
+ this.visibleCount = Math.min(currentCount + step, this.news.length);
+ modal.toast({
+ message: this.visibleCount > currentCount ? this.i18n(this.dict.LOAD_MERE) : this.i18n(this.dict.NO_MORE_NEWS)
+ });
+ }
+ }
+};
+
+/***/ }),
+/* 76 */
+/***/ (function(module, exports) {
+
+module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;
+ return _c('list', {
+ staticClass: ["list"],
+ attrs: {
+ "loadmoreoffset": "10"
+ },
+ on: {
+ "loadmore": _vm.loadmore
+ }
+ }, [_c('refresh', {
+ staticClass: ["refresh"],
+ attrs: {
+ "display": _vm.refreshing ? 'show' : 'hide'
+ },
+ on: {
+ "refresh": _vm.refresh
+ }
+ }, [_c('text', {
+ staticClass: ["indicator-text"]
+ }, [_vm._v(_vm._s(_vm.i18n(_vm.refreshNote)))])]), _vm._l((_vm.visibleNews), function(item, i) {
+ return _c('cell', {
+ key: i,
+ staticClass: ["cell"],
+ appendAsTree: true,
+ attrs: {
+ "append": "tree"
+ }
+ }, [(item.time) ? _c('div', {
+ staticClass: ["message-time"]
+ }, [_c('text', {
+ staticClass: ["time-text"]
+ }, [_vm._v(_vm._s(_vm.i18n(item.time)))])]) : _vm._e(), (item.type === 'article') ? _c('div', {
+ staticClass: ["message-box"]
+ }, [_c('div', {
+ staticClass: ["article"],
+ on: {
+ "click": function($event) {
+ _vm.jumpTo(item.link)
+ }
+ }
+ }, [_c('image', {
+ staticClass: ["poster"],
+ attrs: {
+ "resize": "cover",
+ "src": item.poster
+ }
+ }), _c('text', {
+ staticClass: ["title"]
+ }, [_vm._v(_vm._s(item.title))]), (item.summary) ? _c('text', {
+ staticClass: ["summary"],
+ attrs: {
+ "lines": 3
+ }
+ }, [_vm._v(_vm._s(item.summary))]) : _vm._e(), _c('div', {
+ staticClass: ["related"]
+ }, _vm._l((item.related), function(sub) {
+ return _c('div', {
+ key: sub.title,
+ staticClass: ["related-article"],
+ on: {
+ "click": function($event) {
+ _vm.jumpTo(sub.link)
+ }
+ }
+ }, [_c('text', {
+ staticClass: ["subtitle"]
+ }, [_vm._v(_vm._s(sub.title))]), _c('image', {
+ staticClass: ["shortcut"],
+ attrs: {
+ "resize": "cover",
+ "src": sub.poster
+ }
+ })])
+ }))])]) : _vm._e()])
+ })], 2)
+},staticRenderFns: []}
+module.exports.render._withStripped = true
+
+/***/ })
+/******/ ]);
\ No newline at end of file
diff --git a/android/playground/src/main/assets/videoplus.js b/android/playground/src/main/assets/videoplus.js
new file mode 100644
index 0000000..69e30af
--- /dev/null
+++ b/android/playground/src/main/assets/videoplus.js
@@ -0,0 +1,298 @@
+// { "framework": "Vue" }
+"use weex:vue";
+
+/******/
+(function(modules) { // webpackBootstrap
+ /******/ // The module cache
+ /******/
+ var installedModules = {};
+ /******/
+ /******/ // The require function
+ /******/
+ function __webpack_require__(moduleId) {
+ /******/
+ /******/ // Check if module is in cache
+ /******/
+ if (installedModules[moduleId]) {
+ /******/
+ return installedModules[moduleId].exports;
+ /******/
+ }
+ /******/ // Create a new module (and put it into the cache)
+ /******/
+ var module = installedModules[moduleId] = {
+ /******/
+ i: moduleId,
+ /******/
+ l: false,
+ /******/
+ exports: {}
+ /******/
+ };
+ /******/
+ /******/ // Execute the module function
+ /******/
+ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+ /******/
+ /******/ // Flag the module as loaded
+ /******/
+ module.l = true;
+ /******/
+ /******/ // Return the exports of the module
+ /******/
+ return module.exports;
+ /******/
+ }
+ /******/
+ /******/
+ /******/ // expose the modules object (__webpack_modules__)
+ /******/
+ __webpack_require__.m = modules;
+ /******/
+ /******/ // expose the module cache
+ /******/
+ __webpack_require__.c = installedModules;
+ /******/
+ /******/ // define getter function for harmony exports
+ /******/
+ __webpack_require__.d = function(exports, name, getter) {
+ /******/
+ if (!__webpack_require__.o(exports, name)) {
+ /******/
+ Object.defineProperty(exports, name, {
+ /******/
+ configurable: false,
+ /******/
+ enumerable: true,
+ /******/
+ get: getter
+ /******/
+ });
+ /******/
+ }
+ /******/
+ };
+ /******/
+ /******/ // getDefaultExport function for compatibility with non-harmony modules
+ /******/
+ __webpack_require__.n = function(module) {
+ /******/
+ var getter = module && module.__esModule ?
+ /******/
+ function getDefault() {
+ return module['default'];
+ } :
+ /******/
+ function getModuleExports() {
+ return module;
+ };
+ /******/
+ __webpack_require__.d(getter, 'a', getter);
+ /******/
+ return getter;
+ /******/
+ };
+ /******/
+ /******/ // Object.prototype.hasOwnProperty.call
+ /******/
+ __webpack_require__.o = function(object, property) {
+ return Object.prototype.hasOwnProperty.call(object, property);
+ };
+ /******/
+ /******/ // __webpack_public_path__
+ /******/
+ __webpack_require__.p = "";
+ /******/
+ /******/ // Load entry module and return exports
+ /******/
+ return __webpack_require__(__webpack_require__.s = 0);
+ /******/
+})
+/************************************************************************/
+/******/
+([
+ /* 0 */
+ /***/
+ (function(module, exports, __webpack_require__) {
+
+ "use strict";
+
+
+ var _App = __webpack_require__(1);
+
+ var _App2 = _interopRequireDefault(_App);
+
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+
+ _App2.default.el = '#root';
+ new Vue(_App2.default);
+
+ /***/
+ }),
+ /* 1 */
+ /***/
+ (function(module, exports, __webpack_require__) {
+
+ var __vue_exports__, __vue_options__
+ var __vue_styles__ = []
+
+ /* styles */
+ __vue_styles__.push(__webpack_require__(2))
+
+ /* script */
+ __vue_exports__ = __webpack_require__(3)
+
+ /* template */
+ var __vue_template__ = __webpack_require__(4)
+ __vue_options__ = __vue_exports__ = __vue_exports__ || {}
+ if (
+ typeof __vue_exports__.default === "object" ||
+ typeof __vue_exports__.default === "function"
+ ) {
+ if (Object.keys(__vue_exports__).some(function(key) {
+ return key !== "default" && key !== "__esModule"
+ })) {
+ console.error("named exports are not supported in *.vue files.")
+ }
+ __vue_options__ = __vue_exports__ = __vue_exports__.default
+ }
+ if (typeof __vue_options__ === "function") {
+ __vue_options__ = __vue_options__.options
+ }
+ __vue_options__.__file = "/usr/src/app/raw/072b3765e21f00b469b67c324c6e3dde/App.vue"
+ __vue_options__.render = __vue_template__.render
+ __vue_options__.staticRenderFns = __vue_template__.staticRenderFns
+ __vue_options__._scopeId = "data-v-f7ea0eb2"
+ __vue_options__.style = __vue_options__.style || {}
+ __vue_styles__.forEach(function(module) {
+ for (var name in module) {
+ __vue_options__.style[name] = module[name]
+ }
+ })
+ if (typeof __register_static_styles__ === "function") {
+ __register_static_styles__(__vue_options__._scopeId, __vue_styles__)
+ }
+
+ module.exports = __vue_exports__
+
+
+ /***/
+ }),
+ /* 2 */
+ /***/
+ (function(module, exports) {
+
+ module.exports = {
+ "video": {
+ "width": "630",
+ "height": "350",
+ "marginTop": "60",
+ "marginLeft": "60",
+ "backgroundColor":"red"
+ },
+ "info": {
+ "marginTop": "40",
+ "fontSize": "40",
+ "textAlign": "center"
+ }
+ }
+
+ /***/
+ }),
+ /* 3 */
+ /***/
+ (function(module, exports, __webpack_require__) {
+
+ "use strict";
+
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+
+ exports.default = {
+ data: function data() {
+ return {
+ state: '----',
+ src: 'http://flv2.bn.netease.com/videolib3/1611/01/XGqSL5981/SD/XGqSL5981-mobile.mp4'
+ };
+ },
+
+ methods: {
+ onstart: function onstart(event) {
+ this.state = 'onstart';
+ },
+ onpause: function onpause(event) {
+ this.state = 'onpause';
+ },
+ onfinish: function onfinish(event) {
+ this.state = 'onfinish';
+ },
+ onfail: function onfail(event) {
+ this.state = 'onfinish';
+ }
+ }
+ };
+
+ /***/
+ }),
+ /* 4 */
+ /***/
+ (function(module, exports) {
+
+ module.exports = {
+ render: function() {
+ var _vm = this;
+ var _h = _vm.$createElement;
+ var _c = _vm._self._c || _h;
+ return _c('div', [_c('videoplus', {
+ staticClass: ["video"],
+ attrs: {
+ "src": _vm.src,
+ "autoplay": "",
+ "controls": ""
+ },
+ on: {
+ "start": _vm.onstart,
+ "pause": _vm.onpause,
+ "finish": _vm.onfinish,
+ "fail": _vm.onfail
+ }
+ }), _c('text', {
+ staticClass: ["info"]
+ }, [_vm._v("state: " + _vm._s(_vm.state))])], 1)
+ },
+ staticRenderFns: []
+ }
+ module.exports.render._withStripped = true
+
+ /***/
+ })
+ /******/
+]);
\ No newline at end of file
diff --git a/android/playground/src/main/assets/weex_config_search.json b/android/playground/src/main/assets/weex_config_search.json
new file mode 100644
index 0000000..1dcd86c
--- /dev/null
+++ b/android/playground/src/main/assets/weex_config_search.json
@@ -0,0 +1,36 @@
+{
+ "modules":[
+ {
+ "name" : "tool",
+ "className":"com.taobao.weex.ui.module.WXModalUIModule",
+ "methods":[
+ "toast",
+ "alert",
+ "confirm",
+ "prompt"
+ ]
+ },
+ {
+ "name" : "toolError",
+ "className":"com.taobao.weex.ui.module.WXModalUIModuleError",
+ "methods":[
+ "toast",
+ "alert"
+ ]
+ }
+ ],
+ "components":[
+ {
+ "name":"diva",
+ "className":"com.taobao.weex.ui.component.WXDiv",
+ "appendTree":false,
+ "methods":[]
+ },
+ {
+ "name":"divnot",
+ "className":"com.taobao.weex.ui.component.WXDivNot",
+ "appendTree":false,
+ "methods":[]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/android/playground/src/main/ic_launcher-web.png b/android/playground/src/main/ic_launcher-web.png
new file mode 100644
index 0000000..bb92223
--- /dev/null
+++ b/android/playground/src/main/ic_launcher-web.png
Binary files differ
diff --git a/android/playground/src/main/java/com/alibaba/weex/BenchmarkActivity.java b/android/playground/src/main/java/com/alibaba/weex/BenchmarkActivity.java
new file mode 100644
index 0000000..8e7db00
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/BenchmarkActivity.java
@@ -0,0 +1,224 @@
+/*
+ * 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;
+
+import android.os.Bundle;
+import android.support.test.espresso.idling.CountingIdlingResource;
+import android.support.v7.app.AppCompatActivity;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
+import android.widget.LinearLayout;
+
+import com.alibaba.weex.commons.adapter.ImageAdapter;
+import com.taobao.weex.IWXRenderListener;
+import com.taobao.weex.InitConfig;
+import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKEngine;
+import com.taobao.weex.WXSDKInstance;
+import com.taobao.weex.common.WXRenderStrategy;
+import com.taobao.weex.utils.WXFileUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class BenchmarkActivity extends AppCompatActivity implements IWXRenderListener {
+
+ public final static String ROOT = "root";
+ private final static String TAG = "WEEX";
+ private final static String URL =
+ "http://h5.m.taobao.com/js/src/weexlist.js";
+ private WXSDKInstance mInstance;
+ private LinearLayout root;
+ private long startTime;
+ private long endTime;
+ private long duration;
+ private boolean perfStart;
+ private boolean perfEnd;
+ private boolean isWeex;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ root = new LinearLayout(this);
+ root.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
+ root.setOrientation(LinearLayout.VERTICAL);
+ root.setContentDescription(ROOT);
+ setContentView(root);
+ root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
+ @Override
+ public void onGlobalLayout() {
+ endTime = System.currentTimeMillis();
+ Log.v(TAG, "End: " + endTime);
+ if (perfStart && (perfEnd||!isWeex)) {
+ perfStart = false;
+ perfEnd = false;
+ duration = (endTime - startTime);
+ Log.v(TAG, "OnGlobalLayoutListener: " + getDuration());
+ }
+ }
+ });
+ WXEnvironment.isPerf = true;
+ WXSDKEngine.addCustomOptions("appName", "WXSample");
+ WXSDKEngine.addCustomOptions("appGroup", "WXApp");
+ WXSDKEngine.initialize(getApplication(),
+ new InitConfig.Builder().setImgAdapter(new ImageAdapter()).build());
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ if (mInstance != null) {
+ mInstance.onActivityStart();
+ }
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ if (mInstance != null) {
+ mInstance.onActivityResume();
+ }
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ if (mInstance != null) {
+ mInstance.onActivityPause();
+ }
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+ if (mInstance != null) {
+ mInstance.onActivityStop();
+ }
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ if (mInstance != null) {
+ mInstance.onActivityDestroy();
+ }
+ }
+
+ @Override
+ public void onViewCreated(WXSDKInstance instance, View view) {
+ if (root != null) {
+ root.removeAllViews();
+ root.addView(view);
+ }
+ }
+
+ @Override
+ public void onRenderSuccess(WXSDKInstance instance, int width, int height) {
+ root.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ perfEnd = true;
+ }
+ }, 1000);
+ }
+
+ @Override
+ public void onRefreshSuccess(WXSDKInstance instance, int width, int height) {
+
+ }
+
+ @Override
+ public void onException(WXSDKInstance instance, String errCode, String msg) {
+
+ }
+
+ public boolean isRenderFinish(){
+ return perfEnd;
+ }
+
+ public WXSDKInstance getWXInstance() {
+ return mInstance;
+ }
+
+ public void loadWeexPage(final boolean weex) {
+ isWeex=weex;
+ perfEnd = false;
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (weex) {
+ if (mInstance != null) {
+ mInstance.destroy();
+ }
+ mInstance = new WXSDKInstance(BenchmarkActivity.this);
+ Map<String, Object> options = new HashMap<>();
+ options.put(WXSDKInstance.BUNDLE_URL, "file://assets/hello_weex.js");
+ mInstance.registerRenderListener(BenchmarkActivity.this);
+ perfStart = true;
+ Log.v(TAG, "Start: " + startTime);
+ startTime = System.currentTimeMillis();
+ mInstance.render(TAG,
+ WXFileUtils.loadAsset("hello.js", BenchmarkActivity.this),
+ options,
+ null,
+ WXRenderStrategy.APPEND_ASYNC);
+ } else {
+ root.removeAllViews();
+ perfStart = true;
+ startTime = System.currentTimeMillis();
+ View.inflate(BenchmarkActivity.this, R.layout.hello_weex, root);
+ }
+ }
+ });
+ }
+
+ public void loadWeexPage() {
+ loadWeexPage(URL);
+ }
+
+ public void loadWeexPage(final String url) {
+ perfEnd = false;
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (mInstance != null) {
+ mInstance.destroy();
+ }
+ mInstance = new WXSDKInstance(BenchmarkActivity.this);
+ Map<String, Object> options = new HashMap<>();
+ options.put(WXSDKInstance.BUNDLE_URL, url);
+ mInstance.registerRenderListener(BenchmarkActivity.this);
+ mInstance.renderByUrl(
+ TAG,
+ url,
+ options,
+ null,
+ WXRenderStrategy.APPEND_ASYNC);
+ }
+ });
+ }
+
+ public long getDuration() {
+ return duration;
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/IndexActivity.java b/android/playground/src/main/java/com/alibaba/weex/IndexActivity.java
new file mode 100644
index 0000000..2f0f971
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/IndexActivity.java
@@ -0,0 +1,199 @@
+/*
+ * 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;
+
+import android.Manifest;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.graphics.PixelFormat;
+import android.os.Bundle;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.ContextCompat;
+import android.support.v4.content.LocalBroadcastManager;
+import android.support.v7.widget.Toolbar;
+import android.text.TextUtils;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.alibaba.weex.commons.AbstractWeexActivity;
+import com.alibaba.weex.update.CheckForUpdateUtil;
+import com.google.zxing.client.android.CaptureActivity;
+import com.taobao.weex.WXSDKEngine;
+import com.taobao.weex.WXSDKInstance;
+import com.taobao.weex.common.WXErrorCode;
+import com.taobao.weex.utils.WXFileUtils;
+import com.taobao.weex.utils.WXSoInstallMgrSdk;
+
+public class IndexActivity extends AbstractWeexActivity {
+
+ private static final String TAG = "IndexActivity";
+ private static final int CAMERA_PERMISSION_REQUEST_CODE = 0x1;
+ private static final int WRITE_EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE = 0x2;
+ private static final String DEFAULT_IP = "your_current_IP";
+ private static String sCurrentIp = DEFAULT_IP; // your_current_IP
+
+ private ProgressBar mProgressBar;
+ private TextView mTipView;
+
+ private BroadcastReceiver mReloadReceiver;
+
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_index);
+ setContainer((ViewGroup) findViewById(R.id.index_container));
+ Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+ setSupportActionBar(toolbar);
+ getWindow().setFormat(PixelFormat.TRANSLUCENT);
+
+ mProgressBar = (ProgressBar) findViewById(R.id.index_progressBar);
+ mTipView = (TextView) findViewById(R.id.index_tip);
+ mProgressBar.setVisibility(View.VISIBLE);
+ mTipView.setVisibility(View.VISIBLE);
+
+
+ if (!WXSoInstallMgrSdk.isCPUSupport()) {
+ mProgressBar.setVisibility(View.INVISIBLE);
+ mTipView.setText(R.string.cpu_not_support_tip);
+ return;
+ }
+
+ if (TextUtils.equals(sCurrentIp, DEFAULT_IP)) {
+ renderPage(WXFileUtils.loadAsset("landing.weex.js", this), getIndexUrl());
+// renderPageByURL("http://dotwe.org/raw/dist/2bbe1860da4669a68595c1aed01d7fd2.bundle.wx");
+ } else {
+ renderPageByURL(getIndexUrl());
+ }
+
+
+ mReloadReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ createWeexInstance();
+ if (TextUtils.equals(sCurrentIp, DEFAULT_IP)) {
+ renderPage(WXFileUtils.loadAsset("landing.weex.js", getApplicationContext()), getIndexUrl());
+ } else {
+ renderPageByURL(getIndexUrl());
+ }
+ mProgressBar.setVisibility(View.VISIBLE);
+ }
+ };
+
+ LocalBroadcastManager.getInstance(this).registerReceiver(mReloadReceiver, new IntentFilter(WXSDKEngine.JS_FRAMEWORK_RELOAD));
+
+ CheckForUpdateUtil.checkForUpdate(this);
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ if (TextUtils.equals(sCurrentIp, DEFAULT_IP)) {
+ getMenuInflater().inflate(R.menu.main_scan, menu);
+ } else {
+ getMenuInflater().inflate(R.menu.main, menu);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.action_refresh:
+ if (!TextUtils.equals(sCurrentIp, DEFAULT_IP)) {
+ createWeexInstance();
+ renderPageByURL(getIndexUrl());
+ mProgressBar.setVisibility(View.VISIBLE);
+ }
+ break;
+ case R.id.action_scan:
+ if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
+ if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
+ Toast.makeText(this, "please give me the permission", Toast.LENGTH_SHORT).show();
+ } else {
+ ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_REQUEST_CODE);
+ }
+ } else {
+ startActivity(new Intent(this, CaptureActivity.class));
+ }
+ break;
+ default:
+ break;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) {
+ if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ startActivity(new Intent(this, CaptureActivity.class));
+ } else {
+ Toast.makeText(this, "request camara permission fail!", Toast.LENGTH_SHORT).show();
+ }
+ } else if (requestCode == WRITE_EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE
+ && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ }
+ }
+
+ @Override
+ public void onRenderSuccess(WXSDKInstance wxsdkInstance, int i, int i1) {
+ super.onRenderSuccess(wxsdkInstance,i,i1);
+ mProgressBar.setVisibility(View.GONE);
+ mTipView.setVisibility(View.GONE);
+ }
+
+ @Override
+ public void onException(WXSDKInstance wxsdkInstance, String s, String s1) {
+ super.onException(wxsdkInstance,s,s1);
+ mProgressBar.setVisibility(View.GONE);
+ mTipView.setVisibility(View.VISIBLE);
+ if (TextUtils.equals(s, WXErrorCode.WX_DEGRAD_ERR_NETWORK_BUNDLE_DOWNLOAD_FAILED.getErrorCode())) {
+ mTipView.setText(R.string.index_tip);
+ } else {
+ mTipView.setText("network render error:" + s1);
+ }
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ LocalBroadcastManager.getInstance(this).unregisterReceiver(mReloadReceiver);
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+// WXSDKManager.getInstance().takeJSHeapSnapshot("/sdcard/weex/");
+ }
+
+ private static String getIndexUrl() {
+ return "http://" + sCurrentIp + ":12580/examples/build/index.js";
+ }
+}
+
diff --git a/android/playground/src/main/java/com/alibaba/weex/SliceTestActivity.java b/android/playground/src/main/java/com/alibaba/weex/SliceTestActivity.java
new file mode 100644
index 0000000..2b4c683
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/SliceTestActivity.java
@@ -0,0 +1,519 @@
+/**
+ * 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;
+
+import android.content.res.AssetFileDescriptor;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.DividerItemDecoration;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.TextView;
+
+import com.alibaba.fastjson.JSONObject;
+import com.taobao.weex.IWXRenderListener;
+import com.taobao.weex.WXSDKEngine;
+import com.taobao.weex.WXSDKInstance;
+import com.taobao.weex.annotation.JSMethod;
+import com.taobao.weex.common.WXException;
+import com.taobao.weex.common.WXModule;
+import com.taobao.weex.common.WXRenderStrategy;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class SliceTestActivity extends AppCompatActivity {
+ private static final String LOG_TAG = "SliceTestActivity";
+ private RecyclerView mRecyclerView;
+ private TextView mReportTextView;
+
+ private final List<String> mData = new ArrayList<>();
+ private WXInstanceAdapter mAdapter;
+ private final Set<WXSDKInstance> mInstances = new HashSet<>();
+
+ public static class SearchModule extends WXModule {
+ @JSMethod(uiThread = true)
+ public void search(JSONObject options) {
+ Log.e("TestModuel", options.toJSONString());
+ }
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ try {
+ WXSDKEngine.registerModule("searchEvent", SearchModule.class);
+ } catch (WXException e) {
+ e.printStackTrace();
+ }
+ setContentView(R.layout.activity_slice_test);
+ mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
+ mReportTextView = (TextView) findViewById(R.id.report_text);
+
+ mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
+ mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
+ mAdapter = new WXInstanceAdapter();
+ mRecyclerView.setAdapter(mAdapter);
+ }
+
+ static int i = 0;
+
+ public void addCellClick(View view) {
+ //rax case.js
+ if (i++ % 2 == 0) {
+ mData.add("{\"model\":{\"tips\":[{\"show\":\"雪纺\",\"q\":\"连衣裙 雪纺\",\"params\":[{\"key\":\"from\",\"value\":\"tips_1\"},{\"key\":\"vClickTrace\",\"value\":\"%7B%22tips_oriq%22%3A%22%E8%BF%9E%E8%A1%A3%E8%A3%99%22%2C%22tips_srppage%22%3A%222%22%2C%22tips_type%22%3A%221%22%2C%22tips_pos%22%3A%221%22%2C%22pre_rn%22%3A%220189c4d06e11f32262fa896f5f364f76%22%7D\"}]},{\"show\":\"中长款\",\"q\":\"连衣裙 中长款\",\"params\":[{\"key\":\"from\",\"value\":\"tips_1\"},{\"key\":\"vClickTrace\",\"value\":\"%7B%22tips_oriq%22%3A%22%E8%BF%9E%E8%A1%A3%E8%A3%99%22%2C%22tips_srppage%22%3A%222%22%2C%22tips_type%22%3A%221%22%2C%22tips_pos%22%3A%222%22%2C%22pre_rn%22%3A%220189c4d06e11f32262fa896f5f364f76%22%7D\"}]},{\"show\":\"假两件\",\"q\":\"连衣裙 假两件\",\"params\":[{\"key\":\"from\",\"value\":\"tips_1\"},{\"key\":\"vClickTrace\",\"value\":\"%7B%22tips_oriq%22%3A%22%E8%BF%9E%E8%A1%A3%E8%A3%99%22%2C%22tips_srppage%22%3A%222%22%2C%22tips_type%22%3A%221%22%2C%22tips_pos%22%3A%223%22%2C%22pre_rn%22%3A%220189c4d06e11f32262fa896f5f364f76%22%7D\"}]},{\"show\":\"A字款\",\"q\":\"连衣裙 A字款\",\"params\":[{\"key\":\"from\",\"value\":\"tips_1\"},{\"key\":\"vClickTrace\",\"value\":\"%7B%22tips_oriq%22%3A%22%E8%BF%9E%E8%A1%A3%E8%A3%99%22%2C%22tips_srppage%22%3A%222%22%2C%22tips_type%22%3A%221%22%2C%22tips_pos%22%3A%224%22%2C%22pre_rn%22%3A%220189c4d06e11f32262fa896f5f364f76%22%7D\"}]},{\"show\":\"气质淑女\",\"q\":\"连衣裙 气质淑女\",\"params\":[{\"key\":\"from\",\"value\":\"tips_1\"},{\"key\":\"vClickTrace\",\"value\":\"%7B%22tips_oriq%22%3A%22%E8%BF%9E%E8%A1%A3%E8%A3%99%22%2C%22tips_srppage%22%3A%222%22%2C%22tips_type%22%3A%221%22%2C%22tips_pos%22%3A%225%22%2C%22pre_rn%22%3A%220189c4d06e11f32262fa896f5f364f76%22%7D\"}]}],\"pos\":\"3\",\"src\":\"graph\",\"topic\":\"细选"+i+"\",\"type\":\"1\",\"tItemType\":\"wx_text\",\"tShowTmpl\":\"wx_text\",\"rl\":\"query_type-1|tip_show_type-1|tip_show_page-2\"},\"status\":{\"layoutStyle\":0}}");
+ } else {
+ mData.add("{\"model\":{\"tips\":[{\"show\":\"雪纺\",\"q\":\"连衣裙 雪纺\",\"params\":[{\"key\":\"from\",\"value\":\"tips_1\"},{\"key\":\"vClickTrace\",\"value\":\"%7B%22tips_oriq%22%3A%22%E8%BF%9E%E8%A1%A3%E8%A3%99%22%2C%22tips_srppage%22%3A%222%22%2C%22tips_type%22%3A%221%22%2C%22tips_pos%22%3A%221%22%2C%22pre_rn%22%3A%220189c4d06e11f32262fa896f5f364f76%22%7D\"}]},{\"show\":\"中长款\",\"q\":\"连衣裙 中长款\",\"params\":[{\"key\":\"from\",\"value\":\"tips_1\"},{\"key\":\"vClickTrace\",\"value\":\"%7B%22tips_oriq%22%3A%22%E8%BF%9E%E8%A1%A3%E8%A3%99%22%2C%22tips_srppage%22%3A%222%22%2C%22tips_type%22%3A%221%22%2C%22tips_pos%22%3A%222%22%2C%22pre_rn%22%3A%220189c4d06e11f32262fa896f5f364f76%22%7D\"}]},{\"show\":\"假两件\",\"q\":\"连衣裙 假两件\",\"params\":[{\"key\":\"from\",\"value\":\"tips_1\"},{\"key\":\"vClickTrace\",\"value\":\"%7B%22tips_oriq%22%3A%22%E8%BF%9E%E8%A1%A3%E8%A3%99%22%2C%22tips_srppage%22%3A%222%22%2C%22tips_type%22%3A%221%22%2C%22tips_pos%22%3A%223%22%2C%22pre_rn%22%3A%220189c4d06e11f32262fa896f5f364f76%22%7D\"}]},{\"show\":\"A字款\",\"q\":\"连衣裙 A字款\",\"params\":[{\"key\":\"from\",\"value\":\"tips_1\"},{\"key\":\"vClickTrace\",\"value\":\"%7B%22tips_oriq%22%3A%22%E8%BF%9E%E8%A1%A3%E8%A3%99%22%2C%22tips_srppage%22%3A%222%22%2C%22tips_type%22%3A%221%22%2C%22tips_pos%22%3A%224%22%2C%22pre_rn%22%3A%220189c4d06e11f32262fa896f5f364f76%22%7D\"}]},{\"show\":\"气质淑女\",\"q\":\"连衣裙 气质淑女\",\"params\":[{\"key\":\"from\",\"value\":\"tips_1\"},{\"key\":\"vClickTrace\",\"value\":\"%7B%22tips_oriq%22%3A%22%E8%BF%9E%E8%A1%A3%E8%A3%99%22%2C%22tips_srppage%22%3A%222%22%2C%22tips_type%22%3A%221%22%2C%22tips_pos%22%3A%225%22%2C%22pre_rn%22%3A%220189c4d06e11f32262fa896f5f364f76%22%7D\"}]}],\"pos\":\"3\",\"src\":\"graph\",\"topic\":\"细选"+i+"\",\"type\":\"1\",\"tItemType\":\"wx_text\",\"tShowTmpl\":\"wx_text\",\"rl\":\"query_type-1|tip_show_type-1|tip_show_page-2\"},\"status\":{\"layoutStyle\":1}}");
+ }
+
+ //card.wasm
+ if (false) {
+ if (i++ % 2 == 0) {
+ mData.add("{\n" +
+ " \"model\": {\n" +
+ " \"src\": \"tmall_rec\",\n" +
+ " \"pos\": 3,\n" +
+ " \"topic\": \"你可能想看"+i+"\",\n" +
+ " \"type\": \"tmall_rec\",\n" +
+ " \"tShowTmpl\": \"wx_tmall_discovery\",\n" +
+ " \"tItemType\": \"wx_tmall_discovery\",\n" +
+ " \"tips\": [\n" +
+ " {\n" +
+ " \"picUrl\": \"https://img.alicdn.com/imgextra/i1/2985924572/TB2EL5XnDnI8KJjy0FfXXcdoVXa_!!2985924572.jpg\",\n" +
+ " \"show\": \"职场范儿\",\n" +
+ " \"params\": [\n" +
+ " {\n" +
+ " \"value\": \"tmall_rec\",\n" +
+ " \"key\": \"from\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"%7B%22tips_oriq%22%3A%22%E7%BE%BD%E7%BB%92%E6%9C%8D%22%2C%22tips_srppage%22%3A%221%22%2C%22tips_type%22%3A%22mall1%22%2C%22tips_pos%22%3A%220%22%2C%22pre_rn%22%3A%22767d9f52662b4883b2dfcff69f12edce%22%7D\",\n" +
+ " \"key\": \"vClickTrace\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"1001\",\n" +
+ " \"key\": \"tag_id\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"767d9f52662b4883b2dfcff69f12edce\",\n" +
+ " \"key\": \"sessionid\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"tmallRecCard\",\n" +
+ " \"key\": \"m\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"羽绒服\",\n" +
+ " \"key\": \"q\"\n" +
+ " }\n" +
+ " ]\n" +
+ " },\n" +
+ " {\n" +
+ " \"picUrl\": \"https://img.alicdn.com/tfs/TB1.3ctnvDH8KJjy1XcXXcpdXXa-1125-390.png\",\n" +
+ " \"show\": \"国际大牌\",\n" +
+ " \"params\": [\n" +
+ " {\n" +
+ " \"value\": \"tmall_rec\",\n" +
+ " \"key\": \"from\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"%7B%22tips_oriq%22%3A%22%E7%BE%BD%E7%BB%92%E6%9C%8D%22%2C%22tips_srppage%22%3A%221%22%2C%22tips_type%22%3A%22mall1%22%2C%22tips_pos%22%3A%221%22%2C%22pre_rn%22%3A%22767d9f52662b4883b2dfcff69f12edce%22%7D\",\n" +
+ " \"key\": \"vClickTrace\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"1007\",\n" +
+ " \"key\": \"tag_id\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"767d9f52662b4883b2dfcff69f12edce\",\n" +
+ " \"key\": \"sessionid\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"tmallRecCard\",\n" +
+ " \"key\": \"m\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"羽绒服\",\n" +
+ " \"key\": \"q\"\n" +
+ " }\n" +
+ " ]\n" +
+ " },\n" +
+ " {\n" +
+ " \"picUrl\": \"https://img.alicdn.com/imgextra/i2/263817957/TB2STDSnwLD8KJjSszeXXaGRpXa-263817957.jpg\",\n" +
+ " \"show\": \"优雅淑女\",\n" +
+ " \"params\": [\n" +
+ " {\n" +
+ " \"value\": \"tmall_rec\",\n" +
+ " \"key\": \"from\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"%7B%22tips_oriq%22%3A%22%E7%BE%BD%E7%BB%92%E6%9C%8D%22%2C%22tips_srppage%22%3A%221%22%2C%22tips_type%22%3A%22mall1%22%2C%22tips_pos%22%3A%222%22%2C%22pre_rn%22%3A%22767d9f52662b4883b2dfcff69f12edce%22%7D\",\n" +
+ " \"key\": \"vClickTrace\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"1002\",\n" +
+ " \"key\": \"tag_id\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"767d9f52662b4883b2dfcff69f12edce\",\n" +
+ " \"key\": \"sessionid\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"tmallRecCard\",\n" +
+ " \"key\": \"m\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"羽绒服\",\n" +
+ " \"key\": \"q\"\n" +
+ " }\n" +
+ " ]\n" +
+ " },\n" +
+ " {\n" +
+ " \"picUrl\": \"https://img.alicdn.com/imgextra/i2/263817957/TB2_JnCnBHH8KJjy0FbXXcqlpXa-263817957.jpg\",\n" +
+ " \"show\": \"活力少女\",\n" +
+ " \"params\": [\n" +
+ " {\n" +
+ " \"value\": \"tmall_rec\",\n" +
+ " \"key\": \"from\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"%7B%22tips_oriq%22%3A%22%E7%BE%BD%E7%BB%92%E6%9C%8D%22%2C%22tips_srppage%22%3A%221%22%2C%22tips_type%22%3A%22mall1%22%2C%22tips_pos%22%3A%223%22%2C%22pre_rn%22%3A%22767d9f52662b4883b2dfcff69f12edce%22%7D\",\n" +
+ " \"key\": \"vClickTrace\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"1005\",\n" +
+ " \"key\": \"tag_id\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"767d9f52662b4883b2dfcff69f12edce\",\n" +
+ " \"key\": \"sessionid\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"tmallRecCard\",\n" +
+ " \"key\": \"m\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"羽绒服\",\n" +
+ " \"key\": \"q\"\n" +
+ " }\n" +
+ " ]\n" +
+ " }\n" +
+ " ]\n" +
+ " },\n" +
+ " \"status\": {\n" +
+ " \"layoutStyle\": 0\n" +
+ " }\n" +
+ " }");
+ } else {
+ mData.add("{\n" +
+ " \"model\": {\n" +
+ " \"src\": \"tmall_rec\",\n" +
+ " \"pos\": 3,\n" +
+ " \"topic\": \"你可能不想看\",\n" +
+ " \"type\": \"tmall_rec\",\n" +
+ " \"tShowTmpl\": \"wx_tmall_discovery\",\n" +
+ " \"tItemType\": \"wx_tmall_discovery\",\n" +
+ " \"tips\": [\n" +
+ " {\n" +
+ " \"picUrl\": \"https://img.alicdn.com/imgextra/i1/2985924572/TB2EL5XnDnI8KJjy0FfXXcdoVXa_!!2985924572.jpg\",\n" +
+ " \"show\": \"职场范儿\",\n" +
+ " \"params\": [\n" +
+ " {\n" +
+ " \"value\": \"tmall_rec\",\n" +
+ " \"key\": \"from\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"%7B%22tips_oriq%22%3A%22%E7%BE%BD%E7%BB%92%E6%9C%8D%22%2C%22tips_srppage%22%3A%221%22%2C%22tips_type%22%3A%22mall1%22%2C%22tips_pos%22%3A%220%22%2C%22pre_rn%22%3A%22767d9f52662b4883b2dfcff69f12edce%22%7D\",\n" +
+ " \"key\": \"vClickTrace\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"1001\",\n" +
+ " \"key\": \"tag_id\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"767d9f52662b4883b2dfcff69f12edce\",\n" +
+ " \"key\": \"sessionid\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"tmallRecCard\",\n" +
+ " \"key\": \"m\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"羽绒服\",\n" +
+ " \"key\": \"q\"\n" +
+ " }\n" +
+ " ]\n" +
+ " },\n" +
+ " {\n" +
+ " \"picUrl\": \"https://img.alicdn.com/tfs/TB1.3ctnvDH8KJjy1XcXXcpdXXa-1125-390.png\",\n" +
+ " \"show\": \"国际大牌\",\n" +
+ " \"params\": [\n" +
+ " {\n" +
+ " \"value\": \"tmall_rec\",\n" +
+ " \"key\": \"from\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"%7B%22tips_oriq%22%3A%22%E7%BE%BD%E7%BB%92%E6%9C%8D%22%2C%22tips_srppage%22%3A%221%22%2C%22tips_type%22%3A%22mall1%22%2C%22tips_pos%22%3A%221%22%2C%22pre_rn%22%3A%22767d9f52662b4883b2dfcff69f12edce%22%7D\",\n" +
+ " \"key\": \"vClickTrace\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"1007\",\n" +
+ " \"key\": \"tag_id\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"767d9f52662b4883b2dfcff69f12edce\",\n" +
+ " \"key\": \"sessionid\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"tmallRecCard\",\n" +
+ " \"key\": \"m\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"羽绒服\",\n" +
+ " \"key\": \"q\"\n" +
+ " }\n" +
+ " ]\n" +
+ " },\n" +
+ " {\n" +
+ " \"picUrl\": \"https://img.alicdn.com/imgextra/i2/263817957/TB2STDSnwLD8KJjSszeXXaGRpXa-263817957.jpg\",\n" +
+ " \"show\": \"优雅淑女\",\n" +
+ " \"params\": [\n" +
+ " {\n" +
+ " \"value\": \"tmall_rec\",\n" +
+ " \"key\": \"from\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"%7B%22tips_oriq%22%3A%22%E7%BE%BD%E7%BB%92%E6%9C%8D%22%2C%22tips_srppage%22%3A%221%22%2C%22tips_type%22%3A%22mall1%22%2C%22tips_pos%22%3A%222%22%2C%22pre_rn%22%3A%22767d9f52662b4883b2dfcff69f12edce%22%7D\",\n" +
+ " \"key\": \"vClickTrace\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"1002\",\n" +
+ " \"key\": \"tag_id\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"767d9f52662b4883b2dfcff69f12edce\",\n" +
+ " \"key\": \"sessionid\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"tmallRecCard\",\n" +
+ " \"key\": \"m\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"羽绒服\",\n" +
+ " \"key\": \"q\"\n" +
+ " }\n" +
+ " ]\n" +
+ " },\n" +
+ " {\n" +
+ " \"picUrl\": \"https://img.alicdn.com/imgextra/i2/263817957/TB2_JnCnBHH8KJjy0FbXXcqlpXa-263817957.jpg\",\n" +
+ " \"show\": \"活力少女\",\n" +
+ " \"params\": [\n" +
+ " {\n" +
+ " \"value\": \"tmall_rec\",\n" +
+ " \"key\": \"from\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"%7B%22tips_oriq%22%3A%22%E7%BE%BD%E7%BB%92%E6%9C%8D%22%2C%22tips_srppage%22%3A%221%22%2C%22tips_type%22%3A%22mall1%22%2C%22tips_pos%22%3A%223%22%2C%22pre_rn%22%3A%22767d9f52662b4883b2dfcff69f12edce%22%7D\",\n" +
+ " \"key\": \"vClickTrace\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"1005\",\n" +
+ " \"key\": \"tag_id\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"767d9f52662b4883b2dfcff69f12edce\",\n" +
+ " \"key\": \"sessionid\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"tmallRecCard\",\n" +
+ " \"key\": \"m\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"value\": \"羽绒服\",\n" +
+ " \"key\": \"q\"\n" +
+ " }\n" +
+ " ]\n" +
+ " }\n" +
+ " ]\n" +
+ " },\n" +
+ " \"status\": {\n" +
+ " \"layoutStyle\": 1\n" +
+ " }\n" +
+ " }");
+ }
+ }
+ mAdapter.notifyItemInserted(mData.size() - 1);
+// mAdapter.notifyDataSetChanged();
+ }
+
+ private class WXInstanceAdapter extends RecyclerView.Adapter<WXViewHolder> {
+ @Override
+ public WXViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ Log.d(LOG_TAG, "onCreateViewHolder");
+ FrameLayout itemView = new FrameLayout(SliceTestActivity.this);
+ itemView.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
+ return new WXViewHolder(itemView);
+ }
+
+ @Override
+ public void onBindViewHolder(WXViewHolder holder, int position) {
+ String data = mData.get(position);
+ if (!holder.isRendered()) {
+ Log.d(LOG_TAG, "render onBindViewHolder " + position);
+ holder.render(data, position);
+ } else {
+ Log.d(LOG_TAG, "refresh onBindViewHolder " + position);
+ holder.refresh(data, position);
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ return mData.size();
+ }
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ for (WXSDKInstance instance : mInstances) {
+ instance.destroy();
+ }
+ mInstances.clear();
+ }
+
+ private class WXViewHolder extends RecyclerView.ViewHolder implements IWXRenderListener {
+ private WXSDKInstance mInstance;
+ private boolean mRendered;
+
+ private TextView mTextView;
+
+ public WXViewHolder(View itemView) {
+ super(itemView);
+ mInstance = new WXSDKInstance(SliceTestActivity.this);
+ mInstance.registerRenderListener(this);
+ mInstances.add(mInstance);
+ mTextView = new TextView(SliceTestActivity.this);
+ FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+ params.gravity = Gravity.RIGHT;
+ ((ViewGroup) itemView).addView(mTextView, params);
+ }
+
+ public void render(String initData, int position) {
+//
+ if (true) {
+
+ mInstance.render(
+ "testPage",
+ loadAssets(),
+ null,
+ initData,
+ WXRenderStrategy.DATA_RENDER
+ );
+ } else {
+//
+ mInstance.render(
+ "testPage",
+ loadBytes(),
+ null,
+ initData
+ );
+ }
+ mTextView.setText(String.valueOf(position));
+ mRendered = true;
+ }
+
+ public boolean isRendered() {
+ return mRendered;
+ }
+
+ public void refresh(String initData, int position) {
+ mInstance.refreshInstance(initData);
+ mTextView.setText(String.valueOf(position));
+ }
+
+ @Override
+ public void onViewCreated(WXSDKInstance instance, View view) {
+ ((ViewGroup) itemView).addView(view, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+ }
+
+ @Override
+ public void onRenderSuccess(WXSDKInstance instance, int width, int height) {
+ }
+
+ @Override
+ public void onRefreshSuccess(WXSDKInstance instance, int width, int height) {
+
+ }
+
+ @Override
+ public void onException(WXSDKInstance instance, String errCode, String msg) {
+
+ }
+ }
+
+ @NonNull
+ private String loadAssets() {
+ StringBuilder buf = new StringBuilder();
+ try {
+ InputStream json = getAssets().open("lite_template/case.js");
+ BufferedReader in =
+ new BufferedReader(new InputStreamReader(json, "UTF-8"));
+ String str;
+
+ while ((str = in.readLine()) != null) {
+ buf.append(str);
+ }
+
+ in.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ return buf.toString();
+ }
+
+ private byte[] loadBytes() {
+ try {
+ AssetFileDescriptor assetFileDescriptor = getAssets().openFd("lite_template/card.wasm");
+ long len = assetFileDescriptor.getDeclaredLength();
+ ByteBuffer buf = ByteBuffer.allocate((int) len);
+ InputStream json = assetFileDescriptor.createInputStream();
+ json.read(buf.array());
+ json.close();
+ return buf.array();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/SplashActivity.java b/android/playground/src/main/java/com/alibaba/weex/SplashActivity.java
new file mode 100644
index 0000000..0b56571
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/SplashActivity.java
@@ -0,0 +1,64 @@
+/*
+ * 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;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.view.View;
+import android.view.animation.Animation;
+import android.view.animation.AnimationSet;
+import android.view.animation.RotateAnimation;
+import android.view.animation.ScaleAnimation;
+
+public class SplashActivity extends AppCompatActivity {
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_splash);
+
+ View textView = findViewById(R.id.fullscreen_content);
+ ScaleAnimation scaleAnimation = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
+ RotateAnimation rotateAnimation = new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
+
+ AnimationSet animationSet = new AnimationSet(false);
+ animationSet.addAnimation(scaleAnimation);
+ animationSet.addAnimation(rotateAnimation);
+ animationSet.setDuration(1500);
+
+ animationSet.setAnimationListener(new Animation.AnimationListener() {
+ @Override
+ public void onAnimationStart(Animation animation) {
+ }
+
+ @Override
+ public void onAnimationEnd(Animation animation) {
+ startActivity(new Intent(SplashActivity.this, IndexActivity.class));
+ finish();
+ }
+
+ @Override
+ public void onAnimationRepeat(Animation animation) {
+ }
+ });
+ textView.startAnimation(animationSet);
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/Utility.java b/android/playground/src/main/java/com/alibaba/weex/Utility.java
new file mode 100644
index 0000000..7c07a45
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/Utility.java
@@ -0,0 +1,91 @@
+/*
+ * 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;
+
+import android.util.Pair;
+
+import java.util.Map;
+
+/**
+ * Created by sospartan on 28/03/2017.
+ */
+
+public class Utility {
+ private static final int[] ID_STUBS = {
+ R.id.weex_id_4999,R.id.weex_id_4998,R.id.weex_id_4997,R.id.weex_id_4996,R.id.weex_id_4995,R.id.weex_id_4994,R.id.weex_id_4993,R.id.weex_id_4992,R.id.weex_id_4991,R.id.weex_id_4990,R.id.weex_id_4989,R.id.weex_id_4988,R.id.weex_id_4987,R.id.weex_id_4986,R.id.weex_id_4985,R.id.weex_id_4984,R.id.weex_id_4983,R.id.weex_id_4982,R.id.weex_id_4981,R.id.weex_id_4980,R.id.weex_id_4979,R.id.weex_id_4978,R.id.weex_id_4977,R.id.weex_id_4976,R.id.weex_id_4975,R.id.weex_id_4974,R.id.weex_id_4973,R.id.weex_id_4972,R.id.weex_id_4971,R.id.weex_id_4970,R.id.weex_id_4969,R.id.weex_id_4968,R.id.weex_id_4967,R.id.weex_id_4966,R.id.weex_id_4965,R.id.weex_id_4964,R.id.weex_id_4963,R.id.weex_id_4962,R.id.weex_id_4961,R.id.weex_id_4960,R.id.weex_id_4959,R.id.weex_id_4958,R.id.weex_id_4957,R.id.weex_id_4956,R.id.weex_id_4955,R.id.weex_id_4954,R.id.weex_id_4953,R.id.weex_id_4952,R.id.weex_id_4951,R.id.weex_id_4950,R.id.weex_id_4949,R.id.weex_id_4948,R.id.weex_id_4947,R.id.weex_id_4946,R.id.weex_id_4945,R.id.weex_id_4944,R.id.weex_id_4943,R.id.weex_id_4942,R.id.weex_id_4941,R.id.weex_id_4940,R.id.weex_id_4939,R.id.weex_id_4938,R.id.weex_id_4937,R.id.weex_id_4936,R.id.weex_id_4935,R.id.weex_id_4934,R.id.weex_id_4933,R.id.weex_id_4932,R.id.weex_id_4931,R.id.weex_id_4930,R.id.weex_id_4929,R.id.weex_id_4928,R.id.weex_id_4927,R.id.weex_id_4926,R.id.weex_id_4925,R.id.weex_id_4924,R.id.weex_id_4923,R.id.weex_id_4922,R.id.weex_id_4921,R.id.weex_id_4920,R.id.weex_id_4919,R.id.weex_id_4918,R.id.weex_id_4917,R.id.weex_id_4916,R.id.weex_id_4915,R.id.weex_id_4914,R.id.weex_id_4913,R.id.weex_id_4912,R.id.weex_id_4911,R.id.weex_id_4910,R.id.weex_id_4909,R.id.weex_id_4908,R.id.weex_id_4907,R.id.weex_id_4906,R.id.weex_id_4905,R.id.weex_id_4904,R.id.weex_id_4903,R.id.weex_id_4902,R.id.weex_id_4901,R.id.weex_id_4900,
+ R.id.weex_id_4899,R.id.weex_id_4898,R.id.weex_id_4897,R.id.weex_id_4896,R.id.weex_id_4895,R.id.weex_id_4894,R.id.weex_id_4893,R.id.weex_id_4892,R.id.weex_id_4891,R.id.weex_id_4890,R.id.weex_id_4889,R.id.weex_id_4888,R.id.weex_id_4887,R.id.weex_id_4886,R.id.weex_id_4885,R.id.weex_id_4884,R.id.weex_id_4883,R.id.weex_id_4882,R.id.weex_id_4881,R.id.weex_id_4880,R.id.weex_id_4879,R.id.weex_id_4878,R.id.weex_id_4877,R.id.weex_id_4876,R.id.weex_id_4875,R.id.weex_id_4874,R.id.weex_id_4873,R.id.weex_id_4872,R.id.weex_id_4871,R.id.weex_id_4870,R.id.weex_id_4869,R.id.weex_id_4868,R.id.weex_id_4867,R.id.weex_id_4866,R.id.weex_id_4865,R.id.weex_id_4864,R.id.weex_id_4863,R.id.weex_id_4862,R.id.weex_id_4861,R.id.weex_id_4860,R.id.weex_id_4859,R.id.weex_id_4858,R.id.weex_id_4857,R.id.weex_id_4856,R.id.weex_id_4855,R.id.weex_id_4854,R.id.weex_id_4853,R.id.weex_id_4852,R.id.weex_id_4851,R.id.weex_id_4850,R.id.weex_id_4849,R.id.weex_id_4848,R.id.weex_id_4847,R.id.weex_id_4846,R.id.weex_id_4845,R.id.weex_id_4844,R.id.weex_id_4843,R.id.weex_id_4842,R.id.weex_id_4841,R.id.weex_id_4840,R.id.weex_id_4839,R.id.weex_id_4838,R.id.weex_id_4837,R.id.weex_id_4836,R.id.weex_id_4835,R.id.weex_id_4834,R.id.weex_id_4833,R.id.weex_id_4832,R.id.weex_id_4831,R.id.weex_id_4830,R.id.weex_id_4829,R.id.weex_id_4828,R.id.weex_id_4827,R.id.weex_id_4826,R.id.weex_id_4825,R.id.weex_id_4824,R.id.weex_id_4823,R.id.weex_id_4822,R.id.weex_id_4821,R.id.weex_id_4820,R.id.weex_id_4819,R.id.weex_id_4818,R.id.weex_id_4817,R.id.weex_id_4816,R.id.weex_id_4815,R.id.weex_id_4814,R.id.weex_id_4813,R.id.weex_id_4812,R.id.weex_id_4811,R.id.weex_id_4810,R.id.weex_id_4809,R.id.weex_id_4808,R.id.weex_id_4807,R.id.weex_id_4806,R.id.weex_id_4805,R.id.weex_id_4804,R.id.weex_id_4803,R.id.weex_id_4802,R.id.weex_id_4801,R.id.weex_id_4800,
+ R.id.weex_id_4799,R.id.weex_id_4798,R.id.weex_id_4797,R.id.weex_id_4796,R.id.weex_id_4795,R.id.weex_id_4794,R.id.weex_id_4793,R.id.weex_id_4792,R.id.weex_id_4791,R.id.weex_id_4790,R.id.weex_id_4789,R.id.weex_id_4788,R.id.weex_id_4787,R.id.weex_id_4786,R.id.weex_id_4785,R.id.weex_id_4784,R.id.weex_id_4783,R.id.weex_id_4782,R.id.weex_id_4781,R.id.weex_id_4780,R.id.weex_id_4779,R.id.weex_id_4778,R.id.weex_id_4777,R.id.weex_id_4776,R.id.weex_id_4775,R.id.weex_id_4774,R.id.weex_id_4773,R.id.weex_id_4772,R.id.weex_id_4771,R.id.weex_id_4770,R.id.weex_id_4769,R.id.weex_id_4768,R.id.weex_id_4767,R.id.weex_id_4766,R.id.weex_id_4765,R.id.weex_id_4764,R.id.weex_id_4763,R.id.weex_id_4762,R.id.weex_id_4761,R.id.weex_id_4760,R.id.weex_id_4759,R.id.weex_id_4758,R.id.weex_id_4757,R.id.weex_id_4756,R.id.weex_id_4755,R.id.weex_id_4754,R.id.weex_id_4753,R.id.weex_id_4752,R.id.weex_id_4751,R.id.weex_id_4750,R.id.weex_id_4749,R.id.weex_id_4748,R.id.weex_id_4747,R.id.weex_id_4746,R.id.weex_id_4745,R.id.weex_id_4744,R.id.weex_id_4743,R.id.weex_id_4742,R.id.weex_id_4741,R.id.weex_id_4740,R.id.weex_id_4739,R.id.weex_id_4738,R.id.weex_id_4737,R.id.weex_id_4736,R.id.weex_id_4735,R.id.weex_id_4734,R.id.weex_id_4733,R.id.weex_id_4732,R.id.weex_id_4731,R.id.weex_id_4730,R.id.weex_id_4729,R.id.weex_id_4728,R.id.weex_id_4727,R.id.weex_id_4726,R.id.weex_id_4725,R.id.weex_id_4724,R.id.weex_id_4723,R.id.weex_id_4722,R.id.weex_id_4721,R.id.weex_id_4720,R.id.weex_id_4719,R.id.weex_id_4718,R.id.weex_id_4717,R.id.weex_id_4716,R.id.weex_id_4715,R.id.weex_id_4714,R.id.weex_id_4713,R.id.weex_id_4712,R.id.weex_id_4711,R.id.weex_id_4710,R.id.weex_id_4709,R.id.weex_id_4708,R.id.weex_id_4707,R.id.weex_id_4706,R.id.weex_id_4705,R.id.weex_id_4704,R.id.weex_id_4703,R.id.weex_id_4702,R.id.weex_id_4701,R.id.weex_id_4700,
+ R.id.weex_id_4699,R.id.weex_id_4698,R.id.weex_id_4697,R.id.weex_id_4696,R.id.weex_id_4695,R.id.weex_id_4694,R.id.weex_id_4693,R.id.weex_id_4692,R.id.weex_id_4691,R.id.weex_id_4690,R.id.weex_id_4689,R.id.weex_id_4688,R.id.weex_id_4687,R.id.weex_id_4686,R.id.weex_id_4685,R.id.weex_id_4684,R.id.weex_id_4683,R.id.weex_id_4682,R.id.weex_id_4681,R.id.weex_id_4680,R.id.weex_id_4679,R.id.weex_id_4678,R.id.weex_id_4677,R.id.weex_id_4676,R.id.weex_id_4675,R.id.weex_id_4674,R.id.weex_id_4673,R.id.weex_id_4672,R.id.weex_id_4671,R.id.weex_id_4670,R.id.weex_id_4669,R.id.weex_id_4668,R.id.weex_id_4667,R.id.weex_id_4666,R.id.weex_id_4665,R.id.weex_id_4664,R.id.weex_id_4663,R.id.weex_id_4662,R.id.weex_id_4661,R.id.weex_id_4660,R.id.weex_id_4659,R.id.weex_id_4658,R.id.weex_id_4657,R.id.weex_id_4656,R.id.weex_id_4655,R.id.weex_id_4654,R.id.weex_id_4653,R.id.weex_id_4652,R.id.weex_id_4651,R.id.weex_id_4650,R.id.weex_id_4649,R.id.weex_id_4648,R.id.weex_id_4647,R.id.weex_id_4646,R.id.weex_id_4645,R.id.weex_id_4644,R.id.weex_id_4643,R.id.weex_id_4642,R.id.weex_id_4641,R.id.weex_id_4640,R.id.weex_id_4639,R.id.weex_id_4638,R.id.weex_id_4637,R.id.weex_id_4636,R.id.weex_id_4635,R.id.weex_id_4634,R.id.weex_id_4633,R.id.weex_id_4632,R.id.weex_id_4631,R.id.weex_id_4630,R.id.weex_id_4629,R.id.weex_id_4628,R.id.weex_id_4627,R.id.weex_id_4626,R.id.weex_id_4625,R.id.weex_id_4624,R.id.weex_id_4623,R.id.weex_id_4622,R.id.weex_id_4621,R.id.weex_id_4620,R.id.weex_id_4619,R.id.weex_id_4618,R.id.weex_id_4617,R.id.weex_id_4616,R.id.weex_id_4615,R.id.weex_id_4614,R.id.weex_id_4613,R.id.weex_id_4612,R.id.weex_id_4611,R.id.weex_id_4610,R.id.weex_id_4609,R.id.weex_id_4608,R.id.weex_id_4607,R.id.weex_id_4606,R.id.weex_id_4605,R.id.weex_id_4604,R.id.weex_id_4603,R.id.weex_id_4602,R.id.weex_id_4601,R.id.weex_id_4600,
+ R.id.weex_id_4599,R.id.weex_id_4598,R.id.weex_id_4597,R.id.weex_id_4596,R.id.weex_id_4595,R.id.weex_id_4594,R.id.weex_id_4593,R.id.weex_id_4592,R.id.weex_id_4591,R.id.weex_id_4590,R.id.weex_id_4589,R.id.weex_id_4588,R.id.weex_id_4587,R.id.weex_id_4586,R.id.weex_id_4585,R.id.weex_id_4584,R.id.weex_id_4583,R.id.weex_id_4582,R.id.weex_id_4581,R.id.weex_id_4580,R.id.weex_id_4579,R.id.weex_id_4578,R.id.weex_id_4577,R.id.weex_id_4576,R.id.weex_id_4575,R.id.weex_id_4574,R.id.weex_id_4573,R.id.weex_id_4572,R.id.weex_id_4571,R.id.weex_id_4570,R.id.weex_id_4569,R.id.weex_id_4568,R.id.weex_id_4567,R.id.weex_id_4566,R.id.weex_id_4565,R.id.weex_id_4564,R.id.weex_id_4563,R.id.weex_id_4562,R.id.weex_id_4561,R.id.weex_id_4560,R.id.weex_id_4559,R.id.weex_id_4558,R.id.weex_id_4557,R.id.weex_id_4556,R.id.weex_id_4555,R.id.weex_id_4554,R.id.weex_id_4553,R.id.weex_id_4552,R.id.weex_id_4551,R.id.weex_id_4550,R.id.weex_id_4549,R.id.weex_id_4548,R.id.weex_id_4547,R.id.weex_id_4546,R.id.weex_id_4545,R.id.weex_id_4544,R.id.weex_id_4543,R.id.weex_id_4542,R.id.weex_id_4541,R.id.weex_id_4540,R.id.weex_id_4539,R.id.weex_id_4538,R.id.weex_id_4537,R.id.weex_id_4536,R.id.weex_id_4535,R.id.weex_id_4534,R.id.weex_id_4533,R.id.weex_id_4532,R.id.weex_id_4531,R.id.weex_id_4530,R.id.weex_id_4529,R.id.weex_id_4528,R.id.weex_id_4527,R.id.weex_id_4526,R.id.weex_id_4525,R.id.weex_id_4524,R.id.weex_id_4523,R.id.weex_id_4522,R.id.weex_id_4521,R.id.weex_id_4520,R.id.weex_id_4519,R.id.weex_id_4518,R.id.weex_id_4517,R.id.weex_id_4516,R.id.weex_id_4515,R.id.weex_id_4514,R.id.weex_id_4513,R.id.weex_id_4512,R.id.weex_id_4511,R.id.weex_id_4510,R.id.weex_id_4509,R.id.weex_id_4508,R.id.weex_id_4507,R.id.weex_id_4506,R.id.weex_id_4505,R.id.weex_id_4504,R.id.weex_id_4503,R.id.weex_id_4502,R.id.weex_id_4501,R.id.weex_id_4500,
+ R.id.weex_id_4499,R.id.weex_id_4498,R.id.weex_id_4497,R.id.weex_id_4496,R.id.weex_id_4495,R.id.weex_id_4494,R.id.weex_id_4493,R.id.weex_id_4492,R.id.weex_id_4491,R.id.weex_id_4490,R.id.weex_id_4489,R.id.weex_id_4488,R.id.weex_id_4487,R.id.weex_id_4486,R.id.weex_id_4485,R.id.weex_id_4484,R.id.weex_id_4483,R.id.weex_id_4482,R.id.weex_id_4481,R.id.weex_id_4480,R.id.weex_id_4479,R.id.weex_id_4478,R.id.weex_id_4477,R.id.weex_id_4476,R.id.weex_id_4475,R.id.weex_id_4474,R.id.weex_id_4473,R.id.weex_id_4472,R.id.weex_id_4471,R.id.weex_id_4470,R.id.weex_id_4469,R.id.weex_id_4468,R.id.weex_id_4467,R.id.weex_id_4466,R.id.weex_id_4465,R.id.weex_id_4464,R.id.weex_id_4463,R.id.weex_id_4462,R.id.weex_id_4461,R.id.weex_id_4460,R.id.weex_id_4459,R.id.weex_id_4458,R.id.weex_id_4457,R.id.weex_id_4456,R.id.weex_id_4455,R.id.weex_id_4454,R.id.weex_id_4453,R.id.weex_id_4452,R.id.weex_id_4451,R.id.weex_id_4450,R.id.weex_id_4449,R.id.weex_id_4448,R.id.weex_id_4447,R.id.weex_id_4446,R.id.weex_id_4445,R.id.weex_id_4444,R.id.weex_id_4443,R.id.weex_id_4442,R.id.weex_id_4441,R.id.weex_id_4440,R.id.weex_id_4439,R.id.weex_id_4438,R.id.weex_id_4437,R.id.weex_id_4436,R.id.weex_id_4435,R.id.weex_id_4434,R.id.weex_id_4433,R.id.weex_id_4432,R.id.weex_id_4431,R.id.weex_id_4430,R.id.weex_id_4429,R.id.weex_id_4428,R.id.weex_id_4427,R.id.weex_id_4426,R.id.weex_id_4425,R.id.weex_id_4424,R.id.weex_id_4423,R.id.weex_id_4422,R.id.weex_id_4421,R.id.weex_id_4420,R.id.weex_id_4419,R.id.weex_id_4418,R.id.weex_id_4417,R.id.weex_id_4416,R.id.weex_id_4415,R.id.weex_id_4414,R.id.weex_id_4413,R.id.weex_id_4412,R.id.weex_id_4411,R.id.weex_id_4410,R.id.weex_id_4409,R.id.weex_id_4408,R.id.weex_id_4407,R.id.weex_id_4406,R.id.weex_id_4405,R.id.weex_id_4404,R.id.weex_id_4403,R.id.weex_id_4402,R.id.weex_id_4401,R.id.weex_id_4400,
+ R.id.weex_id_4399,R.id.weex_id_4398,R.id.weex_id_4397,R.id.weex_id_4396,R.id.weex_id_4395,R.id.weex_id_4394,R.id.weex_id_4393,R.id.weex_id_4392,R.id.weex_id_4391,R.id.weex_id_4390,R.id.weex_id_4389,R.id.weex_id_4388,R.id.weex_id_4387,R.id.weex_id_4386,R.id.weex_id_4385,R.id.weex_id_4384,R.id.weex_id_4383,R.id.weex_id_4382,R.id.weex_id_4381,R.id.weex_id_4380,R.id.weex_id_4379,R.id.weex_id_4378,R.id.weex_id_4377,R.id.weex_id_4376,R.id.weex_id_4375,R.id.weex_id_4374,R.id.weex_id_4373,R.id.weex_id_4372,R.id.weex_id_4371,R.id.weex_id_4370,R.id.weex_id_4369,R.id.weex_id_4368,R.id.weex_id_4367,R.id.weex_id_4366,R.id.weex_id_4365,R.id.weex_id_4364,R.id.weex_id_4363,R.id.weex_id_4362,R.id.weex_id_4361,R.id.weex_id_4360,R.id.weex_id_4359,R.id.weex_id_4358,R.id.weex_id_4357,R.id.weex_id_4356,R.id.weex_id_4355,R.id.weex_id_4354,R.id.weex_id_4353,R.id.weex_id_4352,R.id.weex_id_4351,R.id.weex_id_4350,R.id.weex_id_4349,R.id.weex_id_4348,R.id.weex_id_4347,R.id.weex_id_4346,R.id.weex_id_4345,R.id.weex_id_4344,R.id.weex_id_4343,R.id.weex_id_4342,R.id.weex_id_4341,R.id.weex_id_4340,R.id.weex_id_4339,R.id.weex_id_4338,R.id.weex_id_4337,R.id.weex_id_4336,R.id.weex_id_4335,R.id.weex_id_4334,R.id.weex_id_4333,R.id.weex_id_4332,R.id.weex_id_4331,R.id.weex_id_4330,R.id.weex_id_4329,R.id.weex_id_4328,R.id.weex_id_4327,R.id.weex_id_4326,R.id.weex_id_4325,R.id.weex_id_4324,R.id.weex_id_4323,R.id.weex_id_4322,R.id.weex_id_4321,R.id.weex_id_4320,R.id.weex_id_4319,R.id.weex_id_4318,R.id.weex_id_4317,R.id.weex_id_4316,R.id.weex_id_4315,R.id.weex_id_4314,R.id.weex_id_4313,R.id.weex_id_4312,R.id.weex_id_4311,R.id.weex_id_4310,R.id.weex_id_4309,R.id.weex_id_4308,R.id.weex_id_4307,R.id.weex_id_4306,R.id.weex_id_4305,R.id.weex_id_4304,R.id.weex_id_4303,R.id.weex_id_4302,R.id.weex_id_4301,R.id.weex_id_4300,
+ R.id.weex_id_4299,R.id.weex_id_4298,R.id.weex_id_4297,R.id.weex_id_4296,R.id.weex_id_4295,R.id.weex_id_4294,R.id.weex_id_4293,R.id.weex_id_4292,R.id.weex_id_4291,R.id.weex_id_4290,R.id.weex_id_4289,R.id.weex_id_4288,R.id.weex_id_4287,R.id.weex_id_4286,R.id.weex_id_4285,R.id.weex_id_4284,R.id.weex_id_4283,R.id.weex_id_4282,R.id.weex_id_4281,R.id.weex_id_4280,R.id.weex_id_4279,R.id.weex_id_4278,R.id.weex_id_4277,R.id.weex_id_4276,R.id.weex_id_4275,R.id.weex_id_4274,R.id.weex_id_4273,R.id.weex_id_4272,R.id.weex_id_4271,R.id.weex_id_4270,R.id.weex_id_4269,R.id.weex_id_4268,R.id.weex_id_4267,R.id.weex_id_4266,R.id.weex_id_4265,R.id.weex_id_4264,R.id.weex_id_4263,R.id.weex_id_4262,R.id.weex_id_4261,R.id.weex_id_4260,R.id.weex_id_4259,R.id.weex_id_4258,R.id.weex_id_4257,R.id.weex_id_4256,R.id.weex_id_4255,R.id.weex_id_4254,R.id.weex_id_4253,R.id.weex_id_4252,R.id.weex_id_4251,R.id.weex_id_4250,R.id.weex_id_4249,R.id.weex_id_4248,R.id.weex_id_4247,R.id.weex_id_4246,R.id.weex_id_4245,R.id.weex_id_4244,R.id.weex_id_4243,R.id.weex_id_4242,R.id.weex_id_4241,R.id.weex_id_4240,R.id.weex_id_4239,R.id.weex_id_4238,R.id.weex_id_4237,R.id.weex_id_4236,R.id.weex_id_4235,R.id.weex_id_4234,R.id.weex_id_4233,R.id.weex_id_4232,R.id.weex_id_4231,R.id.weex_id_4230,R.id.weex_id_4229,R.id.weex_id_4228,R.id.weex_id_4227,R.id.weex_id_4226,R.id.weex_id_4225,R.id.weex_id_4224,R.id.weex_id_4223,R.id.weex_id_4222,R.id.weex_id_4221,R.id.weex_id_4220,R.id.weex_id_4219,R.id.weex_id_4218,R.id.weex_id_4217,R.id.weex_id_4216,R.id.weex_id_4215,R.id.weex_id_4214,R.id.weex_id_4213,R.id.weex_id_4212,R.id.weex_id_4211,R.id.weex_id_4210,R.id.weex_id_4209,R.id.weex_id_4208,R.id.weex_id_4207,R.id.weex_id_4206,R.id.weex_id_4205,R.id.weex_id_4204,R.id.weex_id_4203,R.id.weex_id_4202,R.id.weex_id_4201,R.id.weex_id_4200,
+ R.id.weex_id_4199,R.id.weex_id_4198,R.id.weex_id_4197,R.id.weex_id_4196,R.id.weex_id_4195,R.id.weex_id_4194,R.id.weex_id_4193,R.id.weex_id_4192,R.id.weex_id_4191,R.id.weex_id_4190,R.id.weex_id_4189,R.id.weex_id_4188,R.id.weex_id_4187,R.id.weex_id_4186,R.id.weex_id_4185,R.id.weex_id_4184,R.id.weex_id_4183,R.id.weex_id_4182,R.id.weex_id_4181,R.id.weex_id_4180,R.id.weex_id_4179,R.id.weex_id_4178,R.id.weex_id_4177,R.id.weex_id_4176,R.id.weex_id_4175,R.id.weex_id_4174,R.id.weex_id_4173,R.id.weex_id_4172,R.id.weex_id_4171,R.id.weex_id_4170,R.id.weex_id_4169,R.id.weex_id_4168,R.id.weex_id_4167,R.id.weex_id_4166,R.id.weex_id_4165,R.id.weex_id_4164,R.id.weex_id_4163,R.id.weex_id_4162,R.id.weex_id_4161,R.id.weex_id_4160,R.id.weex_id_4159,R.id.weex_id_4158,R.id.weex_id_4157,R.id.weex_id_4156,R.id.weex_id_4155,R.id.weex_id_4154,R.id.weex_id_4153,R.id.weex_id_4152,R.id.weex_id_4151,R.id.weex_id_4150,R.id.weex_id_4149,R.id.weex_id_4148,R.id.weex_id_4147,R.id.weex_id_4146,R.id.weex_id_4145,R.id.weex_id_4144,R.id.weex_id_4143,R.id.weex_id_4142,R.id.weex_id_4141,R.id.weex_id_4140,R.id.weex_id_4139,R.id.weex_id_4138,R.id.weex_id_4137,R.id.weex_id_4136,R.id.weex_id_4135,R.id.weex_id_4134,R.id.weex_id_4133,R.id.weex_id_4132,R.id.weex_id_4131,R.id.weex_id_4130,R.id.weex_id_4129,R.id.weex_id_4128,R.id.weex_id_4127,R.id.weex_id_4126,R.id.weex_id_4125,R.id.weex_id_4124,R.id.weex_id_4123,R.id.weex_id_4122,R.id.weex_id_4121,R.id.weex_id_4120,R.id.weex_id_4119,R.id.weex_id_4118,R.id.weex_id_4117,R.id.weex_id_4116,R.id.weex_id_4115,R.id.weex_id_4114,R.id.weex_id_4113,R.id.weex_id_4112,R.id.weex_id_4111,R.id.weex_id_4110,R.id.weex_id_4109,R.id.weex_id_4108,R.id.weex_id_4107,R.id.weex_id_4106,R.id.weex_id_4105,R.id.weex_id_4104,R.id.weex_id_4103,R.id.weex_id_4102,R.id.weex_id_4101,R.id.weex_id_4100,
+ R.id.weex_id_4099,R.id.weex_id_4098,R.id.weex_id_4097,R.id.weex_id_4096,R.id.weex_id_4095,R.id.weex_id_4094,R.id.weex_id_4093,R.id.weex_id_4092,R.id.weex_id_4091,R.id.weex_id_4090,R.id.weex_id_4089,R.id.weex_id_4088,R.id.weex_id_4087,R.id.weex_id_4086,R.id.weex_id_4085,R.id.weex_id_4084,R.id.weex_id_4083,R.id.weex_id_4082,R.id.weex_id_4081,R.id.weex_id_4080,R.id.weex_id_4079,R.id.weex_id_4078,R.id.weex_id_4077,R.id.weex_id_4076,R.id.weex_id_4075,R.id.weex_id_4074,R.id.weex_id_4073,R.id.weex_id_4072,R.id.weex_id_4071,R.id.weex_id_4070,R.id.weex_id_4069,R.id.weex_id_4068,R.id.weex_id_4067,R.id.weex_id_4066,R.id.weex_id_4065,R.id.weex_id_4064,R.id.weex_id_4063,R.id.weex_id_4062,R.id.weex_id_4061,R.id.weex_id_4060,R.id.weex_id_4059,R.id.weex_id_4058,R.id.weex_id_4057,R.id.weex_id_4056,R.id.weex_id_4055,R.id.weex_id_4054,R.id.weex_id_4053,R.id.weex_id_4052,R.id.weex_id_4051,R.id.weex_id_4050,R.id.weex_id_4049,R.id.weex_id_4048,R.id.weex_id_4047,R.id.weex_id_4046,R.id.weex_id_4045,R.id.weex_id_4044,R.id.weex_id_4043,R.id.weex_id_4042,R.id.weex_id_4041,R.id.weex_id_4040,R.id.weex_id_4039,R.id.weex_id_4038,R.id.weex_id_4037,R.id.weex_id_4036,R.id.weex_id_4035,R.id.weex_id_4034,R.id.weex_id_4033,R.id.weex_id_4032,R.id.weex_id_4031,R.id.weex_id_4030,R.id.weex_id_4029,R.id.weex_id_4028,R.id.weex_id_4027,R.id.weex_id_4026,R.id.weex_id_4025,R.id.weex_id_4024,R.id.weex_id_4023,R.id.weex_id_4022,R.id.weex_id_4021,R.id.weex_id_4020,R.id.weex_id_4019,R.id.weex_id_4018,R.id.weex_id_4017,R.id.weex_id_4016,R.id.weex_id_4015,R.id.weex_id_4014,R.id.weex_id_4013,R.id.weex_id_4012,R.id.weex_id_4011,R.id.weex_id_4010,R.id.weex_id_4009,R.id.weex_id_4008,R.id.weex_id_4007,R.id.weex_id_4006,R.id.weex_id_4005,R.id.weex_id_4004,R.id.weex_id_4003,R.id.weex_id_4002,R.id.weex_id_4001,R.id.weex_id_4000,
+ R.id.weex_id_3999,R.id.weex_id_3998,R.id.weex_id_3997,R.id.weex_id_3996,R.id.weex_id_3995,R.id.weex_id_3994,R.id.weex_id_3993,R.id.weex_id_3992,R.id.weex_id_3991,R.id.weex_id_3990,R.id.weex_id_3989,R.id.weex_id_3988,R.id.weex_id_3987,R.id.weex_id_3986,R.id.weex_id_3985,R.id.weex_id_3984,R.id.weex_id_3983,R.id.weex_id_3982,R.id.weex_id_3981,R.id.weex_id_3980,R.id.weex_id_3979,R.id.weex_id_3978,R.id.weex_id_3977,R.id.weex_id_3976,R.id.weex_id_3975,R.id.weex_id_3974,R.id.weex_id_3973,R.id.weex_id_3972,R.id.weex_id_3971,R.id.weex_id_3970,R.id.weex_id_3969,R.id.weex_id_3968,R.id.weex_id_3967,R.id.weex_id_3966,R.id.weex_id_3965,R.id.weex_id_3964,R.id.weex_id_3963,R.id.weex_id_3962,R.id.weex_id_3961,R.id.weex_id_3960,R.id.weex_id_3959,R.id.weex_id_3958,R.id.weex_id_3957,R.id.weex_id_3956,R.id.weex_id_3955,R.id.weex_id_3954,R.id.weex_id_3953,R.id.weex_id_3952,R.id.weex_id_3951,R.id.weex_id_3950,R.id.weex_id_3949,R.id.weex_id_3948,R.id.weex_id_3947,R.id.weex_id_3946,R.id.weex_id_3945,R.id.weex_id_3944,R.id.weex_id_3943,R.id.weex_id_3942,R.id.weex_id_3941,R.id.weex_id_3940,R.id.weex_id_3939,R.id.weex_id_3938,R.id.weex_id_3937,R.id.weex_id_3936,R.id.weex_id_3935,R.id.weex_id_3934,R.id.weex_id_3933,R.id.weex_id_3932,R.id.weex_id_3931,R.id.weex_id_3930,R.id.weex_id_3929,R.id.weex_id_3928,R.id.weex_id_3927,R.id.weex_id_3926,R.id.weex_id_3925,R.id.weex_id_3924,R.id.weex_id_3923,R.id.weex_id_3922,R.id.weex_id_3921,R.id.weex_id_3920,R.id.weex_id_3919,R.id.weex_id_3918,R.id.weex_id_3917,R.id.weex_id_3916,R.id.weex_id_3915,R.id.weex_id_3914,R.id.weex_id_3913,R.id.weex_id_3912,R.id.weex_id_3911,R.id.weex_id_3910,R.id.weex_id_3909,R.id.weex_id_3908,R.id.weex_id_3907,R.id.weex_id_3906,R.id.weex_id_3905,R.id.weex_id_3904,R.id.weex_id_3903,R.id.weex_id_3902,R.id.weex_id_3901,R.id.weex_id_3900,
+ R.id.weex_id_3899,R.id.weex_id_3898,R.id.weex_id_3897,R.id.weex_id_3896,R.id.weex_id_3895,R.id.weex_id_3894,R.id.weex_id_3893,R.id.weex_id_3892,R.id.weex_id_3891,R.id.weex_id_3890,R.id.weex_id_3889,R.id.weex_id_3888,R.id.weex_id_3887,R.id.weex_id_3886,R.id.weex_id_3885,R.id.weex_id_3884,R.id.weex_id_3883,R.id.weex_id_3882,R.id.weex_id_3881,R.id.weex_id_3880,R.id.weex_id_3879,R.id.weex_id_3878,R.id.weex_id_3877,R.id.weex_id_3876,R.id.weex_id_3875,R.id.weex_id_3874,R.id.weex_id_3873,R.id.weex_id_3872,R.id.weex_id_3871,R.id.weex_id_3870,R.id.weex_id_3869,R.id.weex_id_3868,R.id.weex_id_3867,R.id.weex_id_3866,R.id.weex_id_3865,R.id.weex_id_3864,R.id.weex_id_3863,R.id.weex_id_3862,R.id.weex_id_3861,R.id.weex_id_3860,R.id.weex_id_3859,R.id.weex_id_3858,R.id.weex_id_3857,R.id.weex_id_3856,R.id.weex_id_3855,R.id.weex_id_3854,R.id.weex_id_3853,R.id.weex_id_3852,R.id.weex_id_3851,R.id.weex_id_3850,R.id.weex_id_3849,R.id.weex_id_3848,R.id.weex_id_3847,R.id.weex_id_3846,R.id.weex_id_3845,R.id.weex_id_3844,R.id.weex_id_3843,R.id.weex_id_3842,R.id.weex_id_3841,R.id.weex_id_3840,R.id.weex_id_3839,R.id.weex_id_3838,R.id.weex_id_3837,R.id.weex_id_3836,R.id.weex_id_3835,R.id.weex_id_3834,R.id.weex_id_3833,R.id.weex_id_3832,R.id.weex_id_3831,R.id.weex_id_3830,R.id.weex_id_3829,R.id.weex_id_3828,R.id.weex_id_3827,R.id.weex_id_3826,R.id.weex_id_3825,R.id.weex_id_3824,R.id.weex_id_3823,R.id.weex_id_3822,R.id.weex_id_3821,R.id.weex_id_3820,R.id.weex_id_3819,R.id.weex_id_3818,R.id.weex_id_3817,R.id.weex_id_3816,R.id.weex_id_3815,R.id.weex_id_3814,R.id.weex_id_3813,R.id.weex_id_3812,R.id.weex_id_3811,R.id.weex_id_3810,R.id.weex_id_3809,R.id.weex_id_3808,R.id.weex_id_3807,R.id.weex_id_3806,R.id.weex_id_3805,R.id.weex_id_3804,R.id.weex_id_3803,R.id.weex_id_3802,R.id.weex_id_3801,R.id.weex_id_3800,
+ R.id.weex_id_3799,R.id.weex_id_3798,R.id.weex_id_3797,R.id.weex_id_3796,R.id.weex_id_3795,R.id.weex_id_3794,R.id.weex_id_3793,R.id.weex_id_3792,R.id.weex_id_3791,R.id.weex_id_3790,R.id.weex_id_3789,R.id.weex_id_3788,R.id.weex_id_3787,R.id.weex_id_3786,R.id.weex_id_3785,R.id.weex_id_3784,R.id.weex_id_3783,R.id.weex_id_3782,R.id.weex_id_3781,R.id.weex_id_3780,R.id.weex_id_3779,R.id.weex_id_3778,R.id.weex_id_3777,R.id.weex_id_3776,R.id.weex_id_3775,R.id.weex_id_3774,R.id.weex_id_3773,R.id.weex_id_3772,R.id.weex_id_3771,R.id.weex_id_3770,R.id.weex_id_3769,R.id.weex_id_3768,R.id.weex_id_3767,R.id.weex_id_3766,R.id.weex_id_3765,R.id.weex_id_3764,R.id.weex_id_3763,R.id.weex_id_3762,R.id.weex_id_3761,R.id.weex_id_3760,R.id.weex_id_3759,R.id.weex_id_3758,R.id.weex_id_3757,R.id.weex_id_3756,R.id.weex_id_3755,R.id.weex_id_3754,R.id.weex_id_3753,R.id.weex_id_3752,R.id.weex_id_3751,R.id.weex_id_3750,R.id.weex_id_3749,R.id.weex_id_3748,R.id.weex_id_3747,R.id.weex_id_3746,R.id.weex_id_3745,R.id.weex_id_3744,R.id.weex_id_3743,R.id.weex_id_3742,R.id.weex_id_3741,R.id.weex_id_3740,R.id.weex_id_3739,R.id.weex_id_3738,R.id.weex_id_3737,R.id.weex_id_3736,R.id.weex_id_3735,R.id.weex_id_3734,R.id.weex_id_3733,R.id.weex_id_3732,R.id.weex_id_3731,R.id.weex_id_3730,R.id.weex_id_3729,R.id.weex_id_3728,R.id.weex_id_3727,R.id.weex_id_3726,R.id.weex_id_3725,R.id.weex_id_3724,R.id.weex_id_3723,R.id.weex_id_3722,R.id.weex_id_3721,R.id.weex_id_3720,R.id.weex_id_3719,R.id.weex_id_3718,R.id.weex_id_3717,R.id.weex_id_3716,R.id.weex_id_3715,R.id.weex_id_3714,R.id.weex_id_3713,R.id.weex_id_3712,R.id.weex_id_3711,R.id.weex_id_3710,R.id.weex_id_3709,R.id.weex_id_3708,R.id.weex_id_3707,R.id.weex_id_3706,R.id.weex_id_3705,R.id.weex_id_3704,R.id.weex_id_3703,R.id.weex_id_3702,R.id.weex_id_3701,R.id.weex_id_3700,
+ R.id.weex_id_3699,R.id.weex_id_3698,R.id.weex_id_3697,R.id.weex_id_3696,R.id.weex_id_3695,R.id.weex_id_3694,R.id.weex_id_3693,R.id.weex_id_3692,R.id.weex_id_3691,R.id.weex_id_3690,R.id.weex_id_3689,R.id.weex_id_3688,R.id.weex_id_3687,R.id.weex_id_3686,R.id.weex_id_3685,R.id.weex_id_3684,R.id.weex_id_3683,R.id.weex_id_3682,R.id.weex_id_3681,R.id.weex_id_3680,R.id.weex_id_3679,R.id.weex_id_3678,R.id.weex_id_3677,R.id.weex_id_3676,R.id.weex_id_3675,R.id.weex_id_3674,R.id.weex_id_3673,R.id.weex_id_3672,R.id.weex_id_3671,R.id.weex_id_3670,R.id.weex_id_3669,R.id.weex_id_3668,R.id.weex_id_3667,R.id.weex_id_3666,R.id.weex_id_3665,R.id.weex_id_3664,R.id.weex_id_3663,R.id.weex_id_3662,R.id.weex_id_3661,R.id.weex_id_3660,R.id.weex_id_3659,R.id.weex_id_3658,R.id.weex_id_3657,R.id.weex_id_3656,R.id.weex_id_3655,R.id.weex_id_3654,R.id.weex_id_3653,R.id.weex_id_3652,R.id.weex_id_3651,R.id.weex_id_3650,R.id.weex_id_3649,R.id.weex_id_3648,R.id.weex_id_3647,R.id.weex_id_3646,R.id.weex_id_3645,R.id.weex_id_3644,R.id.weex_id_3643,R.id.weex_id_3642,R.id.weex_id_3641,R.id.weex_id_3640,R.id.weex_id_3639,R.id.weex_id_3638,R.id.weex_id_3637,R.id.weex_id_3636,R.id.weex_id_3635,R.id.weex_id_3634,R.id.weex_id_3633,R.id.weex_id_3632,R.id.weex_id_3631,R.id.weex_id_3630,R.id.weex_id_3629,R.id.weex_id_3628,R.id.weex_id_3627,R.id.weex_id_3626,R.id.weex_id_3625,R.id.weex_id_3624,R.id.weex_id_3623,R.id.weex_id_3622,R.id.weex_id_3621,R.id.weex_id_3620,R.id.weex_id_3619,R.id.weex_id_3618,R.id.weex_id_3617,R.id.weex_id_3616,R.id.weex_id_3615,R.id.weex_id_3614,R.id.weex_id_3613,R.id.weex_id_3612,R.id.weex_id_3611,R.id.weex_id_3610,R.id.weex_id_3609,R.id.weex_id_3608,R.id.weex_id_3607,R.id.weex_id_3606,R.id.weex_id_3605,R.id.weex_id_3604,R.id.weex_id_3603,R.id.weex_id_3602,R.id.weex_id_3601,R.id.weex_id_3600,
+ R.id.weex_id_3599,R.id.weex_id_3598,R.id.weex_id_3597,R.id.weex_id_3596,R.id.weex_id_3595,R.id.weex_id_3594,R.id.weex_id_3593,R.id.weex_id_3592,R.id.weex_id_3591,R.id.weex_id_3590,R.id.weex_id_3589,R.id.weex_id_3588,R.id.weex_id_3587,R.id.weex_id_3586,R.id.weex_id_3585,R.id.weex_id_3584,R.id.weex_id_3583,R.id.weex_id_3582,R.id.weex_id_3581,R.id.weex_id_3580,R.id.weex_id_3579,R.id.weex_id_3578,R.id.weex_id_3577,R.id.weex_id_3576,R.id.weex_id_3575,R.id.weex_id_3574,R.id.weex_id_3573,R.id.weex_id_3572,R.id.weex_id_3571,R.id.weex_id_3570,R.id.weex_id_3569,R.id.weex_id_3568,R.id.weex_id_3567,R.id.weex_id_3566,R.id.weex_id_3565,R.id.weex_id_3564,R.id.weex_id_3563,R.id.weex_id_3562,R.id.weex_id_3561,R.id.weex_id_3560,R.id.weex_id_3559,R.id.weex_id_3558,R.id.weex_id_3557,R.id.weex_id_3556,R.id.weex_id_3555,R.id.weex_id_3554,R.id.weex_id_3553,R.id.weex_id_3552,R.id.weex_id_3551,R.id.weex_id_3550,R.id.weex_id_3549,R.id.weex_id_3548,R.id.weex_id_3547,R.id.weex_id_3546,R.id.weex_id_3545,R.id.weex_id_3544,R.id.weex_id_3543,R.id.weex_id_3542,R.id.weex_id_3541,R.id.weex_id_3540,R.id.weex_id_3539,R.id.weex_id_3538,R.id.weex_id_3537,R.id.weex_id_3536,R.id.weex_id_3535,R.id.weex_id_3534,R.id.weex_id_3533,R.id.weex_id_3532,R.id.weex_id_3531,R.id.weex_id_3530,R.id.weex_id_3529,R.id.weex_id_3528,R.id.weex_id_3527,R.id.weex_id_3526,R.id.weex_id_3525,R.id.weex_id_3524,R.id.weex_id_3523,R.id.weex_id_3522,R.id.weex_id_3521,R.id.weex_id_3520,R.id.weex_id_3519,R.id.weex_id_3518,R.id.weex_id_3517,R.id.weex_id_3516,R.id.weex_id_3515,R.id.weex_id_3514,R.id.weex_id_3513,R.id.weex_id_3512,R.id.weex_id_3511,R.id.weex_id_3510,R.id.weex_id_3509,R.id.weex_id_3508,R.id.weex_id_3507,R.id.weex_id_3506,R.id.weex_id_3505,R.id.weex_id_3504,R.id.weex_id_3503,R.id.weex_id_3502,R.id.weex_id_3501,R.id.weex_id_3500,
+ R.id.weex_id_3499,R.id.weex_id_3498,R.id.weex_id_3497,R.id.weex_id_3496,R.id.weex_id_3495,R.id.weex_id_3494,R.id.weex_id_3493,R.id.weex_id_3492,R.id.weex_id_3491,R.id.weex_id_3490,R.id.weex_id_3489,R.id.weex_id_3488,R.id.weex_id_3487,R.id.weex_id_3486,R.id.weex_id_3485,R.id.weex_id_3484,R.id.weex_id_3483,R.id.weex_id_3482,R.id.weex_id_3481,R.id.weex_id_3480,R.id.weex_id_3479,R.id.weex_id_3478,R.id.weex_id_3477,R.id.weex_id_3476,R.id.weex_id_3475,R.id.weex_id_3474,R.id.weex_id_3473,R.id.weex_id_3472,R.id.weex_id_3471,R.id.weex_id_3470,R.id.weex_id_3469,R.id.weex_id_3468,R.id.weex_id_3467,R.id.weex_id_3466,R.id.weex_id_3465,R.id.weex_id_3464,R.id.weex_id_3463,R.id.weex_id_3462,R.id.weex_id_3461,R.id.weex_id_3460,R.id.weex_id_3459,R.id.weex_id_3458,R.id.weex_id_3457,R.id.weex_id_3456,R.id.weex_id_3455,R.id.weex_id_3454,R.id.weex_id_3453,R.id.weex_id_3452,R.id.weex_id_3451,R.id.weex_id_3450,R.id.weex_id_3449,R.id.weex_id_3448,R.id.weex_id_3447,R.id.weex_id_3446,R.id.weex_id_3445,R.id.weex_id_3444,R.id.weex_id_3443,R.id.weex_id_3442,R.id.weex_id_3441,R.id.weex_id_3440,R.id.weex_id_3439,R.id.weex_id_3438,R.id.weex_id_3437,R.id.weex_id_3436,R.id.weex_id_3435,R.id.weex_id_3434,R.id.weex_id_3433,R.id.weex_id_3432,R.id.weex_id_3431,R.id.weex_id_3430,R.id.weex_id_3429,R.id.weex_id_3428,R.id.weex_id_3427,R.id.weex_id_3426,R.id.weex_id_3425,R.id.weex_id_3424,R.id.weex_id_3423,R.id.weex_id_3422,R.id.weex_id_3421,R.id.weex_id_3420,R.id.weex_id_3419,R.id.weex_id_3418,R.id.weex_id_3417,R.id.weex_id_3416,R.id.weex_id_3415,R.id.weex_id_3414,R.id.weex_id_3413,R.id.weex_id_3412,R.id.weex_id_3411,R.id.weex_id_3410,R.id.weex_id_3409,R.id.weex_id_3408,R.id.weex_id_3407,R.id.weex_id_3406,R.id.weex_id_3405,R.id.weex_id_3404,R.id.weex_id_3403,R.id.weex_id_3402,R.id.weex_id_3401,R.id.weex_id_3400,
+ R.id.weex_id_3399,R.id.weex_id_3398,R.id.weex_id_3397,R.id.weex_id_3396,R.id.weex_id_3395,R.id.weex_id_3394,R.id.weex_id_3393,R.id.weex_id_3392,R.id.weex_id_3391,R.id.weex_id_3390,R.id.weex_id_3389,R.id.weex_id_3388,R.id.weex_id_3387,R.id.weex_id_3386,R.id.weex_id_3385,R.id.weex_id_3384,R.id.weex_id_3383,R.id.weex_id_3382,R.id.weex_id_3381,R.id.weex_id_3380,R.id.weex_id_3379,R.id.weex_id_3378,R.id.weex_id_3377,R.id.weex_id_3376,R.id.weex_id_3375,R.id.weex_id_3374,R.id.weex_id_3373,R.id.weex_id_3372,R.id.weex_id_3371,R.id.weex_id_3370,R.id.weex_id_3369,R.id.weex_id_3368,R.id.weex_id_3367,R.id.weex_id_3366,R.id.weex_id_3365,R.id.weex_id_3364,R.id.weex_id_3363,R.id.weex_id_3362,R.id.weex_id_3361,R.id.weex_id_3360,R.id.weex_id_3359,R.id.weex_id_3358,R.id.weex_id_3357,R.id.weex_id_3356,R.id.weex_id_3355,R.id.weex_id_3354,R.id.weex_id_3353,R.id.weex_id_3352,R.id.weex_id_3351,R.id.weex_id_3350,R.id.weex_id_3349,R.id.weex_id_3348,R.id.weex_id_3347,R.id.weex_id_3346,R.id.weex_id_3345,R.id.weex_id_3344,R.id.weex_id_3343,R.id.weex_id_3342,R.id.weex_id_3341,R.id.weex_id_3340,R.id.weex_id_3339,R.id.weex_id_3338,R.id.weex_id_3337,R.id.weex_id_3336,R.id.weex_id_3335,R.id.weex_id_3334,R.id.weex_id_3333,R.id.weex_id_3332,R.id.weex_id_3331,R.id.weex_id_3330,R.id.weex_id_3329,R.id.weex_id_3328,R.id.weex_id_3327,R.id.weex_id_3326,R.id.weex_id_3325,R.id.weex_id_3324,R.id.weex_id_3323,R.id.weex_id_3322,R.id.weex_id_3321,R.id.weex_id_3320,R.id.weex_id_3319,R.id.weex_id_3318,R.id.weex_id_3317,R.id.weex_id_3316,R.id.weex_id_3315,R.id.weex_id_3314,R.id.weex_id_3313,R.id.weex_id_3312,R.id.weex_id_3311,R.id.weex_id_3310,R.id.weex_id_3309,R.id.weex_id_3308,R.id.weex_id_3307,R.id.weex_id_3306,R.id.weex_id_3305,R.id.weex_id_3304,R.id.weex_id_3303,R.id.weex_id_3302,R.id.weex_id_3301,R.id.weex_id_3300,
+ R.id.weex_id_3299,R.id.weex_id_3298,R.id.weex_id_3297,R.id.weex_id_3296,R.id.weex_id_3295,R.id.weex_id_3294,R.id.weex_id_3293,R.id.weex_id_3292,R.id.weex_id_3291,R.id.weex_id_3290,R.id.weex_id_3289,R.id.weex_id_3288,R.id.weex_id_3287,R.id.weex_id_3286,R.id.weex_id_3285,R.id.weex_id_3284,R.id.weex_id_3283,R.id.weex_id_3282,R.id.weex_id_3281,R.id.weex_id_3280,R.id.weex_id_3279,R.id.weex_id_3278,R.id.weex_id_3277,R.id.weex_id_3276,R.id.weex_id_3275,R.id.weex_id_3274,R.id.weex_id_3273,R.id.weex_id_3272,R.id.weex_id_3271,R.id.weex_id_3270,R.id.weex_id_3269,R.id.weex_id_3268,R.id.weex_id_3267,R.id.weex_id_3266,R.id.weex_id_3265,R.id.weex_id_3264,R.id.weex_id_3263,R.id.weex_id_3262,R.id.weex_id_3261,R.id.weex_id_3260,R.id.weex_id_3259,R.id.weex_id_3258,R.id.weex_id_3257,R.id.weex_id_3256,R.id.weex_id_3255,R.id.weex_id_3254,R.id.weex_id_3253,R.id.weex_id_3252,R.id.weex_id_3251,R.id.weex_id_3250,R.id.weex_id_3249,R.id.weex_id_3248,R.id.weex_id_3247,R.id.weex_id_3246,R.id.weex_id_3245,R.id.weex_id_3244,R.id.weex_id_3243,R.id.weex_id_3242,R.id.weex_id_3241,R.id.weex_id_3240,R.id.weex_id_3239,R.id.weex_id_3238,R.id.weex_id_3237,R.id.weex_id_3236,R.id.weex_id_3235,R.id.weex_id_3234,R.id.weex_id_3233,R.id.weex_id_3232,R.id.weex_id_3231,R.id.weex_id_3230,R.id.weex_id_3229,R.id.weex_id_3228,R.id.weex_id_3227,R.id.weex_id_3226,R.id.weex_id_3225,R.id.weex_id_3224,R.id.weex_id_3223,R.id.weex_id_3222,R.id.weex_id_3221,R.id.weex_id_3220,R.id.weex_id_3219,R.id.weex_id_3218,R.id.weex_id_3217,R.id.weex_id_3216,R.id.weex_id_3215,R.id.weex_id_3214,R.id.weex_id_3213,R.id.weex_id_3212,R.id.weex_id_3211,R.id.weex_id_3210,R.id.weex_id_3209,R.id.weex_id_3208,R.id.weex_id_3207,R.id.weex_id_3206,R.id.weex_id_3205,R.id.weex_id_3204,R.id.weex_id_3203,R.id.weex_id_3202,R.id.weex_id_3201,R.id.weex_id_3200,
+ R.id.weex_id_3199,R.id.weex_id_3198,R.id.weex_id_3197,R.id.weex_id_3196,R.id.weex_id_3195,R.id.weex_id_3194,R.id.weex_id_3193,R.id.weex_id_3192,R.id.weex_id_3191,R.id.weex_id_3190,R.id.weex_id_3189,R.id.weex_id_3188,R.id.weex_id_3187,R.id.weex_id_3186,R.id.weex_id_3185,R.id.weex_id_3184,R.id.weex_id_3183,R.id.weex_id_3182,R.id.weex_id_3181,R.id.weex_id_3180,R.id.weex_id_3179,R.id.weex_id_3178,R.id.weex_id_3177,R.id.weex_id_3176,R.id.weex_id_3175,R.id.weex_id_3174,R.id.weex_id_3173,R.id.weex_id_3172,R.id.weex_id_3171,R.id.weex_id_3170,R.id.weex_id_3169,R.id.weex_id_3168,R.id.weex_id_3167,R.id.weex_id_3166,R.id.weex_id_3165,R.id.weex_id_3164,R.id.weex_id_3163,R.id.weex_id_3162,R.id.weex_id_3161,R.id.weex_id_3160,R.id.weex_id_3159,R.id.weex_id_3158,R.id.weex_id_3157,R.id.weex_id_3156,R.id.weex_id_3155,R.id.weex_id_3154,R.id.weex_id_3153,R.id.weex_id_3152,R.id.weex_id_3151,R.id.weex_id_3150,R.id.weex_id_3149,R.id.weex_id_3148,R.id.weex_id_3147,R.id.weex_id_3146,R.id.weex_id_3145,R.id.weex_id_3144,R.id.weex_id_3143,R.id.weex_id_3142,R.id.weex_id_3141,R.id.weex_id_3140,R.id.weex_id_3139,R.id.weex_id_3138,R.id.weex_id_3137,R.id.weex_id_3136,R.id.weex_id_3135,R.id.weex_id_3134,R.id.weex_id_3133,R.id.weex_id_3132,R.id.weex_id_3131,R.id.weex_id_3130,R.id.weex_id_3129,R.id.weex_id_3128,R.id.weex_id_3127,R.id.weex_id_3126,R.id.weex_id_3125,R.id.weex_id_3124,R.id.weex_id_3123,R.id.weex_id_3122,R.id.weex_id_3121,R.id.weex_id_3120,R.id.weex_id_3119,R.id.weex_id_3118,R.id.weex_id_3117,R.id.weex_id_3116,R.id.weex_id_3115,R.id.weex_id_3114,R.id.weex_id_3113,R.id.weex_id_3112,R.id.weex_id_3111,R.id.weex_id_3110,R.id.weex_id_3109,R.id.weex_id_3108,R.id.weex_id_3107,R.id.weex_id_3106,R.id.weex_id_3105,R.id.weex_id_3104,R.id.weex_id_3103,R.id.weex_id_3102,R.id.weex_id_3101,R.id.weex_id_3100,
+ R.id.weex_id_3099,R.id.weex_id_3098,R.id.weex_id_3097,R.id.weex_id_3096,R.id.weex_id_3095,R.id.weex_id_3094,R.id.weex_id_3093,R.id.weex_id_3092,R.id.weex_id_3091,R.id.weex_id_3090,R.id.weex_id_3089,R.id.weex_id_3088,R.id.weex_id_3087,R.id.weex_id_3086,R.id.weex_id_3085,R.id.weex_id_3084,R.id.weex_id_3083,R.id.weex_id_3082,R.id.weex_id_3081,R.id.weex_id_3080,R.id.weex_id_3079,R.id.weex_id_3078,R.id.weex_id_3077,R.id.weex_id_3076,R.id.weex_id_3075,R.id.weex_id_3074,R.id.weex_id_3073,R.id.weex_id_3072,R.id.weex_id_3071,R.id.weex_id_3070,R.id.weex_id_3069,R.id.weex_id_3068,R.id.weex_id_3067,R.id.weex_id_3066,R.id.weex_id_3065,R.id.weex_id_3064,R.id.weex_id_3063,R.id.weex_id_3062,R.id.weex_id_3061,R.id.weex_id_3060,R.id.weex_id_3059,R.id.weex_id_3058,R.id.weex_id_3057,R.id.weex_id_3056,R.id.weex_id_3055,R.id.weex_id_3054,R.id.weex_id_3053,R.id.weex_id_3052,R.id.weex_id_3051,R.id.weex_id_3050,R.id.weex_id_3049,R.id.weex_id_3048,R.id.weex_id_3047,R.id.weex_id_3046,R.id.weex_id_3045,R.id.weex_id_3044,R.id.weex_id_3043,R.id.weex_id_3042,R.id.weex_id_3041,R.id.weex_id_3040,R.id.weex_id_3039,R.id.weex_id_3038,R.id.weex_id_3037,R.id.weex_id_3036,R.id.weex_id_3035,R.id.weex_id_3034,R.id.weex_id_3033,R.id.weex_id_3032,R.id.weex_id_3031,R.id.weex_id_3030,R.id.weex_id_3029,R.id.weex_id_3028,R.id.weex_id_3027,R.id.weex_id_3026,R.id.weex_id_3025,R.id.weex_id_3024,R.id.weex_id_3023,R.id.weex_id_3022,R.id.weex_id_3021,R.id.weex_id_3020,R.id.weex_id_3019,R.id.weex_id_3018,R.id.weex_id_3017,R.id.weex_id_3016,R.id.weex_id_3015,R.id.weex_id_3014,R.id.weex_id_3013,R.id.weex_id_3012,R.id.weex_id_3011,R.id.weex_id_3010,R.id.weex_id_3009,R.id.weex_id_3008,R.id.weex_id_3007,R.id.weex_id_3006,R.id.weex_id_3005,R.id.weex_id_3004,R.id.weex_id_3003,R.id.weex_id_3002,R.id.weex_id_3001,R.id.weex_id_3000,
+ R.id.weex_id_2999,R.id.weex_id_2998,R.id.weex_id_2997,R.id.weex_id_2996,R.id.weex_id_2995,R.id.weex_id_2994,R.id.weex_id_2993,R.id.weex_id_2992,R.id.weex_id_2991,R.id.weex_id_2990,R.id.weex_id_2989,R.id.weex_id_2988,R.id.weex_id_2987,R.id.weex_id_2986,R.id.weex_id_2985,R.id.weex_id_2984,R.id.weex_id_2983,R.id.weex_id_2982,R.id.weex_id_2981,R.id.weex_id_2980,R.id.weex_id_2979,R.id.weex_id_2978,R.id.weex_id_2977,R.id.weex_id_2976,R.id.weex_id_2975,R.id.weex_id_2974,R.id.weex_id_2973,R.id.weex_id_2972,R.id.weex_id_2971,R.id.weex_id_2970,R.id.weex_id_2969,R.id.weex_id_2968,R.id.weex_id_2967,R.id.weex_id_2966,R.id.weex_id_2965,R.id.weex_id_2964,R.id.weex_id_2963,R.id.weex_id_2962,R.id.weex_id_2961,R.id.weex_id_2960,R.id.weex_id_2959,R.id.weex_id_2958,R.id.weex_id_2957,R.id.weex_id_2956,R.id.weex_id_2955,R.id.weex_id_2954,R.id.weex_id_2953,R.id.weex_id_2952,R.id.weex_id_2951,R.id.weex_id_2950,R.id.weex_id_2949,R.id.weex_id_2948,R.id.weex_id_2947,R.id.weex_id_2946,R.id.weex_id_2945,R.id.weex_id_2944,R.id.weex_id_2943,R.id.weex_id_2942,R.id.weex_id_2941,R.id.weex_id_2940,R.id.weex_id_2939,R.id.weex_id_2938,R.id.weex_id_2937,R.id.weex_id_2936,R.id.weex_id_2935,R.id.weex_id_2934,R.id.weex_id_2933,R.id.weex_id_2932,R.id.weex_id_2931,R.id.weex_id_2930,R.id.weex_id_2929,R.id.weex_id_2928,R.id.weex_id_2927,R.id.weex_id_2926,R.id.weex_id_2925,R.id.weex_id_2924,R.id.weex_id_2923,R.id.weex_id_2922,R.id.weex_id_2921,R.id.weex_id_2920,R.id.weex_id_2919,R.id.weex_id_2918,R.id.weex_id_2917,R.id.weex_id_2916,R.id.weex_id_2915,R.id.weex_id_2914,R.id.weex_id_2913,R.id.weex_id_2912,R.id.weex_id_2911,R.id.weex_id_2910,R.id.weex_id_2909,R.id.weex_id_2908,R.id.weex_id_2907,R.id.weex_id_2906,R.id.weex_id_2905,R.id.weex_id_2904,R.id.weex_id_2903,R.id.weex_id_2902,R.id.weex_id_2901,R.id.weex_id_2900,
+ R.id.weex_id_2899,R.id.weex_id_2898,R.id.weex_id_2897,R.id.weex_id_2896,R.id.weex_id_2895,R.id.weex_id_2894,R.id.weex_id_2893,R.id.weex_id_2892,R.id.weex_id_2891,R.id.weex_id_2890,R.id.weex_id_2889,R.id.weex_id_2888,R.id.weex_id_2887,R.id.weex_id_2886,R.id.weex_id_2885,R.id.weex_id_2884,R.id.weex_id_2883,R.id.weex_id_2882,R.id.weex_id_2881,R.id.weex_id_2880,R.id.weex_id_2879,R.id.weex_id_2878,R.id.weex_id_2877,R.id.weex_id_2876,R.id.weex_id_2875,R.id.weex_id_2874,R.id.weex_id_2873,R.id.weex_id_2872,R.id.weex_id_2871,R.id.weex_id_2870,R.id.weex_id_2869,R.id.weex_id_2868,R.id.weex_id_2867,R.id.weex_id_2866,R.id.weex_id_2865,R.id.weex_id_2864,R.id.weex_id_2863,R.id.weex_id_2862,R.id.weex_id_2861,R.id.weex_id_2860,R.id.weex_id_2859,R.id.weex_id_2858,R.id.weex_id_2857,R.id.weex_id_2856,R.id.weex_id_2855,R.id.weex_id_2854,R.id.weex_id_2853,R.id.weex_id_2852,R.id.weex_id_2851,R.id.weex_id_2850,R.id.weex_id_2849,R.id.weex_id_2848,R.id.weex_id_2847,R.id.weex_id_2846,R.id.weex_id_2845,R.id.weex_id_2844,R.id.weex_id_2843,R.id.weex_id_2842,R.id.weex_id_2841,R.id.weex_id_2840,R.id.weex_id_2839,R.id.weex_id_2838,R.id.weex_id_2837,R.id.weex_id_2836,R.id.weex_id_2835,R.id.weex_id_2834,R.id.weex_id_2833,R.id.weex_id_2832,R.id.weex_id_2831,R.id.weex_id_2830,R.id.weex_id_2829,R.id.weex_id_2828,R.id.weex_id_2827,R.id.weex_id_2826,R.id.weex_id_2825,R.id.weex_id_2824,R.id.weex_id_2823,R.id.weex_id_2822,R.id.weex_id_2821,R.id.weex_id_2820,R.id.weex_id_2819,R.id.weex_id_2818,R.id.weex_id_2817,R.id.weex_id_2816,R.id.weex_id_2815,R.id.weex_id_2814,R.id.weex_id_2813,R.id.weex_id_2812,R.id.weex_id_2811,R.id.weex_id_2810,R.id.weex_id_2809,R.id.weex_id_2808,R.id.weex_id_2807,R.id.weex_id_2806,R.id.weex_id_2805,R.id.weex_id_2804,R.id.weex_id_2803,R.id.weex_id_2802,R.id.weex_id_2801,R.id.weex_id_2800,
+ R.id.weex_id_2799,R.id.weex_id_2798,R.id.weex_id_2797,R.id.weex_id_2796,R.id.weex_id_2795,R.id.weex_id_2794,R.id.weex_id_2793,R.id.weex_id_2792,R.id.weex_id_2791,R.id.weex_id_2790,R.id.weex_id_2789,R.id.weex_id_2788,R.id.weex_id_2787,R.id.weex_id_2786,R.id.weex_id_2785,R.id.weex_id_2784,R.id.weex_id_2783,R.id.weex_id_2782,R.id.weex_id_2781,R.id.weex_id_2780,R.id.weex_id_2779,R.id.weex_id_2778,R.id.weex_id_2777,R.id.weex_id_2776,R.id.weex_id_2775,R.id.weex_id_2774,R.id.weex_id_2773,R.id.weex_id_2772,R.id.weex_id_2771,R.id.weex_id_2770,R.id.weex_id_2769,R.id.weex_id_2768,R.id.weex_id_2767,R.id.weex_id_2766,R.id.weex_id_2765,R.id.weex_id_2764,R.id.weex_id_2763,R.id.weex_id_2762,R.id.weex_id_2761,R.id.weex_id_2760,R.id.weex_id_2759,R.id.weex_id_2758,R.id.weex_id_2757,R.id.weex_id_2756,R.id.weex_id_2755,R.id.weex_id_2754,R.id.weex_id_2753,R.id.weex_id_2752,R.id.weex_id_2751,R.id.weex_id_2750,R.id.weex_id_2749,R.id.weex_id_2748,R.id.weex_id_2747,R.id.weex_id_2746,R.id.weex_id_2745,R.id.weex_id_2744,R.id.weex_id_2743,R.id.weex_id_2742,R.id.weex_id_2741,R.id.weex_id_2740,R.id.weex_id_2739,R.id.weex_id_2738,R.id.weex_id_2737,R.id.weex_id_2736,R.id.weex_id_2735,R.id.weex_id_2734,R.id.weex_id_2733,R.id.weex_id_2732,R.id.weex_id_2731,R.id.weex_id_2730,R.id.weex_id_2729,R.id.weex_id_2728,R.id.weex_id_2727,R.id.weex_id_2726,R.id.weex_id_2725,R.id.weex_id_2724,R.id.weex_id_2723,R.id.weex_id_2722,R.id.weex_id_2721,R.id.weex_id_2720,R.id.weex_id_2719,R.id.weex_id_2718,R.id.weex_id_2717,R.id.weex_id_2716,R.id.weex_id_2715,R.id.weex_id_2714,R.id.weex_id_2713,R.id.weex_id_2712,R.id.weex_id_2711,R.id.weex_id_2710,R.id.weex_id_2709,R.id.weex_id_2708,R.id.weex_id_2707,R.id.weex_id_2706,R.id.weex_id_2705,R.id.weex_id_2704,R.id.weex_id_2703,R.id.weex_id_2702,R.id.weex_id_2701,R.id.weex_id_2700,
+ R.id.weex_id_2699,R.id.weex_id_2698,R.id.weex_id_2697,R.id.weex_id_2696,R.id.weex_id_2695,R.id.weex_id_2694,R.id.weex_id_2693,R.id.weex_id_2692,R.id.weex_id_2691,R.id.weex_id_2690,R.id.weex_id_2689,R.id.weex_id_2688,R.id.weex_id_2687,R.id.weex_id_2686,R.id.weex_id_2685,R.id.weex_id_2684,R.id.weex_id_2683,R.id.weex_id_2682,R.id.weex_id_2681,R.id.weex_id_2680,R.id.weex_id_2679,R.id.weex_id_2678,R.id.weex_id_2677,R.id.weex_id_2676,R.id.weex_id_2675,R.id.weex_id_2674,R.id.weex_id_2673,R.id.weex_id_2672,R.id.weex_id_2671,R.id.weex_id_2670,R.id.weex_id_2669,R.id.weex_id_2668,R.id.weex_id_2667,R.id.weex_id_2666,R.id.weex_id_2665,R.id.weex_id_2664,R.id.weex_id_2663,R.id.weex_id_2662,R.id.weex_id_2661,R.id.weex_id_2660,R.id.weex_id_2659,R.id.weex_id_2658,R.id.weex_id_2657,R.id.weex_id_2656,R.id.weex_id_2655,R.id.weex_id_2654,R.id.weex_id_2653,R.id.weex_id_2652,R.id.weex_id_2651,R.id.weex_id_2650,R.id.weex_id_2649,R.id.weex_id_2648,R.id.weex_id_2647,R.id.weex_id_2646,R.id.weex_id_2645,R.id.weex_id_2644,R.id.weex_id_2643,R.id.weex_id_2642,R.id.weex_id_2641,R.id.weex_id_2640,R.id.weex_id_2639,R.id.weex_id_2638,R.id.weex_id_2637,R.id.weex_id_2636,R.id.weex_id_2635,R.id.weex_id_2634,R.id.weex_id_2633,R.id.weex_id_2632,R.id.weex_id_2631,R.id.weex_id_2630,R.id.weex_id_2629,R.id.weex_id_2628,R.id.weex_id_2627,R.id.weex_id_2626,R.id.weex_id_2625,R.id.weex_id_2624,R.id.weex_id_2623,R.id.weex_id_2622,R.id.weex_id_2621,R.id.weex_id_2620,R.id.weex_id_2619,R.id.weex_id_2618,R.id.weex_id_2617,R.id.weex_id_2616,R.id.weex_id_2615,R.id.weex_id_2614,R.id.weex_id_2613,R.id.weex_id_2612,R.id.weex_id_2611,R.id.weex_id_2610,R.id.weex_id_2609,R.id.weex_id_2608,R.id.weex_id_2607,R.id.weex_id_2606,R.id.weex_id_2605,R.id.weex_id_2604,R.id.weex_id_2603,R.id.weex_id_2602,R.id.weex_id_2601,R.id.weex_id_2600,
+ R.id.weex_id_2599,R.id.weex_id_2598,R.id.weex_id_2597,R.id.weex_id_2596,R.id.weex_id_2595,R.id.weex_id_2594,R.id.weex_id_2593,R.id.weex_id_2592,R.id.weex_id_2591,R.id.weex_id_2590,R.id.weex_id_2589,R.id.weex_id_2588,R.id.weex_id_2587,R.id.weex_id_2586,R.id.weex_id_2585,R.id.weex_id_2584,R.id.weex_id_2583,R.id.weex_id_2582,R.id.weex_id_2581,R.id.weex_id_2580,R.id.weex_id_2579,R.id.weex_id_2578,R.id.weex_id_2577,R.id.weex_id_2576,R.id.weex_id_2575,R.id.weex_id_2574,R.id.weex_id_2573,R.id.weex_id_2572,R.id.weex_id_2571,R.id.weex_id_2570,R.id.weex_id_2569,R.id.weex_id_2568,R.id.weex_id_2567,R.id.weex_id_2566,R.id.weex_id_2565,R.id.weex_id_2564,R.id.weex_id_2563,R.id.weex_id_2562,R.id.weex_id_2561,R.id.weex_id_2560,R.id.weex_id_2559,R.id.weex_id_2558,R.id.weex_id_2557,R.id.weex_id_2556,R.id.weex_id_2555,R.id.weex_id_2554,R.id.weex_id_2553,R.id.weex_id_2552,R.id.weex_id_2551,R.id.weex_id_2550,R.id.weex_id_2549,R.id.weex_id_2548,R.id.weex_id_2547,R.id.weex_id_2546,R.id.weex_id_2545,R.id.weex_id_2544,R.id.weex_id_2543,R.id.weex_id_2542,R.id.weex_id_2541,R.id.weex_id_2540,R.id.weex_id_2539,R.id.weex_id_2538,R.id.weex_id_2537,R.id.weex_id_2536,R.id.weex_id_2535,R.id.weex_id_2534,R.id.weex_id_2533,R.id.weex_id_2532,R.id.weex_id_2531,R.id.weex_id_2530,R.id.weex_id_2529,R.id.weex_id_2528,R.id.weex_id_2527,R.id.weex_id_2526,R.id.weex_id_2525,R.id.weex_id_2524,R.id.weex_id_2523,R.id.weex_id_2522,R.id.weex_id_2521,R.id.weex_id_2520,R.id.weex_id_2519,R.id.weex_id_2518,R.id.weex_id_2517,R.id.weex_id_2516,R.id.weex_id_2515,R.id.weex_id_2514,R.id.weex_id_2513,R.id.weex_id_2512,R.id.weex_id_2511,R.id.weex_id_2510,R.id.weex_id_2509,R.id.weex_id_2508,R.id.weex_id_2507,R.id.weex_id_2506,R.id.weex_id_2505,R.id.weex_id_2504,R.id.weex_id_2503,R.id.weex_id_2502,R.id.weex_id_2501,R.id.weex_id_2500,
+ R.id.weex_id_2499,R.id.weex_id_2498,R.id.weex_id_2497,R.id.weex_id_2496,R.id.weex_id_2495,R.id.weex_id_2494,R.id.weex_id_2493,R.id.weex_id_2492,R.id.weex_id_2491,R.id.weex_id_2490,R.id.weex_id_2489,R.id.weex_id_2488,R.id.weex_id_2487,R.id.weex_id_2486,R.id.weex_id_2485,R.id.weex_id_2484,R.id.weex_id_2483,R.id.weex_id_2482,R.id.weex_id_2481,R.id.weex_id_2480,R.id.weex_id_2479,R.id.weex_id_2478,R.id.weex_id_2477,R.id.weex_id_2476,R.id.weex_id_2475,R.id.weex_id_2474,R.id.weex_id_2473,R.id.weex_id_2472,R.id.weex_id_2471,R.id.weex_id_2470,R.id.weex_id_2469,R.id.weex_id_2468,R.id.weex_id_2467,R.id.weex_id_2466,R.id.weex_id_2465,R.id.weex_id_2464,R.id.weex_id_2463,R.id.weex_id_2462,R.id.weex_id_2461,R.id.weex_id_2460,R.id.weex_id_2459,R.id.weex_id_2458,R.id.weex_id_2457,R.id.weex_id_2456,R.id.weex_id_2455,R.id.weex_id_2454,R.id.weex_id_2453,R.id.weex_id_2452,R.id.weex_id_2451,R.id.weex_id_2450,R.id.weex_id_2449,R.id.weex_id_2448,R.id.weex_id_2447,R.id.weex_id_2446,R.id.weex_id_2445,R.id.weex_id_2444,R.id.weex_id_2443,R.id.weex_id_2442,R.id.weex_id_2441,R.id.weex_id_2440,R.id.weex_id_2439,R.id.weex_id_2438,R.id.weex_id_2437,R.id.weex_id_2436,R.id.weex_id_2435,R.id.weex_id_2434,R.id.weex_id_2433,R.id.weex_id_2432,R.id.weex_id_2431,R.id.weex_id_2430,R.id.weex_id_2429,R.id.weex_id_2428,R.id.weex_id_2427,R.id.weex_id_2426,R.id.weex_id_2425,R.id.weex_id_2424,R.id.weex_id_2423,R.id.weex_id_2422,R.id.weex_id_2421,R.id.weex_id_2420,R.id.weex_id_2419,R.id.weex_id_2418,R.id.weex_id_2417,R.id.weex_id_2416,R.id.weex_id_2415,R.id.weex_id_2414,R.id.weex_id_2413,R.id.weex_id_2412,R.id.weex_id_2411,R.id.weex_id_2410,R.id.weex_id_2409,R.id.weex_id_2408,R.id.weex_id_2407,R.id.weex_id_2406,R.id.weex_id_2405,R.id.weex_id_2404,R.id.weex_id_2403,R.id.weex_id_2402,R.id.weex_id_2401,R.id.weex_id_2400,
+ R.id.weex_id_2399,R.id.weex_id_2398,R.id.weex_id_2397,R.id.weex_id_2396,R.id.weex_id_2395,R.id.weex_id_2394,R.id.weex_id_2393,R.id.weex_id_2392,R.id.weex_id_2391,R.id.weex_id_2390,R.id.weex_id_2389,R.id.weex_id_2388,R.id.weex_id_2387,R.id.weex_id_2386,R.id.weex_id_2385,R.id.weex_id_2384,R.id.weex_id_2383,R.id.weex_id_2382,R.id.weex_id_2381,R.id.weex_id_2380,R.id.weex_id_2379,R.id.weex_id_2378,R.id.weex_id_2377,R.id.weex_id_2376,R.id.weex_id_2375,R.id.weex_id_2374,R.id.weex_id_2373,R.id.weex_id_2372,R.id.weex_id_2371,R.id.weex_id_2370,R.id.weex_id_2369,R.id.weex_id_2368,R.id.weex_id_2367,R.id.weex_id_2366,R.id.weex_id_2365,R.id.weex_id_2364,R.id.weex_id_2363,R.id.weex_id_2362,R.id.weex_id_2361,R.id.weex_id_2360,R.id.weex_id_2359,R.id.weex_id_2358,R.id.weex_id_2357,R.id.weex_id_2356,R.id.weex_id_2355,R.id.weex_id_2354,R.id.weex_id_2353,R.id.weex_id_2352,R.id.weex_id_2351,R.id.weex_id_2350,R.id.weex_id_2349,R.id.weex_id_2348,R.id.weex_id_2347,R.id.weex_id_2346,R.id.weex_id_2345,R.id.weex_id_2344,R.id.weex_id_2343,R.id.weex_id_2342,R.id.weex_id_2341,R.id.weex_id_2340,R.id.weex_id_2339,R.id.weex_id_2338,R.id.weex_id_2337,R.id.weex_id_2336,R.id.weex_id_2335,R.id.weex_id_2334,R.id.weex_id_2333,R.id.weex_id_2332,R.id.weex_id_2331,R.id.weex_id_2330,R.id.weex_id_2329,R.id.weex_id_2328,R.id.weex_id_2327,R.id.weex_id_2326,R.id.weex_id_2325,R.id.weex_id_2324,R.id.weex_id_2323,R.id.weex_id_2322,R.id.weex_id_2321,R.id.weex_id_2320,R.id.weex_id_2319,R.id.weex_id_2318,R.id.weex_id_2317,R.id.weex_id_2316,R.id.weex_id_2315,R.id.weex_id_2314,R.id.weex_id_2313,R.id.weex_id_2312,R.id.weex_id_2311,R.id.weex_id_2310,R.id.weex_id_2309,R.id.weex_id_2308,R.id.weex_id_2307,R.id.weex_id_2306,R.id.weex_id_2305,R.id.weex_id_2304,R.id.weex_id_2303,R.id.weex_id_2302,R.id.weex_id_2301,R.id.weex_id_2300,
+ R.id.weex_id_2299,R.id.weex_id_2298,R.id.weex_id_2297,R.id.weex_id_2296,R.id.weex_id_2295,R.id.weex_id_2294,R.id.weex_id_2293,R.id.weex_id_2292,R.id.weex_id_2291,R.id.weex_id_2290,R.id.weex_id_2289,R.id.weex_id_2288,R.id.weex_id_2287,R.id.weex_id_2286,R.id.weex_id_2285,R.id.weex_id_2284,R.id.weex_id_2283,R.id.weex_id_2282,R.id.weex_id_2281,R.id.weex_id_2280,R.id.weex_id_2279,R.id.weex_id_2278,R.id.weex_id_2277,R.id.weex_id_2276,R.id.weex_id_2275,R.id.weex_id_2274,R.id.weex_id_2273,R.id.weex_id_2272,R.id.weex_id_2271,R.id.weex_id_2270,R.id.weex_id_2269,R.id.weex_id_2268,R.id.weex_id_2267,R.id.weex_id_2266,R.id.weex_id_2265,R.id.weex_id_2264,R.id.weex_id_2263,R.id.weex_id_2262,R.id.weex_id_2261,R.id.weex_id_2260,R.id.weex_id_2259,R.id.weex_id_2258,R.id.weex_id_2257,R.id.weex_id_2256,R.id.weex_id_2255,R.id.weex_id_2254,R.id.weex_id_2253,R.id.weex_id_2252,R.id.weex_id_2251,R.id.weex_id_2250,R.id.weex_id_2249,R.id.weex_id_2248,R.id.weex_id_2247,R.id.weex_id_2246,R.id.weex_id_2245,R.id.weex_id_2244,R.id.weex_id_2243,R.id.weex_id_2242,R.id.weex_id_2241,R.id.weex_id_2240,R.id.weex_id_2239,R.id.weex_id_2238,R.id.weex_id_2237,R.id.weex_id_2236,R.id.weex_id_2235,R.id.weex_id_2234,R.id.weex_id_2233,R.id.weex_id_2232,R.id.weex_id_2231,R.id.weex_id_2230,R.id.weex_id_2229,R.id.weex_id_2228,R.id.weex_id_2227,R.id.weex_id_2226,R.id.weex_id_2225,R.id.weex_id_2224,R.id.weex_id_2223,R.id.weex_id_2222,R.id.weex_id_2221,R.id.weex_id_2220,R.id.weex_id_2219,R.id.weex_id_2218,R.id.weex_id_2217,R.id.weex_id_2216,R.id.weex_id_2215,R.id.weex_id_2214,R.id.weex_id_2213,R.id.weex_id_2212,R.id.weex_id_2211,R.id.weex_id_2210,R.id.weex_id_2209,R.id.weex_id_2208,R.id.weex_id_2207,R.id.weex_id_2206,R.id.weex_id_2205,R.id.weex_id_2204,R.id.weex_id_2203,R.id.weex_id_2202,R.id.weex_id_2201,R.id.weex_id_2200,
+ R.id.weex_id_2199,R.id.weex_id_2198,R.id.weex_id_2197,R.id.weex_id_2196,R.id.weex_id_2195,R.id.weex_id_2194,R.id.weex_id_2193,R.id.weex_id_2192,R.id.weex_id_2191,R.id.weex_id_2190,R.id.weex_id_2189,R.id.weex_id_2188,R.id.weex_id_2187,R.id.weex_id_2186,R.id.weex_id_2185,R.id.weex_id_2184,R.id.weex_id_2183,R.id.weex_id_2182,R.id.weex_id_2181,R.id.weex_id_2180,R.id.weex_id_2179,R.id.weex_id_2178,R.id.weex_id_2177,R.id.weex_id_2176,R.id.weex_id_2175,R.id.weex_id_2174,R.id.weex_id_2173,R.id.weex_id_2172,R.id.weex_id_2171,R.id.weex_id_2170,R.id.weex_id_2169,R.id.weex_id_2168,R.id.weex_id_2167,R.id.weex_id_2166,R.id.weex_id_2165,R.id.weex_id_2164,R.id.weex_id_2163,R.id.weex_id_2162,R.id.weex_id_2161,R.id.weex_id_2160,R.id.weex_id_2159,R.id.weex_id_2158,R.id.weex_id_2157,R.id.weex_id_2156,R.id.weex_id_2155,R.id.weex_id_2154,R.id.weex_id_2153,R.id.weex_id_2152,R.id.weex_id_2151,R.id.weex_id_2150,R.id.weex_id_2149,R.id.weex_id_2148,R.id.weex_id_2147,R.id.weex_id_2146,R.id.weex_id_2145,R.id.weex_id_2144,R.id.weex_id_2143,R.id.weex_id_2142,R.id.weex_id_2141,R.id.weex_id_2140,R.id.weex_id_2139,R.id.weex_id_2138,R.id.weex_id_2137,R.id.weex_id_2136,R.id.weex_id_2135,R.id.weex_id_2134,R.id.weex_id_2133,R.id.weex_id_2132,R.id.weex_id_2131,R.id.weex_id_2130,R.id.weex_id_2129,R.id.weex_id_2128,R.id.weex_id_2127,R.id.weex_id_2126,R.id.weex_id_2125,R.id.weex_id_2124,R.id.weex_id_2123,R.id.weex_id_2122,R.id.weex_id_2121,R.id.weex_id_2120,R.id.weex_id_2119,R.id.weex_id_2118,R.id.weex_id_2117,R.id.weex_id_2116,R.id.weex_id_2115,R.id.weex_id_2114,R.id.weex_id_2113,R.id.weex_id_2112,R.id.weex_id_2111,R.id.weex_id_2110,R.id.weex_id_2109,R.id.weex_id_2108,R.id.weex_id_2107,R.id.weex_id_2106,R.id.weex_id_2105,R.id.weex_id_2104,R.id.weex_id_2103,R.id.weex_id_2102,R.id.weex_id_2101,R.id.weex_id_2100,
+ R.id.weex_id_2099,R.id.weex_id_2098,R.id.weex_id_2097,R.id.weex_id_2096,R.id.weex_id_2095,R.id.weex_id_2094,R.id.weex_id_2093,R.id.weex_id_2092,R.id.weex_id_2091,R.id.weex_id_2090,R.id.weex_id_2089,R.id.weex_id_2088,R.id.weex_id_2087,R.id.weex_id_2086,R.id.weex_id_2085,R.id.weex_id_2084,R.id.weex_id_2083,R.id.weex_id_2082,R.id.weex_id_2081,R.id.weex_id_2080,R.id.weex_id_2079,R.id.weex_id_2078,R.id.weex_id_2077,R.id.weex_id_2076,R.id.weex_id_2075,R.id.weex_id_2074,R.id.weex_id_2073,R.id.weex_id_2072,R.id.weex_id_2071,R.id.weex_id_2070,R.id.weex_id_2069,R.id.weex_id_2068,R.id.weex_id_2067,R.id.weex_id_2066,R.id.weex_id_2065,R.id.weex_id_2064,R.id.weex_id_2063,R.id.weex_id_2062,R.id.weex_id_2061,R.id.weex_id_2060,R.id.weex_id_2059,R.id.weex_id_2058,R.id.weex_id_2057,R.id.weex_id_2056,R.id.weex_id_2055,R.id.weex_id_2054,R.id.weex_id_2053,R.id.weex_id_2052,R.id.weex_id_2051,R.id.weex_id_2050,R.id.weex_id_2049,R.id.weex_id_2048,R.id.weex_id_2047,R.id.weex_id_2046,R.id.weex_id_2045,R.id.weex_id_2044,R.id.weex_id_2043,R.id.weex_id_2042,R.id.weex_id_2041,R.id.weex_id_2040,R.id.weex_id_2039,R.id.weex_id_2038,R.id.weex_id_2037,R.id.weex_id_2036,R.id.weex_id_2035,R.id.weex_id_2034,R.id.weex_id_2033,R.id.weex_id_2032,R.id.weex_id_2031,R.id.weex_id_2030,R.id.weex_id_2029,R.id.weex_id_2028,R.id.weex_id_2027,R.id.weex_id_2026,R.id.weex_id_2025,R.id.weex_id_2024,R.id.weex_id_2023,R.id.weex_id_2022,R.id.weex_id_2021,R.id.weex_id_2020,R.id.weex_id_2019,R.id.weex_id_2018,R.id.weex_id_2017,R.id.weex_id_2016,R.id.weex_id_2015,R.id.weex_id_2014,R.id.weex_id_2013,R.id.weex_id_2012,R.id.weex_id_2011,R.id.weex_id_2010,R.id.weex_id_2009,R.id.weex_id_2008,R.id.weex_id_2007,R.id.weex_id_2006,R.id.weex_id_2005,R.id.weex_id_2004,R.id.weex_id_2003,R.id.weex_id_2002,R.id.weex_id_2001,R.id.weex_id_2000,
+ R.id.weex_id_1999,R.id.weex_id_1998,R.id.weex_id_1997,R.id.weex_id_1996,R.id.weex_id_1995,R.id.weex_id_1994,R.id.weex_id_1993,R.id.weex_id_1992,R.id.weex_id_1991,R.id.weex_id_1990,R.id.weex_id_1989,R.id.weex_id_1988,R.id.weex_id_1987,R.id.weex_id_1986,R.id.weex_id_1985,R.id.weex_id_1984,R.id.weex_id_1983,R.id.weex_id_1982,R.id.weex_id_1981,R.id.weex_id_1980,R.id.weex_id_1979,R.id.weex_id_1978,R.id.weex_id_1977,R.id.weex_id_1976,R.id.weex_id_1975,R.id.weex_id_1974,R.id.weex_id_1973,R.id.weex_id_1972,R.id.weex_id_1971,R.id.weex_id_1970,R.id.weex_id_1969,R.id.weex_id_1968,R.id.weex_id_1967,R.id.weex_id_1966,R.id.weex_id_1965,R.id.weex_id_1964,R.id.weex_id_1963,R.id.weex_id_1962,R.id.weex_id_1961,R.id.weex_id_1960,R.id.weex_id_1959,R.id.weex_id_1958,R.id.weex_id_1957,R.id.weex_id_1956,R.id.weex_id_1955,R.id.weex_id_1954,R.id.weex_id_1953,R.id.weex_id_1952,R.id.weex_id_1951,R.id.weex_id_1950,R.id.weex_id_1949,R.id.weex_id_1948,R.id.weex_id_1947,R.id.weex_id_1946,R.id.weex_id_1945,R.id.weex_id_1944,R.id.weex_id_1943,R.id.weex_id_1942,R.id.weex_id_1941,R.id.weex_id_1940,R.id.weex_id_1939,R.id.weex_id_1938,R.id.weex_id_1937,R.id.weex_id_1936,R.id.weex_id_1935,R.id.weex_id_1934,R.id.weex_id_1933,R.id.weex_id_1932,R.id.weex_id_1931,R.id.weex_id_1930,R.id.weex_id_1929,R.id.weex_id_1928,R.id.weex_id_1927,R.id.weex_id_1926,R.id.weex_id_1925,R.id.weex_id_1924,R.id.weex_id_1923,R.id.weex_id_1922,R.id.weex_id_1921,R.id.weex_id_1920,R.id.weex_id_1919,R.id.weex_id_1918,R.id.weex_id_1917,R.id.weex_id_1916,R.id.weex_id_1915,R.id.weex_id_1914,R.id.weex_id_1913,R.id.weex_id_1912,R.id.weex_id_1911,R.id.weex_id_1910,R.id.weex_id_1909,R.id.weex_id_1908,R.id.weex_id_1907,R.id.weex_id_1906,R.id.weex_id_1905,R.id.weex_id_1904,R.id.weex_id_1903,R.id.weex_id_1902,R.id.weex_id_1901,R.id.weex_id_1900,
+ R.id.weex_id_1899,R.id.weex_id_1898,R.id.weex_id_1897,R.id.weex_id_1896,R.id.weex_id_1895,R.id.weex_id_1894,R.id.weex_id_1893,R.id.weex_id_1892,R.id.weex_id_1891,R.id.weex_id_1890,R.id.weex_id_1889,R.id.weex_id_1888,R.id.weex_id_1887,R.id.weex_id_1886,R.id.weex_id_1885,R.id.weex_id_1884,R.id.weex_id_1883,R.id.weex_id_1882,R.id.weex_id_1881,R.id.weex_id_1880,R.id.weex_id_1879,R.id.weex_id_1878,R.id.weex_id_1877,R.id.weex_id_1876,R.id.weex_id_1875,R.id.weex_id_1874,R.id.weex_id_1873,R.id.weex_id_1872,R.id.weex_id_1871,R.id.weex_id_1870,R.id.weex_id_1869,R.id.weex_id_1868,R.id.weex_id_1867,R.id.weex_id_1866,R.id.weex_id_1865,R.id.weex_id_1864,R.id.weex_id_1863,R.id.weex_id_1862,R.id.weex_id_1861,R.id.weex_id_1860,R.id.weex_id_1859,R.id.weex_id_1858,R.id.weex_id_1857,R.id.weex_id_1856,R.id.weex_id_1855,R.id.weex_id_1854,R.id.weex_id_1853,R.id.weex_id_1852,R.id.weex_id_1851,R.id.weex_id_1850,R.id.weex_id_1849,R.id.weex_id_1848,R.id.weex_id_1847,R.id.weex_id_1846,R.id.weex_id_1845,R.id.weex_id_1844,R.id.weex_id_1843,R.id.weex_id_1842,R.id.weex_id_1841,R.id.weex_id_1840,R.id.weex_id_1839,R.id.weex_id_1838,R.id.weex_id_1837,R.id.weex_id_1836,R.id.weex_id_1835,R.id.weex_id_1834,R.id.weex_id_1833,R.id.weex_id_1832,R.id.weex_id_1831,R.id.weex_id_1830,R.id.weex_id_1829,R.id.weex_id_1828,R.id.weex_id_1827,R.id.weex_id_1826,R.id.weex_id_1825,R.id.weex_id_1824,R.id.weex_id_1823,R.id.weex_id_1822,R.id.weex_id_1821,R.id.weex_id_1820,R.id.weex_id_1819,R.id.weex_id_1818,R.id.weex_id_1817,R.id.weex_id_1816,R.id.weex_id_1815,R.id.weex_id_1814,R.id.weex_id_1813,R.id.weex_id_1812,R.id.weex_id_1811,R.id.weex_id_1810,R.id.weex_id_1809,R.id.weex_id_1808,R.id.weex_id_1807,R.id.weex_id_1806,R.id.weex_id_1805,R.id.weex_id_1804,R.id.weex_id_1803,R.id.weex_id_1802,R.id.weex_id_1801,R.id.weex_id_1800,
+ R.id.weex_id_1799,R.id.weex_id_1798,R.id.weex_id_1797,R.id.weex_id_1796,R.id.weex_id_1795,R.id.weex_id_1794,R.id.weex_id_1793,R.id.weex_id_1792,R.id.weex_id_1791,R.id.weex_id_1790,R.id.weex_id_1789,R.id.weex_id_1788,R.id.weex_id_1787,R.id.weex_id_1786,R.id.weex_id_1785,R.id.weex_id_1784,R.id.weex_id_1783,R.id.weex_id_1782,R.id.weex_id_1781,R.id.weex_id_1780,R.id.weex_id_1779,R.id.weex_id_1778,R.id.weex_id_1777,R.id.weex_id_1776,R.id.weex_id_1775,R.id.weex_id_1774,R.id.weex_id_1773,R.id.weex_id_1772,R.id.weex_id_1771,R.id.weex_id_1770,R.id.weex_id_1769,R.id.weex_id_1768,R.id.weex_id_1767,R.id.weex_id_1766,R.id.weex_id_1765,R.id.weex_id_1764,R.id.weex_id_1763,R.id.weex_id_1762,R.id.weex_id_1761,R.id.weex_id_1760,R.id.weex_id_1759,R.id.weex_id_1758,R.id.weex_id_1757,R.id.weex_id_1756,R.id.weex_id_1755,R.id.weex_id_1754,R.id.weex_id_1753,R.id.weex_id_1752,R.id.weex_id_1751,R.id.weex_id_1750,R.id.weex_id_1749,R.id.weex_id_1748,R.id.weex_id_1747,R.id.weex_id_1746,R.id.weex_id_1745,R.id.weex_id_1744,R.id.weex_id_1743,R.id.weex_id_1742,R.id.weex_id_1741,R.id.weex_id_1740,R.id.weex_id_1739,R.id.weex_id_1738,R.id.weex_id_1737,R.id.weex_id_1736,R.id.weex_id_1735,R.id.weex_id_1734,R.id.weex_id_1733,R.id.weex_id_1732,R.id.weex_id_1731,R.id.weex_id_1730,R.id.weex_id_1729,R.id.weex_id_1728,R.id.weex_id_1727,R.id.weex_id_1726,R.id.weex_id_1725,R.id.weex_id_1724,R.id.weex_id_1723,R.id.weex_id_1722,R.id.weex_id_1721,R.id.weex_id_1720,R.id.weex_id_1719,R.id.weex_id_1718,R.id.weex_id_1717,R.id.weex_id_1716,R.id.weex_id_1715,R.id.weex_id_1714,R.id.weex_id_1713,R.id.weex_id_1712,R.id.weex_id_1711,R.id.weex_id_1710,R.id.weex_id_1709,R.id.weex_id_1708,R.id.weex_id_1707,R.id.weex_id_1706,R.id.weex_id_1705,R.id.weex_id_1704,R.id.weex_id_1703,R.id.weex_id_1702,R.id.weex_id_1701,R.id.weex_id_1700,
+ R.id.weex_id_1699,R.id.weex_id_1698,R.id.weex_id_1697,R.id.weex_id_1696,R.id.weex_id_1695,R.id.weex_id_1694,R.id.weex_id_1693,R.id.weex_id_1692,R.id.weex_id_1691,R.id.weex_id_1690,R.id.weex_id_1689,R.id.weex_id_1688,R.id.weex_id_1687,R.id.weex_id_1686,R.id.weex_id_1685,R.id.weex_id_1684,R.id.weex_id_1683,R.id.weex_id_1682,R.id.weex_id_1681,R.id.weex_id_1680,R.id.weex_id_1679,R.id.weex_id_1678,R.id.weex_id_1677,R.id.weex_id_1676,R.id.weex_id_1675,R.id.weex_id_1674,R.id.weex_id_1673,R.id.weex_id_1672,R.id.weex_id_1671,R.id.weex_id_1670,R.id.weex_id_1669,R.id.weex_id_1668,R.id.weex_id_1667,R.id.weex_id_1666,R.id.weex_id_1665,R.id.weex_id_1664,R.id.weex_id_1663,R.id.weex_id_1662,R.id.weex_id_1661,R.id.weex_id_1660,R.id.weex_id_1659,R.id.weex_id_1658,R.id.weex_id_1657,R.id.weex_id_1656,R.id.weex_id_1655,R.id.weex_id_1654,R.id.weex_id_1653,R.id.weex_id_1652,R.id.weex_id_1651,R.id.weex_id_1650,R.id.weex_id_1649,R.id.weex_id_1648,R.id.weex_id_1647,R.id.weex_id_1646,R.id.weex_id_1645,R.id.weex_id_1644,R.id.weex_id_1643,R.id.weex_id_1642,R.id.weex_id_1641,R.id.weex_id_1640,R.id.weex_id_1639,R.id.weex_id_1638,R.id.weex_id_1637,R.id.weex_id_1636,R.id.weex_id_1635,R.id.weex_id_1634,R.id.weex_id_1633,R.id.weex_id_1632,R.id.weex_id_1631,R.id.weex_id_1630,R.id.weex_id_1629,R.id.weex_id_1628,R.id.weex_id_1627,R.id.weex_id_1626,R.id.weex_id_1625,R.id.weex_id_1624,R.id.weex_id_1623,R.id.weex_id_1622,R.id.weex_id_1621,R.id.weex_id_1620,R.id.weex_id_1619,R.id.weex_id_1618,R.id.weex_id_1617,R.id.weex_id_1616,R.id.weex_id_1615,R.id.weex_id_1614,R.id.weex_id_1613,R.id.weex_id_1612,R.id.weex_id_1611,R.id.weex_id_1610,R.id.weex_id_1609,R.id.weex_id_1608,R.id.weex_id_1607,R.id.weex_id_1606,R.id.weex_id_1605,R.id.weex_id_1604,R.id.weex_id_1603,R.id.weex_id_1602,R.id.weex_id_1601,R.id.weex_id_1600,
+ R.id.weex_id_1599,R.id.weex_id_1598,R.id.weex_id_1597,R.id.weex_id_1596,R.id.weex_id_1595,R.id.weex_id_1594,R.id.weex_id_1593,R.id.weex_id_1592,R.id.weex_id_1591,R.id.weex_id_1590,R.id.weex_id_1589,R.id.weex_id_1588,R.id.weex_id_1587,R.id.weex_id_1586,R.id.weex_id_1585,R.id.weex_id_1584,R.id.weex_id_1583,R.id.weex_id_1582,R.id.weex_id_1581,R.id.weex_id_1580,R.id.weex_id_1579,R.id.weex_id_1578,R.id.weex_id_1577,R.id.weex_id_1576,R.id.weex_id_1575,R.id.weex_id_1574,R.id.weex_id_1573,R.id.weex_id_1572,R.id.weex_id_1571,R.id.weex_id_1570,R.id.weex_id_1569,R.id.weex_id_1568,R.id.weex_id_1567,R.id.weex_id_1566,R.id.weex_id_1565,R.id.weex_id_1564,R.id.weex_id_1563,R.id.weex_id_1562,R.id.weex_id_1561,R.id.weex_id_1560,R.id.weex_id_1559,R.id.weex_id_1558,R.id.weex_id_1557,R.id.weex_id_1556,R.id.weex_id_1555,R.id.weex_id_1554,R.id.weex_id_1553,R.id.weex_id_1552,R.id.weex_id_1551,R.id.weex_id_1550,R.id.weex_id_1549,R.id.weex_id_1548,R.id.weex_id_1547,R.id.weex_id_1546,R.id.weex_id_1545,R.id.weex_id_1544,R.id.weex_id_1543,R.id.weex_id_1542,R.id.weex_id_1541,R.id.weex_id_1540,R.id.weex_id_1539,R.id.weex_id_1538,R.id.weex_id_1537,R.id.weex_id_1536,R.id.weex_id_1535,R.id.weex_id_1534,R.id.weex_id_1533,R.id.weex_id_1532,R.id.weex_id_1531,R.id.weex_id_1530,R.id.weex_id_1529,R.id.weex_id_1528,R.id.weex_id_1527,R.id.weex_id_1526,R.id.weex_id_1525,R.id.weex_id_1524,R.id.weex_id_1523,R.id.weex_id_1522,R.id.weex_id_1521,R.id.weex_id_1520,R.id.weex_id_1519,R.id.weex_id_1518,R.id.weex_id_1517,R.id.weex_id_1516,R.id.weex_id_1515,R.id.weex_id_1514,R.id.weex_id_1513,R.id.weex_id_1512,R.id.weex_id_1511,R.id.weex_id_1510,R.id.weex_id_1509,R.id.weex_id_1508,R.id.weex_id_1507,R.id.weex_id_1506,R.id.weex_id_1505,R.id.weex_id_1504,R.id.weex_id_1503,R.id.weex_id_1502,R.id.weex_id_1501,R.id.weex_id_1500,
+ R.id.weex_id_1499,R.id.weex_id_1498,R.id.weex_id_1497,R.id.weex_id_1496,R.id.weex_id_1495,R.id.weex_id_1494,R.id.weex_id_1493,R.id.weex_id_1492,R.id.weex_id_1491,R.id.weex_id_1490,R.id.weex_id_1489,R.id.weex_id_1488,R.id.weex_id_1487,R.id.weex_id_1486,R.id.weex_id_1485,R.id.weex_id_1484,R.id.weex_id_1483,R.id.weex_id_1482,R.id.weex_id_1481,R.id.weex_id_1480,R.id.weex_id_1479,R.id.weex_id_1478,R.id.weex_id_1477,R.id.weex_id_1476,R.id.weex_id_1475,R.id.weex_id_1474,R.id.weex_id_1473,R.id.weex_id_1472,R.id.weex_id_1471,R.id.weex_id_1470,R.id.weex_id_1469,R.id.weex_id_1468,R.id.weex_id_1467,R.id.weex_id_1466,R.id.weex_id_1465,R.id.weex_id_1464,R.id.weex_id_1463,R.id.weex_id_1462,R.id.weex_id_1461,R.id.weex_id_1460,R.id.weex_id_1459,R.id.weex_id_1458,R.id.weex_id_1457,R.id.weex_id_1456,R.id.weex_id_1455,R.id.weex_id_1454,R.id.weex_id_1453,R.id.weex_id_1452,R.id.weex_id_1451,R.id.weex_id_1450,R.id.weex_id_1449,R.id.weex_id_1448,R.id.weex_id_1447,R.id.weex_id_1446,R.id.weex_id_1445,R.id.weex_id_1444,R.id.weex_id_1443,R.id.weex_id_1442,R.id.weex_id_1441,R.id.weex_id_1440,R.id.weex_id_1439,R.id.weex_id_1438,R.id.weex_id_1437,R.id.weex_id_1436,R.id.weex_id_1435,R.id.weex_id_1434,R.id.weex_id_1433,R.id.weex_id_1432,R.id.weex_id_1431,R.id.weex_id_1430,R.id.weex_id_1429,R.id.weex_id_1428,R.id.weex_id_1427,R.id.weex_id_1426,R.id.weex_id_1425,R.id.weex_id_1424,R.id.weex_id_1423,R.id.weex_id_1422,R.id.weex_id_1421,R.id.weex_id_1420,R.id.weex_id_1419,R.id.weex_id_1418,R.id.weex_id_1417,R.id.weex_id_1416,R.id.weex_id_1415,R.id.weex_id_1414,R.id.weex_id_1413,R.id.weex_id_1412,R.id.weex_id_1411,R.id.weex_id_1410,R.id.weex_id_1409,R.id.weex_id_1408,R.id.weex_id_1407,R.id.weex_id_1406,R.id.weex_id_1405,R.id.weex_id_1404,R.id.weex_id_1403,R.id.weex_id_1402,R.id.weex_id_1401,R.id.weex_id_1400,
+ R.id.weex_id_1399,R.id.weex_id_1398,R.id.weex_id_1397,R.id.weex_id_1396,R.id.weex_id_1395,R.id.weex_id_1394,R.id.weex_id_1393,R.id.weex_id_1392,R.id.weex_id_1391,R.id.weex_id_1390,R.id.weex_id_1389,R.id.weex_id_1388,R.id.weex_id_1387,R.id.weex_id_1386,R.id.weex_id_1385,R.id.weex_id_1384,R.id.weex_id_1383,R.id.weex_id_1382,R.id.weex_id_1381,R.id.weex_id_1380,R.id.weex_id_1379,R.id.weex_id_1378,R.id.weex_id_1377,R.id.weex_id_1376,R.id.weex_id_1375,R.id.weex_id_1374,R.id.weex_id_1373,R.id.weex_id_1372,R.id.weex_id_1371,R.id.weex_id_1370,R.id.weex_id_1369,R.id.weex_id_1368,R.id.weex_id_1367,R.id.weex_id_1366,R.id.weex_id_1365,R.id.weex_id_1364,R.id.weex_id_1363,R.id.weex_id_1362,R.id.weex_id_1361,R.id.weex_id_1360,R.id.weex_id_1359,R.id.weex_id_1358,R.id.weex_id_1357,R.id.weex_id_1356,R.id.weex_id_1355,R.id.weex_id_1354,R.id.weex_id_1353,R.id.weex_id_1352,R.id.weex_id_1351,R.id.weex_id_1350,R.id.weex_id_1349,R.id.weex_id_1348,R.id.weex_id_1347,R.id.weex_id_1346,R.id.weex_id_1345,R.id.weex_id_1344,R.id.weex_id_1343,R.id.weex_id_1342,R.id.weex_id_1341,R.id.weex_id_1340,R.id.weex_id_1339,R.id.weex_id_1338,R.id.weex_id_1337,R.id.weex_id_1336,R.id.weex_id_1335,R.id.weex_id_1334,R.id.weex_id_1333,R.id.weex_id_1332,R.id.weex_id_1331,R.id.weex_id_1330,R.id.weex_id_1329,R.id.weex_id_1328,R.id.weex_id_1327,R.id.weex_id_1326,R.id.weex_id_1325,R.id.weex_id_1324,R.id.weex_id_1323,R.id.weex_id_1322,R.id.weex_id_1321,R.id.weex_id_1320,R.id.weex_id_1319,R.id.weex_id_1318,R.id.weex_id_1317,R.id.weex_id_1316,R.id.weex_id_1315,R.id.weex_id_1314,R.id.weex_id_1313,R.id.weex_id_1312,R.id.weex_id_1311,R.id.weex_id_1310,R.id.weex_id_1309,R.id.weex_id_1308,R.id.weex_id_1307,R.id.weex_id_1306,R.id.weex_id_1305,R.id.weex_id_1304,R.id.weex_id_1303,R.id.weex_id_1302,R.id.weex_id_1301,R.id.weex_id_1300,
+ R.id.weex_id_1299,R.id.weex_id_1298,R.id.weex_id_1297,R.id.weex_id_1296,R.id.weex_id_1295,R.id.weex_id_1294,R.id.weex_id_1293,R.id.weex_id_1292,R.id.weex_id_1291,R.id.weex_id_1290,R.id.weex_id_1289,R.id.weex_id_1288,R.id.weex_id_1287,R.id.weex_id_1286,R.id.weex_id_1285,R.id.weex_id_1284,R.id.weex_id_1283,R.id.weex_id_1282,R.id.weex_id_1281,R.id.weex_id_1280,R.id.weex_id_1279,R.id.weex_id_1278,R.id.weex_id_1277,R.id.weex_id_1276,R.id.weex_id_1275,R.id.weex_id_1274,R.id.weex_id_1273,R.id.weex_id_1272,R.id.weex_id_1271,R.id.weex_id_1270,R.id.weex_id_1269,R.id.weex_id_1268,R.id.weex_id_1267,R.id.weex_id_1266,R.id.weex_id_1265,R.id.weex_id_1264,R.id.weex_id_1263,R.id.weex_id_1262,R.id.weex_id_1261,R.id.weex_id_1260,R.id.weex_id_1259,R.id.weex_id_1258,R.id.weex_id_1257,R.id.weex_id_1256,R.id.weex_id_1255,R.id.weex_id_1254,R.id.weex_id_1253,R.id.weex_id_1252,R.id.weex_id_1251,R.id.weex_id_1250,R.id.weex_id_1249,R.id.weex_id_1248,R.id.weex_id_1247,R.id.weex_id_1246,R.id.weex_id_1245,R.id.weex_id_1244,R.id.weex_id_1243,R.id.weex_id_1242,R.id.weex_id_1241,R.id.weex_id_1240,R.id.weex_id_1239,R.id.weex_id_1238,R.id.weex_id_1237,R.id.weex_id_1236,R.id.weex_id_1235,R.id.weex_id_1234,R.id.weex_id_1233,R.id.weex_id_1232,R.id.weex_id_1231,R.id.weex_id_1230,R.id.weex_id_1229,R.id.weex_id_1228,R.id.weex_id_1227,R.id.weex_id_1226,R.id.weex_id_1225,R.id.weex_id_1224,R.id.weex_id_1223,R.id.weex_id_1222,R.id.weex_id_1221,R.id.weex_id_1220,R.id.weex_id_1219,R.id.weex_id_1218,R.id.weex_id_1217,R.id.weex_id_1216,R.id.weex_id_1215,R.id.weex_id_1214,R.id.weex_id_1213,R.id.weex_id_1212,R.id.weex_id_1211,R.id.weex_id_1210,R.id.weex_id_1209,R.id.weex_id_1208,R.id.weex_id_1207,R.id.weex_id_1206,R.id.weex_id_1205,R.id.weex_id_1204,R.id.weex_id_1203,R.id.weex_id_1202,R.id.weex_id_1201,R.id.weex_id_1200,
+ R.id.weex_id_1199,R.id.weex_id_1198,R.id.weex_id_1197,R.id.weex_id_1196,R.id.weex_id_1195,R.id.weex_id_1194,R.id.weex_id_1193,R.id.weex_id_1192,R.id.weex_id_1191,R.id.weex_id_1190,R.id.weex_id_1189,R.id.weex_id_1188,R.id.weex_id_1187,R.id.weex_id_1186,R.id.weex_id_1185,R.id.weex_id_1184,R.id.weex_id_1183,R.id.weex_id_1182,R.id.weex_id_1181,R.id.weex_id_1180,R.id.weex_id_1179,R.id.weex_id_1178,R.id.weex_id_1177,R.id.weex_id_1176,R.id.weex_id_1175,R.id.weex_id_1174,R.id.weex_id_1173,R.id.weex_id_1172,R.id.weex_id_1171,R.id.weex_id_1170,R.id.weex_id_1169,R.id.weex_id_1168,R.id.weex_id_1167,R.id.weex_id_1166,R.id.weex_id_1165,R.id.weex_id_1164,R.id.weex_id_1163,R.id.weex_id_1162,R.id.weex_id_1161,R.id.weex_id_1160,R.id.weex_id_1159,R.id.weex_id_1158,R.id.weex_id_1157,R.id.weex_id_1156,R.id.weex_id_1155,R.id.weex_id_1154,R.id.weex_id_1153,R.id.weex_id_1152,R.id.weex_id_1151,R.id.weex_id_1150,R.id.weex_id_1149,R.id.weex_id_1148,R.id.weex_id_1147,R.id.weex_id_1146,R.id.weex_id_1145,R.id.weex_id_1144,R.id.weex_id_1143,R.id.weex_id_1142,R.id.weex_id_1141,R.id.weex_id_1140,R.id.weex_id_1139,R.id.weex_id_1138,R.id.weex_id_1137,R.id.weex_id_1136,R.id.weex_id_1135,R.id.weex_id_1134,R.id.weex_id_1133,R.id.weex_id_1132,R.id.weex_id_1131,R.id.weex_id_1130,R.id.weex_id_1129,R.id.weex_id_1128,R.id.weex_id_1127,R.id.weex_id_1126,R.id.weex_id_1125,R.id.weex_id_1124,R.id.weex_id_1123,R.id.weex_id_1122,R.id.weex_id_1121,R.id.weex_id_1120,R.id.weex_id_1119,R.id.weex_id_1118,R.id.weex_id_1117,R.id.weex_id_1116,R.id.weex_id_1115,R.id.weex_id_1114,R.id.weex_id_1113,R.id.weex_id_1112,R.id.weex_id_1111,R.id.weex_id_1110,R.id.weex_id_1109,R.id.weex_id_1108,R.id.weex_id_1107,R.id.weex_id_1106,R.id.weex_id_1105,R.id.weex_id_1104,R.id.weex_id_1103,R.id.weex_id_1102,R.id.weex_id_1101,R.id.weex_id_1100,
+ R.id.weex_id_1099,R.id.weex_id_1098,R.id.weex_id_1097,R.id.weex_id_1096,R.id.weex_id_1095,R.id.weex_id_1094,R.id.weex_id_1093,R.id.weex_id_1092,R.id.weex_id_1091,R.id.weex_id_1090,R.id.weex_id_1089,R.id.weex_id_1088,R.id.weex_id_1087,R.id.weex_id_1086,R.id.weex_id_1085,R.id.weex_id_1084,R.id.weex_id_1083,R.id.weex_id_1082,R.id.weex_id_1081,R.id.weex_id_1080,R.id.weex_id_1079,R.id.weex_id_1078,R.id.weex_id_1077,R.id.weex_id_1076,R.id.weex_id_1075,R.id.weex_id_1074,R.id.weex_id_1073,R.id.weex_id_1072,R.id.weex_id_1071,R.id.weex_id_1070,R.id.weex_id_1069,R.id.weex_id_1068,R.id.weex_id_1067,R.id.weex_id_1066,R.id.weex_id_1065,R.id.weex_id_1064,R.id.weex_id_1063,R.id.weex_id_1062,R.id.weex_id_1061,R.id.weex_id_1060,R.id.weex_id_1059,R.id.weex_id_1058,R.id.weex_id_1057,R.id.weex_id_1056,R.id.weex_id_1055,R.id.weex_id_1054,R.id.weex_id_1053,R.id.weex_id_1052,R.id.weex_id_1051,R.id.weex_id_1050,R.id.weex_id_1049,R.id.weex_id_1048,R.id.weex_id_1047,R.id.weex_id_1046,R.id.weex_id_1045,R.id.weex_id_1044,R.id.weex_id_1043,R.id.weex_id_1042,R.id.weex_id_1041,R.id.weex_id_1040,R.id.weex_id_1039,R.id.weex_id_1038,R.id.weex_id_1037,R.id.weex_id_1036,R.id.weex_id_1035,R.id.weex_id_1034,R.id.weex_id_1033,R.id.weex_id_1032,R.id.weex_id_1031,R.id.weex_id_1030,R.id.weex_id_1029,R.id.weex_id_1028,R.id.weex_id_1027,R.id.weex_id_1026,R.id.weex_id_1025,R.id.weex_id_1024,R.id.weex_id_1023,R.id.weex_id_1022,R.id.weex_id_1021,R.id.weex_id_1020,R.id.weex_id_1019,R.id.weex_id_1018,R.id.weex_id_1017,R.id.weex_id_1016,R.id.weex_id_1015,R.id.weex_id_1014,R.id.weex_id_1013,R.id.weex_id_1012,R.id.weex_id_1011,R.id.weex_id_1010,R.id.weex_id_1009,R.id.weex_id_1008,R.id.weex_id_1007,R.id.weex_id_1006,R.id.weex_id_1005,R.id.weex_id_1004,R.id.weex_id_1003,R.id.weex_id_1002,R.id.weex_id_1001,R.id.weex_id_1000,
+ R.id.weex_id_999,R.id.weex_id_998,R.id.weex_id_997,R.id.weex_id_996,R.id.weex_id_995,R.id.weex_id_994,R.id.weex_id_993,R.id.weex_id_992,R.id.weex_id_991,R.id.weex_id_990,R.id.weex_id_989,R.id.weex_id_988,R.id.weex_id_987,R.id.weex_id_986,R.id.weex_id_985,R.id.weex_id_984,R.id.weex_id_983,R.id.weex_id_982,R.id.weex_id_981,R.id.weex_id_980,R.id.weex_id_979,R.id.weex_id_978,R.id.weex_id_977,R.id.weex_id_976,R.id.weex_id_975,R.id.weex_id_974,R.id.weex_id_973,R.id.weex_id_972,R.id.weex_id_971,R.id.weex_id_970,R.id.weex_id_969,R.id.weex_id_968,R.id.weex_id_967,R.id.weex_id_966,R.id.weex_id_965,R.id.weex_id_964,R.id.weex_id_963,R.id.weex_id_962,R.id.weex_id_961,R.id.weex_id_960,R.id.weex_id_959,R.id.weex_id_958,R.id.weex_id_957,R.id.weex_id_956,R.id.weex_id_955,R.id.weex_id_954,R.id.weex_id_953,R.id.weex_id_952,R.id.weex_id_951,R.id.weex_id_950,R.id.weex_id_949,R.id.weex_id_948,R.id.weex_id_947,R.id.weex_id_946,R.id.weex_id_945,R.id.weex_id_944,R.id.weex_id_943,R.id.weex_id_942,R.id.weex_id_941,R.id.weex_id_940,R.id.weex_id_939,R.id.weex_id_938,R.id.weex_id_937,R.id.weex_id_936,R.id.weex_id_935,R.id.weex_id_934,R.id.weex_id_933,R.id.weex_id_932,R.id.weex_id_931,R.id.weex_id_930,R.id.weex_id_929,R.id.weex_id_928,R.id.weex_id_927,R.id.weex_id_926,R.id.weex_id_925,R.id.weex_id_924,R.id.weex_id_923,R.id.weex_id_922,R.id.weex_id_921,R.id.weex_id_920,R.id.weex_id_919,R.id.weex_id_918,R.id.weex_id_917,R.id.weex_id_916,R.id.weex_id_915,R.id.weex_id_914,R.id.weex_id_913,R.id.weex_id_912,R.id.weex_id_911,R.id.weex_id_910,R.id.weex_id_909,R.id.weex_id_908,R.id.weex_id_907,R.id.weex_id_906,R.id.weex_id_905,R.id.weex_id_904,R.id.weex_id_903,R.id.weex_id_902,R.id.weex_id_901,R.id.weex_id_900,
+ R.id.weex_id_899,R.id.weex_id_898,R.id.weex_id_897,R.id.weex_id_896,R.id.weex_id_895,R.id.weex_id_894,R.id.weex_id_893,R.id.weex_id_892,R.id.weex_id_891,R.id.weex_id_890,R.id.weex_id_889,R.id.weex_id_888,R.id.weex_id_887,R.id.weex_id_886,R.id.weex_id_885,R.id.weex_id_884,R.id.weex_id_883,R.id.weex_id_882,R.id.weex_id_881,R.id.weex_id_880,R.id.weex_id_879,R.id.weex_id_878,R.id.weex_id_877,R.id.weex_id_876,R.id.weex_id_875,R.id.weex_id_874,R.id.weex_id_873,R.id.weex_id_872,R.id.weex_id_871,R.id.weex_id_870,R.id.weex_id_869,R.id.weex_id_868,R.id.weex_id_867,R.id.weex_id_866,R.id.weex_id_865,R.id.weex_id_864,R.id.weex_id_863,R.id.weex_id_862,R.id.weex_id_861,R.id.weex_id_860,R.id.weex_id_859,R.id.weex_id_858,R.id.weex_id_857,R.id.weex_id_856,R.id.weex_id_855,R.id.weex_id_854,R.id.weex_id_853,R.id.weex_id_852,R.id.weex_id_851,R.id.weex_id_850,R.id.weex_id_849,R.id.weex_id_848,R.id.weex_id_847,R.id.weex_id_846,R.id.weex_id_845,R.id.weex_id_844,R.id.weex_id_843,R.id.weex_id_842,R.id.weex_id_841,R.id.weex_id_840,R.id.weex_id_839,R.id.weex_id_838,R.id.weex_id_837,R.id.weex_id_836,R.id.weex_id_835,R.id.weex_id_834,R.id.weex_id_833,R.id.weex_id_832,R.id.weex_id_831,R.id.weex_id_830,R.id.weex_id_829,R.id.weex_id_828,R.id.weex_id_827,R.id.weex_id_826,R.id.weex_id_825,R.id.weex_id_824,R.id.weex_id_823,R.id.weex_id_822,R.id.weex_id_821,R.id.weex_id_820,R.id.weex_id_819,R.id.weex_id_818,R.id.weex_id_817,R.id.weex_id_816,R.id.weex_id_815,R.id.weex_id_814,R.id.weex_id_813,R.id.weex_id_812,R.id.weex_id_811,R.id.weex_id_810,R.id.weex_id_809,R.id.weex_id_808,R.id.weex_id_807,R.id.weex_id_806,R.id.weex_id_805,R.id.weex_id_804,R.id.weex_id_803,R.id.weex_id_802,R.id.weex_id_801,R.id.weex_id_800,
+ R.id.weex_id_799,R.id.weex_id_798,R.id.weex_id_797,R.id.weex_id_796,R.id.weex_id_795,R.id.weex_id_794,R.id.weex_id_793,R.id.weex_id_792,R.id.weex_id_791,R.id.weex_id_790,R.id.weex_id_789,R.id.weex_id_788,R.id.weex_id_787,R.id.weex_id_786,R.id.weex_id_785,R.id.weex_id_784,R.id.weex_id_783,R.id.weex_id_782,R.id.weex_id_781,R.id.weex_id_780,R.id.weex_id_779,R.id.weex_id_778,R.id.weex_id_777,R.id.weex_id_776,R.id.weex_id_775,R.id.weex_id_774,R.id.weex_id_773,R.id.weex_id_772,R.id.weex_id_771,R.id.weex_id_770,R.id.weex_id_769,R.id.weex_id_768,R.id.weex_id_767,R.id.weex_id_766,R.id.weex_id_765,R.id.weex_id_764,R.id.weex_id_763,R.id.weex_id_762,R.id.weex_id_761,R.id.weex_id_760,R.id.weex_id_759,R.id.weex_id_758,R.id.weex_id_757,R.id.weex_id_756,R.id.weex_id_755,R.id.weex_id_754,R.id.weex_id_753,R.id.weex_id_752,R.id.weex_id_751,R.id.weex_id_750,R.id.weex_id_749,R.id.weex_id_748,R.id.weex_id_747,R.id.weex_id_746,R.id.weex_id_745,R.id.weex_id_744,R.id.weex_id_743,R.id.weex_id_742,R.id.weex_id_741,R.id.weex_id_740,R.id.weex_id_739,R.id.weex_id_738,R.id.weex_id_737,R.id.weex_id_736,R.id.weex_id_735,R.id.weex_id_734,R.id.weex_id_733,R.id.weex_id_732,R.id.weex_id_731,R.id.weex_id_730,R.id.weex_id_729,R.id.weex_id_728,R.id.weex_id_727,R.id.weex_id_726,R.id.weex_id_725,R.id.weex_id_724,R.id.weex_id_723,R.id.weex_id_722,R.id.weex_id_721,R.id.weex_id_720,R.id.weex_id_719,R.id.weex_id_718,R.id.weex_id_717,R.id.weex_id_716,R.id.weex_id_715,R.id.weex_id_714,R.id.weex_id_713,R.id.weex_id_712,R.id.weex_id_711,R.id.weex_id_710,R.id.weex_id_709,R.id.weex_id_708,R.id.weex_id_707,R.id.weex_id_706,R.id.weex_id_705,R.id.weex_id_704,R.id.weex_id_703,R.id.weex_id_702,R.id.weex_id_701,R.id.weex_id_700,
+ R.id.weex_id_699,R.id.weex_id_698,R.id.weex_id_697,R.id.weex_id_696,R.id.weex_id_695,R.id.weex_id_694,R.id.weex_id_693,R.id.weex_id_692,R.id.weex_id_691,R.id.weex_id_690,R.id.weex_id_689,R.id.weex_id_688,R.id.weex_id_687,R.id.weex_id_686,R.id.weex_id_685,R.id.weex_id_684,R.id.weex_id_683,R.id.weex_id_682,R.id.weex_id_681,R.id.weex_id_680,R.id.weex_id_679,R.id.weex_id_678,R.id.weex_id_677,R.id.weex_id_676,R.id.weex_id_675,R.id.weex_id_674,R.id.weex_id_673,R.id.weex_id_672,R.id.weex_id_671,R.id.weex_id_670,R.id.weex_id_669,R.id.weex_id_668,R.id.weex_id_667,R.id.weex_id_666,R.id.weex_id_665,R.id.weex_id_664,R.id.weex_id_663,R.id.weex_id_662,R.id.weex_id_661,R.id.weex_id_660,R.id.weex_id_659,R.id.weex_id_658,R.id.weex_id_657,R.id.weex_id_656,R.id.weex_id_655,R.id.weex_id_654,R.id.weex_id_653,R.id.weex_id_652,R.id.weex_id_651,R.id.weex_id_650,R.id.weex_id_649,R.id.weex_id_648,R.id.weex_id_647,R.id.weex_id_646,R.id.weex_id_645,R.id.weex_id_644,R.id.weex_id_643,R.id.weex_id_642,R.id.weex_id_641,R.id.weex_id_640,R.id.weex_id_639,R.id.weex_id_638,R.id.weex_id_637,R.id.weex_id_636,R.id.weex_id_635,R.id.weex_id_634,R.id.weex_id_633,R.id.weex_id_632,R.id.weex_id_631,R.id.weex_id_630,R.id.weex_id_629,R.id.weex_id_628,R.id.weex_id_627,R.id.weex_id_626,R.id.weex_id_625,R.id.weex_id_624,R.id.weex_id_623,R.id.weex_id_622,R.id.weex_id_621,R.id.weex_id_620,R.id.weex_id_619,R.id.weex_id_618,R.id.weex_id_617,R.id.weex_id_616,R.id.weex_id_615,R.id.weex_id_614,R.id.weex_id_613,R.id.weex_id_612,R.id.weex_id_611,R.id.weex_id_610,R.id.weex_id_609,R.id.weex_id_608,R.id.weex_id_607,R.id.weex_id_606,R.id.weex_id_605,R.id.weex_id_604,R.id.weex_id_603,R.id.weex_id_602,R.id.weex_id_601,R.id.weex_id_600,
+ R.id.weex_id_599,R.id.weex_id_598,R.id.weex_id_597,R.id.weex_id_596,R.id.weex_id_595,R.id.weex_id_594,R.id.weex_id_593,R.id.weex_id_592,R.id.weex_id_591,R.id.weex_id_590,R.id.weex_id_589,R.id.weex_id_588,R.id.weex_id_587,R.id.weex_id_586,R.id.weex_id_585,R.id.weex_id_584,R.id.weex_id_583,R.id.weex_id_582,R.id.weex_id_581,R.id.weex_id_580,R.id.weex_id_579,R.id.weex_id_578,R.id.weex_id_577,R.id.weex_id_576,R.id.weex_id_575,R.id.weex_id_574,R.id.weex_id_573,R.id.weex_id_572,R.id.weex_id_571,R.id.weex_id_570,R.id.weex_id_569,R.id.weex_id_568,R.id.weex_id_567,R.id.weex_id_566,R.id.weex_id_565,R.id.weex_id_564,R.id.weex_id_563,R.id.weex_id_562,R.id.weex_id_561,R.id.weex_id_560,R.id.weex_id_559,R.id.weex_id_558,R.id.weex_id_557,R.id.weex_id_556,R.id.weex_id_555,R.id.weex_id_554,R.id.weex_id_553,R.id.weex_id_552,R.id.weex_id_551,R.id.weex_id_550,R.id.weex_id_549,R.id.weex_id_548,R.id.weex_id_547,R.id.weex_id_546,R.id.weex_id_545,R.id.weex_id_544,R.id.weex_id_543,R.id.weex_id_542,R.id.weex_id_541,R.id.weex_id_540,R.id.weex_id_539,R.id.weex_id_538,R.id.weex_id_537,R.id.weex_id_536,R.id.weex_id_535,R.id.weex_id_534,R.id.weex_id_533,R.id.weex_id_532,R.id.weex_id_531,R.id.weex_id_530,R.id.weex_id_529,R.id.weex_id_528,R.id.weex_id_527,R.id.weex_id_526,R.id.weex_id_525,R.id.weex_id_524,R.id.weex_id_523,R.id.weex_id_522,R.id.weex_id_521,R.id.weex_id_520,R.id.weex_id_519,R.id.weex_id_518,R.id.weex_id_517,R.id.weex_id_516,R.id.weex_id_515,R.id.weex_id_514,R.id.weex_id_513,R.id.weex_id_512,R.id.weex_id_511,R.id.weex_id_510,R.id.weex_id_509,R.id.weex_id_508,R.id.weex_id_507,R.id.weex_id_506,R.id.weex_id_505,R.id.weex_id_504,R.id.weex_id_503,R.id.weex_id_502,R.id.weex_id_501,R.id.weex_id_500,
+ R.id.weex_id_499,R.id.weex_id_498,R.id.weex_id_497,R.id.weex_id_496,R.id.weex_id_495,R.id.weex_id_494,R.id.weex_id_493,R.id.weex_id_492,R.id.weex_id_491,R.id.weex_id_490,R.id.weex_id_489,R.id.weex_id_488,R.id.weex_id_487,R.id.weex_id_486,R.id.weex_id_485,R.id.weex_id_484,R.id.weex_id_483,R.id.weex_id_482,R.id.weex_id_481,R.id.weex_id_480,R.id.weex_id_479,R.id.weex_id_478,R.id.weex_id_477,R.id.weex_id_476,R.id.weex_id_475,R.id.weex_id_474,R.id.weex_id_473,R.id.weex_id_472,R.id.weex_id_471,R.id.weex_id_470,R.id.weex_id_469,R.id.weex_id_468,R.id.weex_id_467,R.id.weex_id_466,R.id.weex_id_465,R.id.weex_id_464,R.id.weex_id_463,R.id.weex_id_462,R.id.weex_id_461,R.id.weex_id_460,R.id.weex_id_459,R.id.weex_id_458,R.id.weex_id_457,R.id.weex_id_456,R.id.weex_id_455,R.id.weex_id_454,R.id.weex_id_453,R.id.weex_id_452,R.id.weex_id_451,R.id.weex_id_450,R.id.weex_id_449,R.id.weex_id_448,R.id.weex_id_447,R.id.weex_id_446,R.id.weex_id_445,R.id.weex_id_444,R.id.weex_id_443,R.id.weex_id_442,R.id.weex_id_441,R.id.weex_id_440,R.id.weex_id_439,R.id.weex_id_438,R.id.weex_id_437,R.id.weex_id_436,R.id.weex_id_435,R.id.weex_id_434,R.id.weex_id_433,R.id.weex_id_432,R.id.weex_id_431,R.id.weex_id_430,R.id.weex_id_429,R.id.weex_id_428,R.id.weex_id_427,R.id.weex_id_426,R.id.weex_id_425,R.id.weex_id_424,R.id.weex_id_423,R.id.weex_id_422,R.id.weex_id_421,R.id.weex_id_420,R.id.weex_id_419,R.id.weex_id_418,R.id.weex_id_417,R.id.weex_id_416,R.id.weex_id_415,R.id.weex_id_414,R.id.weex_id_413,R.id.weex_id_412,R.id.weex_id_411,R.id.weex_id_410,R.id.weex_id_409,R.id.weex_id_408,R.id.weex_id_407,R.id.weex_id_406,R.id.weex_id_405,R.id.weex_id_404,R.id.weex_id_403,R.id.weex_id_402,R.id.weex_id_401,R.id.weex_id_400,
+ R.id.weex_id_399,R.id.weex_id_398,R.id.weex_id_397,R.id.weex_id_396,R.id.weex_id_395,R.id.weex_id_394,R.id.weex_id_393,R.id.weex_id_392,R.id.weex_id_391,R.id.weex_id_390,R.id.weex_id_389,R.id.weex_id_388,R.id.weex_id_387,R.id.weex_id_386,R.id.weex_id_385,R.id.weex_id_384,R.id.weex_id_383,R.id.weex_id_382,R.id.weex_id_381,R.id.weex_id_380,R.id.weex_id_379,R.id.weex_id_378,R.id.weex_id_377,R.id.weex_id_376,R.id.weex_id_375,R.id.weex_id_374,R.id.weex_id_373,R.id.weex_id_372,R.id.weex_id_371,R.id.weex_id_370,R.id.weex_id_369,R.id.weex_id_368,R.id.weex_id_367,R.id.weex_id_366,R.id.weex_id_365,R.id.weex_id_364,R.id.weex_id_363,R.id.weex_id_362,R.id.weex_id_361,R.id.weex_id_360,R.id.weex_id_359,R.id.weex_id_358,R.id.weex_id_357,R.id.weex_id_356,R.id.weex_id_355,R.id.weex_id_354,R.id.weex_id_353,R.id.weex_id_352,R.id.weex_id_351,R.id.weex_id_350,R.id.weex_id_349,R.id.weex_id_348,R.id.weex_id_347,R.id.weex_id_346,R.id.weex_id_345,R.id.weex_id_344,R.id.weex_id_343,R.id.weex_id_342,R.id.weex_id_341,R.id.weex_id_340,R.id.weex_id_339,R.id.weex_id_338,R.id.weex_id_337,R.id.weex_id_336,R.id.weex_id_335,R.id.weex_id_334,R.id.weex_id_333,R.id.weex_id_332,R.id.weex_id_331,R.id.weex_id_330,R.id.weex_id_329,R.id.weex_id_328,R.id.weex_id_327,R.id.weex_id_326,R.id.weex_id_325,R.id.weex_id_324,R.id.weex_id_323,R.id.weex_id_322,R.id.weex_id_321,R.id.weex_id_320,R.id.weex_id_319,R.id.weex_id_318,R.id.weex_id_317,R.id.weex_id_316,R.id.weex_id_315,R.id.weex_id_314,R.id.weex_id_313,R.id.weex_id_312,R.id.weex_id_311,R.id.weex_id_310,R.id.weex_id_309,R.id.weex_id_308,R.id.weex_id_307,R.id.weex_id_306,R.id.weex_id_305,R.id.weex_id_304,R.id.weex_id_303,R.id.weex_id_302,R.id.weex_id_301,R.id.weex_id_300,
+ R.id.weex_id_299,R.id.weex_id_298,R.id.weex_id_297,R.id.weex_id_296,R.id.weex_id_295,R.id.weex_id_294,R.id.weex_id_293,R.id.weex_id_292,R.id.weex_id_291,R.id.weex_id_290,R.id.weex_id_289,R.id.weex_id_288,R.id.weex_id_287,R.id.weex_id_286,R.id.weex_id_285,R.id.weex_id_284,R.id.weex_id_283,R.id.weex_id_282,R.id.weex_id_281,R.id.weex_id_280,R.id.weex_id_279,R.id.weex_id_278,R.id.weex_id_277,R.id.weex_id_276,R.id.weex_id_275,R.id.weex_id_274,R.id.weex_id_273,R.id.weex_id_272,R.id.weex_id_271,R.id.weex_id_270,R.id.weex_id_269,R.id.weex_id_268,R.id.weex_id_267,R.id.weex_id_266,R.id.weex_id_265,R.id.weex_id_264,R.id.weex_id_263,R.id.weex_id_262,R.id.weex_id_261,R.id.weex_id_260,R.id.weex_id_259,R.id.weex_id_258,R.id.weex_id_257,R.id.weex_id_256,R.id.weex_id_255,R.id.weex_id_254,R.id.weex_id_253,R.id.weex_id_252,R.id.weex_id_251,R.id.weex_id_250,R.id.weex_id_249,R.id.weex_id_248,R.id.weex_id_247,R.id.weex_id_246,R.id.weex_id_245,R.id.weex_id_244,R.id.weex_id_243,R.id.weex_id_242,R.id.weex_id_241,R.id.weex_id_240,R.id.weex_id_239,R.id.weex_id_238,R.id.weex_id_237,R.id.weex_id_236,R.id.weex_id_235,R.id.weex_id_234,R.id.weex_id_233,R.id.weex_id_232,R.id.weex_id_231,R.id.weex_id_230,R.id.weex_id_229,R.id.weex_id_228,R.id.weex_id_227,R.id.weex_id_226,R.id.weex_id_225,R.id.weex_id_224,R.id.weex_id_223,R.id.weex_id_222,R.id.weex_id_221,R.id.weex_id_220,R.id.weex_id_219,R.id.weex_id_218,R.id.weex_id_217,R.id.weex_id_216,R.id.weex_id_215,R.id.weex_id_214,R.id.weex_id_213,R.id.weex_id_212,R.id.weex_id_211,R.id.weex_id_210,R.id.weex_id_209,R.id.weex_id_208,R.id.weex_id_207,R.id.weex_id_206,R.id.weex_id_205,R.id.weex_id_204,R.id.weex_id_203,R.id.weex_id_202,R.id.weex_id_201,R.id.weex_id_200,
+ R.id.weex_id_199,R.id.weex_id_198,R.id.weex_id_197,R.id.weex_id_196,R.id.weex_id_195,R.id.weex_id_194,R.id.weex_id_193,R.id.weex_id_192,R.id.weex_id_191,R.id.weex_id_190,R.id.weex_id_189,R.id.weex_id_188,R.id.weex_id_187,R.id.weex_id_186,R.id.weex_id_185,R.id.weex_id_184,R.id.weex_id_183,R.id.weex_id_182,R.id.weex_id_181,R.id.weex_id_180,R.id.weex_id_179,R.id.weex_id_178,R.id.weex_id_177,R.id.weex_id_176,R.id.weex_id_175,R.id.weex_id_174,R.id.weex_id_173,R.id.weex_id_172,R.id.weex_id_171,R.id.weex_id_170,R.id.weex_id_169,R.id.weex_id_168,R.id.weex_id_167,R.id.weex_id_166,R.id.weex_id_165,R.id.weex_id_164,R.id.weex_id_163,R.id.weex_id_162,R.id.weex_id_161,R.id.weex_id_160,R.id.weex_id_159,R.id.weex_id_158,R.id.weex_id_157,R.id.weex_id_156,R.id.weex_id_155,R.id.weex_id_154,R.id.weex_id_153,R.id.weex_id_152,R.id.weex_id_151,R.id.weex_id_150,R.id.weex_id_149,R.id.weex_id_148,R.id.weex_id_147,R.id.weex_id_146,R.id.weex_id_145,R.id.weex_id_144,R.id.weex_id_143,R.id.weex_id_142,R.id.weex_id_141,R.id.weex_id_140,R.id.weex_id_139,R.id.weex_id_138,R.id.weex_id_137,R.id.weex_id_136,R.id.weex_id_135,R.id.weex_id_134,R.id.weex_id_133,R.id.weex_id_132,R.id.weex_id_131,R.id.weex_id_130,R.id.weex_id_129,R.id.weex_id_128,R.id.weex_id_127,R.id.weex_id_126,R.id.weex_id_125,R.id.weex_id_124,R.id.weex_id_123,R.id.weex_id_122,R.id.weex_id_121,R.id.weex_id_120,R.id.weex_id_119,R.id.weex_id_118,R.id.weex_id_117,R.id.weex_id_116,R.id.weex_id_115,R.id.weex_id_114,R.id.weex_id_113,R.id.weex_id_112,R.id.weex_id_111,R.id.weex_id_110,R.id.weex_id_109,R.id.weex_id_108,R.id.weex_id_107,R.id.weex_id_106,R.id.weex_id_105,R.id.weex_id_104,R.id.weex_id_103,R.id.weex_id_102,R.id.weex_id_101,R.id.weex_id_100,
+ R.id.weex_id_99,R.id.weex_id_98,R.id.weex_id_97,R.id.weex_id_96,R.id.weex_id_95,R.id.weex_id_94,R.id.weex_id_93,R.id.weex_id_92,R.id.weex_id_91,R.id.weex_id_90,R.id.weex_id_89,R.id.weex_id_88,R.id.weex_id_87,R.id.weex_id_86,R.id.weex_id_85,R.id.weex_id_84,R.id.weex_id_83,R.id.weex_id_82,R.id.weex_id_81,R.id.weex_id_80,R.id.weex_id_79,R.id.weex_id_78,R.id.weex_id_77,R.id.weex_id_76,R.id.weex_id_75,R.id.weex_id_74,R.id.weex_id_73,R.id.weex_id_72,R.id.weex_id_71,R.id.weex_id_70,R.id.weex_id_69,R.id.weex_id_68,R.id.weex_id_67,R.id.weex_id_66,R.id.weex_id_65,R.id.weex_id_64,R.id.weex_id_63,R.id.weex_id_62,R.id.weex_id_61,R.id.weex_id_60,R.id.weex_id_59,R.id.weex_id_58,R.id.weex_id_57,R.id.weex_id_56,R.id.weex_id_55,R.id.weex_id_54,R.id.weex_id_53,R.id.weex_id_52,R.id.weex_id_51,R.id.weex_id_50,R.id.weex_id_49,R.id.weex_id_48,R.id.weex_id_47,R.id.weex_id_46,R.id.weex_id_45,R.id.weex_id_44,R.id.weex_id_43,R.id.weex_id_42,R.id.weex_id_41,R.id.weex_id_40,R.id.weex_id_39,R.id.weex_id_38,R.id.weex_id_37,R.id.weex_id_36,R.id.weex_id_35,R.id.weex_id_34,R.id.weex_id_33,R.id.weex_id_32,R.id.weex_id_31,R.id.weex_id_30,R.id.weex_id_29,R.id.weex_id_28,R.id.weex_id_27,R.id.weex_id_26,R.id.weex_id_25,R.id.weex_id_24,R.id.weex_id_23,R.id.weex_id_22,R.id.weex_id_21,R.id.weex_id_20,R.id.weex_id_19,R.id.weex_id_18,R.id.weex_id_17,R.id.weex_id_16,R.id.weex_id_15,R.id.weex_id_14,R.id.weex_id_13,R.id.weex_id_12,R.id.weex_id_11,R.id.weex_id_10,R.id.weex_id_9,R.id.weex_id_8,R.id.weex_id_7,R.id.weex_id_6,R.id.weex_id_5,R.id.weex_id_4,R.id.weex_id_3,R.id.weex_id_2,R.id.weex_id_1,R.id.weex_id_0
+ };
+
+ private static final int COUNT = ID_STUBS.length;
+ private static int sCurrentIDIndex = 0;
+
+ public static Pair<String,Integer> nextID(){
+ Pair<String,Integer> result = new Pair<>("weex_id_"+(COUNT-1-sCurrentIDIndex),ID_STUBS[sCurrentIDIndex]);
+ sCurrentIDIndex = (sCurrentIDIndex+1)%COUNT;
+ return result;
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/WXApplication.java b/android/playground/src/main/java/com/alibaba/weex/WXApplication.java
new file mode 100644
index 0000000..b5f6b3d
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/WXApplication.java
@@ -0,0 +1,207 @@
+/*
+ * 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;
+
+import android.app.Activity;
+import android.app.Application;
+import android.os.Bundle;
+import android.util.Log;
+import android.support.multidex.MultiDex;
+import android.text.TextUtils;
+import com.alibaba.android.bindingx.plugin.weex.BindingX;
+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.commons.adapter.PicassoBasedDrawableLoader;
+import com.alibaba.weex.extend.adapter.ApmGenerator;
+import com.alibaba.weex.extend.adapter.DefaultAccessibilityRoleAdapter;
+import com.alibaba.weex.extend.adapter.DefaultConfigAdapter;
+import com.alibaba.weex.extend.adapter.InterceptWXHttpAdapter;
+import com.alibaba.weex.extend.adapter.WXAnalyzerDemoListener;
+import com.alibaba.weex.extend.component.WXComponentSyncTest;
+import com.alibaba.weex.extend.component.WXMask;
+import com.alibaba.weex.extend.component.WXParallax;
+import com.alibaba.weex.extend.module.GeolocationModule;
+import com.alibaba.weex.extend.module.MyModule;
+import com.alibaba.weex.extend.module.RenderModule;
+import com.alibaba.weex.extend.module.SyncTestModule;
+import com.alibaba.weex.extend.module.WXEventModule;
+import com.alibaba.weex.extend.module.WXTitleBar;
+import com.alibaba.weex.extend.module.WXWsonTestModule;
+import com.facebook.drawee.backends.pipeline.Fresco;
+import com.taobao.weex.InitConfig;
+import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKEngine;
+import com.taobao.weex.WXSDKManager;
+import com.taobao.weex.bridge.WXBridgeManager;
+import com.taobao.weex.common.WXException;
+import com.taobao.weex.performance.WXAnalyzerDataTransfer;
+
+import java.lang.reflect.Method;
+
+public class WXApplication extends Application {
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ MultiDex.install(this);
+ /**
+ * Set up for fresco usage.
+ * Set<RequestListener> requestListeners = new HashSet<>();
+ * requestListeners.add(new RequestLoggingListener());
+ * ImagePipelineConfig config = ImagePipelineConfig.newBuilder(this)
+ * .setRequestListeners(requestListeners)
+ * .build();
+ * Fresco.initialize(this,config);
+ **/
+// initDebugEnvironment(true, false, "DEBUG_SERVER_HOST");
+ WXBridgeManager.updateGlobalConfig("wson_on");
+ WXEnvironment.setOpenDebugLog(true);
+ WXEnvironment.setApkDebugable(true);
+ WXSDKEngine.addCustomOptions("appName", "WXSample");
+ WXSDKEngine.addCustomOptions("appGroup", "WXApp");
+ InitConfig.Builder builder = new InitConfig.Builder()
+ //.setImgAdapter(new FrescoImageAdapter())// use fresco adapter
+ .setImgAdapter(new ImageAdapter())
+ .setDrawableLoader(new PicassoBasedDrawableLoader(getApplicationContext()))
+ .setWebSocketAdapterFactory(new DefaultWebSocketAdapterFactory())
+ .setJSExceptionAdapter(new JSExceptionAdapter())
+ .setHttpAdapter(new InterceptWXHttpAdapter())
+ .setApmGenerater(new ApmGenerator());
+ if(!TextUtils.isEmpty(BuildConfig.externalLibraryName)){
+ builder.addNativeLibrary(BuildConfig.externalLibraryName);
+ }
+ WXSDKManager.getInstance().setWxConfigAdapter(new DefaultConfigAdapter());
+ WXSDKEngine.initialize(this, builder.build());
+ WXSDKManager.getInstance().addWXAnalyzer(new WXAnalyzerDemoListener());
+ WXAnalyzerDataTransfer.isOpenPerformance = false;
+
+ WXSDKManager.getInstance().setAccessibilityRoleAdapter(new DefaultAccessibilityRoleAdapter());
+
+ try {
+ Fresco.initialize(this);
+ WXSDKEngine.registerComponent("synccomponent", WXComponentSyncTest.class);
+ WXSDKEngine.registerComponent(WXParallax.PARALLAX, WXParallax.class);
+
+ WXSDKEngine.registerModule("render", RenderModule.class);
+ WXSDKEngine.registerModule("event", WXEventModule.class);
+ WXSDKEngine.registerModule("syncTest", SyncTestModule.class);
+
+ WXSDKEngine.registerComponent("mask",WXMask.class);
+ WXSDKEngine.registerModule("myModule", MyModule.class);
+ WXSDKEngine.registerModule("geolocation", GeolocationModule.class);
+
+ WXSDKEngine.registerModule("titleBar", WXTitleBar.class);
+
+ WXSDKEngine.registerModule("wsonTest", WXWsonTestModule.class);
+
+ BindingX.register();
+
+ /**
+ * override default image tag
+ * WXSDKEngine.registerComponent("image", FrescoImageComponent.class);
+ */
+
+ //Typeface nativeFont = Typeface.createFromAsset(getAssets(), "font/native_font.ttf");
+ //WXEnvironment.setGlobalFontFamily("bolezhusun", nativeFont);
+
+ startHeron();
+
+ } catch (WXException e) {
+ e.printStackTrace();
+ }
+
+ registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
+ @Override
+ public void onActivityCreated(Activity activity, Bundle bundle) {
+
+ }
+
+ @Override
+ public void onActivityStarted(Activity activity) {
+
+ }
+
+ @Override
+ public void onActivityResumed(Activity activity) {
+
+ }
+
+ @Override
+ public void onActivityPaused(Activity activity) {
+
+ }
+
+ @Override
+ public void onActivityStopped(Activity activity) {
+
+ }
+
+ @Override
+ public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
+
+ }
+
+ @Override
+ public void onActivityDestroyed(Activity activity) {
+ // The demo code of calling 'notifyTrimMemory()'
+ if (false) {
+ // We assume that the application is on an idle time.
+ WXSDKManager.getInstance().notifyTrimMemory();
+ }
+ // The demo code of calling 'notifySerializeCodeCache()'
+ if (false) {
+ WXSDKManager.getInstance().notifySerializeCodeCache();
+ }
+ }
+ });
+
+ }
+
+ /**
+ *@param connectable debug server is connectable or not.
+ * if true, sdk will try to connect remote debug server when init WXBridge.
+ *
+ * @param debuggable enable remote debugger. valid only if host not to be "DEBUG_SERVER_HOST".
+ * true, you can launch a remote debugger and inspector both.
+ * false, you can just launch a inspector.
+ * @param host the debug server host, must not be "DEBUG_SERVER_HOST", a ip address or domain will be OK.
+ * for example "127.0.0.1".
+ */
+ private void initDebugEnvironment(boolean connectable, boolean debuggable, String host) {
+ if (!"DEBUG_SERVER_HOST".equals(host)) {
+ WXEnvironment.sDebugServerConnectable = connectable;
+ WXEnvironment.sRemoteDebugMode = debuggable;
+ WXEnvironment.sRemoteDebugProxyUrl = "ws://" + host + ":8088/debugProxy/native";
+ }
+ }
+
+ private void startHeron(){
+ try{
+ Class<?> heronInitClass = getClassLoader().loadClass("com/taobao/weex/heron/picasso/RenderPicassoInit");
+ Method method = heronInitClass.getMethod("initApplication", Application.class);
+ method.setAccessible(true);
+ method.invoke(null,this);
+ Log.e("Weex", "Weex Heron Render Init Success");
+ }catch (Exception e){
+ Log.e("Weex", "Weex Heron Render Mode Not Found", e);
+ }
+ }
+
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/WXBaseActivity.java b/android/playground/src/main/java/com/alibaba/weex/WXBaseActivity.java
new file mode 100644
index 0000000..c973756
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/WXBaseActivity.java
@@ -0,0 +1,31 @@
+/*
+ * 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;
+
+import android.os.Bundle;
+import android.os.PersistableBundle;
+import android.support.v7.app.AppCompatActivity;
+
+public abstract class WXBaseActivity extends AppCompatActivity {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
+ super.onCreate(savedInstanceState, persistentState);
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/WXPageActivity.java b/android/playground/src/main/java/com/alibaba/weex/WXPageActivity.java
new file mode 100644
index 0000000..68fd922
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/WXPageActivity.java
@@ -0,0 +1,674 @@
+/*
+ * 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;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.graphics.PixelFormat;
+import android.graphics.Rect;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.support.annotation.NonNull;
+import android.support.v4.util.ArrayMap;
+import android.support.v7.app.ActionBar;
+import android.support.v7.widget.Toolbar;
+import android.text.TextUtils;
+import android.util.Log;
+import android.util.Pair;
+import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ProgressBar;
+import android.widget.Toast;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.weex.commons.WXAnalyzerDelegate;
+import com.alibaba.weex.constants.Constants;
+import com.alibaba.weex.https.HotRefreshManager;
+import com.alibaba.weex.https.WXHttpManager;
+import com.alibaba.weex.https.WXHttpTask;
+import com.alibaba.weex.https.WXRequestListener;
+import com.taobao.weex.IWXRenderListener;
+import com.taobao.weex.RenderContainer;
+import com.taobao.weex.WXSDKEngine;
+import com.taobao.weex.WXSDKInstance;
+import com.taobao.weex.appfram.navigator.IActivityNavBarSetter;
+import com.taobao.weex.common.RenderTypes;
+import com.taobao.weex.common.WXRenderStrategy;
+import com.taobao.weex.render.WXAbstractRenderContainer;
+import com.taobao.weex.ui.component.NestedContainer;
+import com.taobao.weex.ui.component.WXComponent;
+import com.taobao.weex.ui.component.WXVContainer;
+import com.taobao.weex.utils.WXFileUtils;
+import com.taobao.weex.utils.WXLogUtils;
+import java.io.File;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.Constructor;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+
+public class WXPageActivity extends WXBaseActivity implements IWXRenderListener, Handler.Callback, WXSDKInstance.NestedInstanceInterceptor {
+
+ private static final String TAG = "WXPageActivity";
+ public static final String WXPAGE = "wxpage";
+ public static Activity wxPageActivityInstance;
+ private ViewGroup mContainer;
+ private ProgressBar mProgressBar;
+ private WXSDKInstance mInstance;
+ private Handler mWXHandler;
+ private BroadcastReceiver mReceiver;
+ private Uri mUri;
+ private HashMap mConfigMap = new HashMap<String, Object>();
+
+ @Override
+ public void onCreateNestInstance(WXSDKInstance instance, NestedContainer container) {
+ Log.d(TAG, "Nested Instance created.");
+ }
+
+ private WXAnalyzerDelegate mWxAnalyzerDelegate;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_wxpage);
+ setCurrentWxPageActivity(this);
+
+
+ WXSDKEngine.setActivityNavBarSetter(new NavigatorAdapter());
+ getWindow().setFormat(PixelFormat.TRANSLUCENT);
+ mUri = getIntent().getData();
+ Bundle bundle = getIntent().getExtras();
+ if (mUri == null && bundle == null) {
+ mUri = Uri.parse(Constants.BUNDLE_URL + Constants.WEEX_SAMPLES_KEY);
+ }
+ if (bundle != null) {
+ String bundleUrl = bundle.getString("bundleUrl");
+ Log.i(TAG, "bundleUrl==" + bundleUrl);
+
+ if (bundleUrl != null) {
+ mConfigMap.put("bundleUrl", bundleUrl + Constants.WEEX_SAMPLES_KEY);
+ mUri = Uri.parse(bundleUrl + Constants.WEEX_SAMPLES_KEY);
+
+ }
+ } else {
+ mConfigMap.put("bundleUrl", mUri.toString() + Constants.WEEX_SAMPLES_KEY);
+ // mUri = Uri.parse(mUri.toString() + Constants.WEEX_SAMPLES_KEY)
+ }
+
+ if (mUri == null) {
+ Toast.makeText(this, "the uri is empty!", Toast.LENGTH_SHORT).show();
+ finish();
+ return;
+ }
+
+ Log.e("TestScript_Guide mUri==", mUri.toString());
+ initUIAndData();
+
+ if(WXPAGE.equals(mUri.getScheme())||
+ TextUtils.equals("true",mUri.getQueryParameter("_wxpage"))) {
+ mUri = mUri.buildUpon().scheme("http").build();
+ loadWXfromService(mUri.toString());
+ startHotRefresh();
+ mWXHandler.removeCallbacks(mCollectIDMap);
+ mWXHandler.postDelayed(mCollectIDMap,2000);
+ }else if (TextUtils.equals("http", mUri.getScheme()) || TextUtils.equals("https", mUri.getScheme())) {
+ // if url has key "_wx_tpl" then get weex bundle js
+ String weexTpl = mUri.getQueryParameter(Constants.WEEX_TPL_KEY);
+ String url = TextUtils.isEmpty(weexTpl) ? mUri.toString() : weexTpl;
+ loadWXfromService(url);
+ startHotRefresh();
+ } else {
+ loadWXfromLocal(false);
+ }
+ mInstance.onActivityCreate();
+ registerBroadcastReceiver();
+
+ mWxAnalyzerDelegate = new WXAnalyzerDelegate(this);
+ mWxAnalyzerDelegate.onCreate();
+
+ //if (mInstance.isPreDownLoad() || mInstance.isPreInitMode()){
+ mInstance.onInstanceReady();
+ //}
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ if(mWxAnalyzerDelegate != null){
+ mWxAnalyzerDelegate.onStart();
+ }
+ }
+
+ private void loadWXfromLocal(boolean reload) {
+ if (reload && mInstance != null) {
+ mInstance.destroy();
+ mInstance = null;
+ }
+ if (mInstance == null) {
+ RenderContainer renderContainer = new RenderContainer(this);
+
+ mInstance = new WXSDKInstance(this);
+ mInstance.setRenderContainer(renderContainer);
+ mInstance.registerRenderListener(this);
+ mInstance.setNestedInstanceInterceptor(this);
+ mInstance.setTrackComponent(true);
+ }
+ mContainer.post(new Runnable() {
+ @Override
+ public void run() {
+ Activity ctx = WXPageActivity.this;
+ Rect outRect = new Rect();
+ ctx.getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect);
+ mConfigMap.put("bundleUrl", mUri.toString());
+ String path = "file".equals(mUri.getScheme()) ? assembleFilePath(mUri) : mUri.toString();
+ mInstance.render(path, WXFileUtils.loadAsset(path, WXPageActivity.this),
+ mConfigMap, null,
+ WXRenderStrategy.APPEND_ASYNC);
+ }
+ });
+ }
+
+ private String assembleFilePath(Uri uri) {
+ if (uri != null && uri.getPath() != null) {
+ return uri.getPath().replaceFirst("/", "");
+ }
+ return "";
+ }
+
+ private void initUIAndData() {
+
+ Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+ setSupportActionBar(toolbar);
+
+ ActionBar actionBar = getSupportActionBar();
+ if (actionBar != null) {
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ String title = mUri.toString().substring(mUri.toString().lastIndexOf(File.separator) + 1);
+ if (mUri.toString().startsWith("http://dotwe.org") || mUri.toString().startsWith("https://dotwe.org")) {
+ title = "Weex Online Example";
+ }
+ actionBar.setTitle(title);
+ }
+
+ mContainer = (ViewGroup) findViewById(R.id.container);
+ mProgressBar = (ProgressBar) findViewById(R.id.progress);
+ mWXHandler = new Handler(this);
+ HotRefreshManager.getInstance().setHandler(mWXHandler);
+ addOnListener();
+ }
+
+ private void loadWXfromService(final String url) {
+ mProgressBar.setVisibility(View.VISIBLE);
+
+ if (mInstance != null) {
+ mInstance.destroy();
+ mContainer.removeAllViews();
+ }
+
+ WXAbstractRenderContainer renderContainer = null;
+ if(url.contains(RenderTypes.RENDER_TYPE_HERON_URL_PARAM)){
+ mInstance = new WXSDKInstance(this);
+ mInstance.setRenderType(RenderTypes.RENDER_TYPE_HERON);
+ renderContainer = getHeronContainer(mInstance);
+ if(renderContainer == null){
+ mInstance.destroy();
+ }
+ }
+ if(renderContainer == null){
+ renderContainer = new RenderContainer(this);
+ mInstance = WXPreLoadManager.getInstance().offerPreInitInstance(url);
+ if (null != mInstance){
+ mInstance.init(this);
+ }else {
+ mInstance = new WXSDKInstance(this);
+ }
+ }
+ mInstance.setWXAbstractRenderContainer(renderContainer);
+ mInstance.registerRenderListener(this);
+ mInstance.setNestedInstanceInterceptor(this);
+ mInstance.setBundleUrl(url);
+ mInstance.setTrackComponent(true);
+ mContainer.addView(renderContainer);
+
+ if (mInstance.isPreDownLoad()){
+ return;
+ }
+
+
+ WXHttpTask httpTask = new WXHttpTask();
+ httpTask.url = url;
+ httpTask.requestListener = new WXRequestListener() {
+
+ @Override
+ public void onSuccess(WXHttpTask task) {
+ Log.i(TAG, "into--[http:onSuccess] url:" + url);
+ try {
+ Uri uri = Uri.parse(url);
+ mConfigMap.put("bundleUrl", url);
+ if(TextUtils.equals(uri.getQueryParameter("__eagle"), Boolean.TRUE.toString())){
+ mInstance.render(TAG, task.response.data, mConfigMap, null);
+ }
+ else if (TextUtils.equals(uri.getQueryParameter("__data_render"), Boolean.TRUE.toString())){
+ mInstance.render(TAG, new String(task.response.data, "UTF-8"), mConfigMap, null, WXRenderStrategy.DATA_RENDER);
+ }else if (TextUtils.equals(uri.getQueryParameter("__json_render"), Boolean.TRUE.toString())){
+ mInstance.render(TAG, new String(task.response.data, "UTF-8"), mConfigMap, null, WXRenderStrategy.JSON_RENDER);
+ } else {
+ mInstance.render(TAG, new String(task.response.data, "utf-8"), mConfigMap, null, WXRenderStrategy.APPEND_ASYNC);
+ }
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void onError(WXHttpTask task) {
+ Log.i(TAG, "into--[http:onError]");
+ mProgressBar.setVisibility(View.GONE);
+ Toast.makeText(getApplicationContext(), "network error!", Toast.LENGTH_SHORT).show();
+ }
+ };
+
+ WXHttpManager.getInstance().sendRequest(httpTask);
+ }
+
+
+ private WXAbstractRenderContainer getHeronContainer(WXSDKInstance instance){
+ try{
+ Class containerClass = getClassLoader().loadClass("com.taobao.weex.heron.container.WXHeronRenderContainer");
+ Constructor constructor = containerClass.getConstructor(Context.class);
+ WXAbstractRenderContainer container = (WXAbstractRenderContainer) constructor.newInstance(this);
+ container.createInstanceRenderView(instance.getInstanceId());
+ return container;
+ }catch (Exception e){
+ Log.e("Weex", "getHeronContainer Error Use Native Container", e);
+ return null;
+ }
+ }
+
+
+ /**
+ * hot refresh
+ */
+ private void startHotRefresh() {
+ try {
+ URL url = new URL(mUri.toString());
+ String host = url.getHost();
+ String query = url.getQuery();
+ String wsport = TextUtils.isEmpty(query)? "8082" : getUrlParam("wsport", query);
+ String wsUrl = "ws://" + host + ":" + (wsport.equals("") ? "8082" : wsport) ;
+ mWXHandler.obtainMessage(Constants.HOT_REFRESH_CONNECT, 0, 0, wsUrl).sendToTarget();
+ } catch (MalformedURLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private String getUrlParam(String key, String queryString) {
+ String regex = "[?|&]?" + key + "=([^&]+)";
+ Pattern p = Pattern.compile(regex);
+ Matcher matcher = p.matcher(queryString);
+ if (matcher.find()) {
+ return matcher.group(1);
+ } else {
+ return "";
+ }
+ }
+
+ private void addOnListener() {
+
+ }
+
+ private Map<String,String> mIDMap = new ArrayMap<>();
+ private final Runnable mCollectIDMap = new Runnable() {
+ @Override
+ public void run() {
+ View container = findViewById(R.id.container);
+
+ collectId(mInstance.getRootComponent(),mIDMap);
+ container.setContentDescription(JSON.toJSONString(mIDMap));
+
+ mWXHandler.removeCallbacks(this);
+ mWXHandler.postDelayed(this,2000);
+ }
+ };
+
+ /**
+ *
+ * @param map <weexid,viewId>
+ */
+ private static void collectId(WXComponent comp, Map<String,String> map){
+ if(comp == null){
+ return;
+ }
+ String id;
+ View view;
+ if((view = comp.getHostView())!=null &&
+ (id = (String) comp.getAttrs().get("testId"))!=null &&
+ !map.containsKey(id)){
+ Pair<String,Integer> pair = Utility.nextID();
+ view.setId(pair.second);
+ map.put(id,pair.first);
+ }
+ if(comp instanceof WXVContainer){
+ WXVContainer container = (WXVContainer) comp;
+ for(int i = container.getChildCount()-1;i>=0;i--){
+ collectId(container.getChild(i),map);
+ }
+ }
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ if (mInstance != null) {
+ mInstance.onActivityDestroy();
+ }
+ mContainer = null;
+ // TopScrollHelper.getInstance(getApplicationContext()).onDestory();
+ mWXHandler.obtainMessage(Constants.HOT_REFRESH_DISCONNECT).sendToTarget();
+ unregisterBroadcastReceiver();
+
+ if(wxPageActivityInstance == this){
+ wxPageActivityInstance = null;
+ }
+ if(mWxAnalyzerDelegate != null){
+ mWxAnalyzerDelegate.onDestroy();
+ }
+ }
+
+
+ @Override
+ public boolean onKeyUp(int keyCode, KeyEvent event) {
+ return (mWxAnalyzerDelegate != null && mWxAnalyzerDelegate.onKeyUp(keyCode,event)) || super.onKeyUp(keyCode, event);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ if (mInstance != null) {
+ mInstance.onActivityResume();
+ }
+ if(mWxAnalyzerDelegate != null){
+ mWxAnalyzerDelegate.onResume();
+ }
+ }
+
+ public static Activity getCurrentWxPageActivity() {
+ return wxPageActivityInstance;
+ }
+
+ public static void setCurrentWxPageActivity(Activity activity) {
+ wxPageActivityInstance = activity;
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ if(mInstance!=null){
+ mInstance.onRequestPermissionsResult(requestCode,permissions,grantResults);
+ }
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ if(mInstance!=null){
+ mInstance.onActivityResult(requestCode,resultCode,data);
+ }
+ }
+
+ @Override
+ public boolean handleMessage(Message msg) {
+
+ switch (msg.what) {
+ case Constants.HOT_REFRESH_CONNECT:
+ HotRefreshManager.getInstance().connect(msg.obj.toString());
+ break;
+ case Constants.HOT_REFRESH_DISCONNECT:
+ HotRefreshManager.getInstance().disConnect();
+ break;
+ case Constants.HOT_REFRESH_REFRESH:
+ loadWXfromService(mUri.toString());
+ break;
+ case Constants.HOT_REFRESH_CONNECT_ERROR:
+ Toast.makeText(this, "hot refresh connect error!", Toast.LENGTH_SHORT).show();
+ break;
+ default:
+ break;
+ }
+
+ return false;
+ }
+
+ @Override
+ public void onViewCreated(WXSDKInstance instance, View view) {
+ WXLogUtils.e("into--[onViewCreated]");
+ View wrappedView = null;
+ if(mWxAnalyzerDelegate != null){
+ wrappedView = mWxAnalyzerDelegate.onWeexViewCreated(instance,view);
+ }
+ if(wrappedView != null){
+ view = wrappedView;
+ }
+
+ if(view.getParent() == null) {
+ mContainer.addView(view);
+ }
+ mContainer.requestLayout();
+ Log.d("WARenderListener", "renderSuccess");
+ }
+
+ @Override
+ public void onRenderSuccess(WXSDKInstance instance, int width, int height) {
+ if(mWxAnalyzerDelegate != null){
+ mWxAnalyzerDelegate.onWeexRenderSuccess(instance);
+ }
+ mProgressBar.setVisibility(View.INVISIBLE);
+ }
+
+ @Override
+ public void onRefreshSuccess(WXSDKInstance instance, int width, int height) {
+ mProgressBar.setVisibility(View.GONE);
+ }
+
+ @Override
+ public void onException(WXSDKInstance instance, String errCode,
+ String msg) {
+ if(mWxAnalyzerDelegate != null){
+ mWxAnalyzerDelegate.onException(instance,errCode,msg);
+ }
+ mProgressBar.setVisibility(View.GONE);
+ if (!TextUtils.isEmpty(errCode) && errCode.contains("|")) {
+ String[] errCodeList = errCode.split("\\|");
+ String code = errCodeList[1];
+ String codeType = errCode.substring(0, errCode.indexOf("|"));
+
+ if (TextUtils.equals("1", codeType)) {
+ String errMsg = "codeType:" + codeType + "\n" + " errCode:" + code + "\n" + " ErrorInfo:" + msg;
+ degradeAlert(errMsg);
+ return;
+ } else {
+ Toast.makeText(getApplicationContext(), "errCode:" + errCode + " Render ERROR:" + msg, Toast.LENGTH_SHORT).show();
+ }
+ }
+ }
+
+ private void degradeAlert(String errMsg) {
+ new AlertDialog.Builder(this)
+ .setTitle("Downgrade success")
+ .setMessage(errMsg)
+ .setPositiveButton("OK", null)
+ .show();
+
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ if (!TextUtils.equals("file", mUri.getScheme())) {
+ getMenuInflater().inflate(R.menu.refresh, menu);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ int id = item.getItemId();
+ if (id == android.R.id.home) {
+ finish();
+ return true;
+ } else if (id == R.id.action_refresh) {
+ String scheme = mUri.getScheme();
+ if (mUri.isHierarchical() && (TextUtils.equals(scheme, "http") || TextUtils.equals(scheme, "https"))) {
+ String weexTpl = mUri.getQueryParameter(Constants.WEEX_TPL_KEY);
+ String url = TextUtils.isEmpty(weexTpl) ? mUri.toString() : weexTpl;
+ loadWXfromService(url);
+ return true;
+ }
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ if (mInstance != null) {
+ mInstance.onActivityPause();
+ }
+ if(mWxAnalyzerDelegate != null){
+ mWxAnalyzerDelegate.onPause();
+ }
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ if (mInstance != null) {
+ mInstance.onActivityStop();
+ }
+ if(mWxAnalyzerDelegate != null){
+ mWxAnalyzerDelegate.onStop();
+ }
+ }
+
+ private void registerBroadcastReceiver() {
+ mReceiver = new RefreshBroadcastReceiver();
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(WXSDKInstance.ACTION_DEBUG_INSTANCE_REFRESH);
+ filter.addAction(WXSDKInstance.ACTION_INSTANCE_RELOAD);
+
+ registerReceiver(mReceiver, filter);
+ }
+
+ private void unregisterBroadcastReceiver() {
+ if (mReceiver != null) {
+ unregisterReceiver(mReceiver);
+ }
+ mReceiver = null;
+ }
+
+ @Override
+ public void onBackPressed() {
+ if (!mInstance.onBackPressed()) {
+ super.onBackPressed();
+ }
+ }
+
+ private static class NavigatorAdapter implements IActivityNavBarSetter {
+
+ @Override
+ public boolean push(String param) {
+ return false;
+ }
+
+ @Override
+ public boolean pop(String param) {
+ return false;
+ }
+
+ @Override
+ public boolean setNavBarRightItem(String param) {
+ return false;
+ }
+
+ @Override
+ public boolean clearNavBarRightItem(String param) {
+ return false;
+ }
+
+ @Override
+ public boolean setNavBarLeftItem(String param) {
+ return false;
+ }
+
+ @Override
+ public boolean clearNavBarLeftItem(String param) {
+ return false;
+ }
+
+ @Override
+ public boolean setNavBarMoreItem(String param) {
+ return false;
+ }
+
+ @Override
+ public boolean clearNavBarMoreItem(String param) {
+ return false;
+ }
+
+ @Override
+ public boolean setNavBarTitle(String param) {
+ return false;
+ }
+ }
+
+ public class RefreshBroadcastReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (WXSDKInstance.ACTION_INSTANCE_RELOAD.equals(intent.getAction()) ||
+ WXSDKInstance.ACTION_DEBUG_INSTANCE_REFRESH.equals(intent.getAction())) {
+ // String myUrl = intent.getStringExtra("url");
+ // Log.e("WXPageActivity", "RefreshBroadcastReceiver reload onReceive ACTION_DEBUG_INSTANCE_REFRESH mBundleUrl:" + myUrl + " mUri:" + mUri);
+
+ Log.v(TAG, "connect to debug server success");
+ if (mUri != null) {
+ if (TextUtils.equals(mUri.getScheme(), "http") || TextUtils.equals(mUri.getScheme(), "https")) {
+ String weexTpl = mUri.getQueryParameter(Constants.WEEX_TPL_KEY);
+ String url = TextUtils.isEmpty(weexTpl) ? mUri.toString() : weexTpl;
+ // Log.e("WXPageActivity", "loadWXfromService reload url:" + url);
+ loadWXfromService(url);
+ } else {
+ // Log.e("WXPageActivity", "loadWXfromLocal reload from local url:" + mUri.toString());
+ loadWXfromLocal(true);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/WXPreLoadManager.java b/android/playground/src/main/java/com/alibaba/weex/WXPreLoadManager.java
new file mode 100644
index 0000000..9b45b27
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/WXPreLoadManager.java
@@ -0,0 +1,93 @@
+/**
+ * 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;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import android.util.Log;
+import com.taobao.weex.WXSDKInstance;
+import com.taobao.weex.common.WXRenderStrategy;
+import com.taobao.weex.utils.WXLogUtils;
+
+/**
+ * @author zhongcang
+ * @date 2019/5/13
+ */
+public class WXPreLoadManager {
+
+ private Map<String, WXSDKInstance> mPreInitInstanceMap;
+
+ private static class SingleTonHolder {
+ private static final WXPreLoadManager INSTANCE = new WXPreLoadManager();
+ }
+
+ private WXPreLoadManager() {
+ mPreInitInstanceMap = new ConcurrentHashMap<>();
+ }
+
+ public static WXPreLoadManager getInstance() {
+ return SingleTonHolder.INSTANCE;
+ }
+
+ public WXSDKInstance offerPreInitInstance(String pageName) {
+ WXSDKInstance instance = mPreInitInstanceMap.remove(pageName);
+ return instance;
+ }
+
+ public void preLoad(String url) {
+
+ boolean preDownLoad = url.contains("preDownLoad=true");
+ boolean preInit = url.contains("preInitInstance=rax") || url.contains("preInitInstance=vue");
+ if (!preDownLoad && !preInit){
+ return;
+ }
+
+
+ WXSDKInstance instance = new WXSDKInstance();
+ Map<String, Object> options = new HashMap<>();
+ options.put("bundleUrl", url);
+ options.put("render_strategy", WXRenderStrategy.APPEND_ASYNC.toString());
+ options.put("wxPreInit",preInit);
+ options.put("wxPreDownLoad",preDownLoad);
+ String script = null;
+ if (preInit){
+ if (url.contains("preInitInstance=rax")) {
+ script = "// { \"framework\": \"Rax\" }\n";
+ } else if (url.contains("preInitInstance=vue")) {
+ script = "// { \"framework\": \"Vue\" }\n";
+ } else {
+ WXLogUtils.e("WXPreLoadManager", "unsupport init bundle type :" + url);
+ }
+ if (null != script) {
+ mPreInitInstanceMap.put(url, instance);
+ Log.d("test->", "start preInit: ");
+ instance.preInit(url, script, options, null, WXRenderStrategy.APPEND_ASYNC);
+ }
+ }
+ if (preDownLoad){
+ if (!mPreInitInstanceMap.containsKey(url)) {
+ mPreInitInstanceMap.put(url, instance);
+ }
+ Log.d("test->", "start preDownLoad: ");
+ instance.preDownLoad(url, options, null, WXRenderStrategy.APPEND_ASYNC);
+ }
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/constants/Constants.java b/android/playground/src/main/java/com/alibaba/weex/constants/Constants.java
new file mode 100644
index 0000000..abb0282
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/constants/Constants.java
@@ -0,0 +1,34 @@
+/*
+ * 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.constants;
+
+public class Constants {
+
+// public static final String BUNDLE_URL = "http://t.cn?_wx_tpl=http://h5.waptest.taobao.com/app/weextc031/build/TC__Home.js";
+ public static final String BUNDLE_URL = "http://h5.m.taobao.com?_wx_tpl=http://g.tbcdn.cn/weex/weex-tc/0.1.2/build/TC__Home.js";
+ public static final String WEEX_SAMPLES_KEY = "?weex-samples";
+ public static final String WEEX_TPL_KEY = "_wx_tpl";
+
+
+ //hot refresh
+ public static final int HOT_REFRESH_CONNECT = 0x111;
+ public static final int HOT_REFRESH_DISCONNECT = HOT_REFRESH_CONNECT + 1;
+ public static final int HOT_REFRESH_REFRESH = HOT_REFRESH_DISCONNECT + 1;
+ public static final int HOT_REFRESH_CONNECT_ERROR = HOT_REFRESH_REFRESH + 1;
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/extend/WXInstanceStatisticsListener.java b/android/playground/src/main/java/com/alibaba/weex/extend/WXInstanceStatisticsListener.java
new file mode 100644
index 0000000..05b6de1
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/extend/WXInstanceStatisticsListener.java
@@ -0,0 +1,82 @@
+/*
+ * 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;
+
+import com.taobao.weex.IWXStatisticsListener;
+
+import com.taobao.weex.utils.Trace;
+
+public class WXInstanceStatisticsListener implements IWXStatisticsListener {
+ /**
+ * Called when weex sdk engine begin to initialize.
+ */
+ @Override
+ public void onSDKEngineInitialize() {}
+
+ /**
+ * Called when begin to load js framework.
+ */
+ @Override
+ public void onJsFrameworkStart() {}
+
+ /**
+ * Called when finish loading js framework.
+ */
+ @Override
+ public void onJsFrameworkReady() {}
+
+ /**
+ * Called when the render view phase of first view reached.
+ */
+ @Override
+ public void onFirstView() {}
+
+ /**
+ * Called when the render view phase of first screen reached.
+ */
+ @Override
+ public void onFirstScreen() {
+ Trace.beginSection("onFirstScreen done");
+ Trace.endSection();
+ }
+
+ /**
+ * Called when to start a http request.
+ */
+ @Override
+ public void onHttpStart() {}
+
+ /**
+ * Called when received a http response header data.
+ */
+ @Override
+ public void onHeadersReceived() {}
+
+ /**
+ * Called when to finish a http request.
+ */
+ @Override
+ public void onHttpFinish() {}
+
+ /**
+ * Called when an exception occured.
+ */
+ @Override
+ public void onException(String instanceid, String errCode, String msg) {}
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/extend/adapter/ApmGenerator.java b/android/playground/src/main/java/com/alibaba/weex/extend/adapter/ApmGenerator.java
new file mode 100644
index 0000000..d5b6774
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/extend/adapter/ApmGenerator.java
@@ -0,0 +1,33 @@
+/**
+ * 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 com.taobao.weex.performance.IApmGenerator;
+import com.taobao.weex.performance.IWXApmMonitorAdapter;
+
+/**
+ * @author zhongcang
+ * @date 2018/7/13
+ */
+public class ApmGenerator implements IApmGenerator {
+ @Override
+ public IWXApmMonitorAdapter generateApmInstance(String type) {
+ return new WXInstanceApmAdapter();
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/extend/adapter/DefaultAccessibilityRoleAdapter.java b/android/playground/src/main/java/com/alibaba/weex/extend/adapter/DefaultAccessibilityRoleAdapter.java
new file mode 100644
index 0000000..21ff24f
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/extend/adapter/DefaultAccessibilityRoleAdapter.java
@@ -0,0 +1,62 @@
+/*
+ * 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;
+
+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<String, String> ENRoles = new HashMap<>();
+
+ static {
+ 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 (isEN()) {
+ String enRole = ENRoles.get(key);
+ if (!TextUtils.isEmpty(enRole)) {
+ return enRole;
+ }
+ }
+ return key;
+ }
+
+ private static boolean isEN() {
+ try {
+ return "EN".equals(Locale.getDefault().getCountry());
+ } catch (Throwable t) {
+ }
+ return false;
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/extend/adapter/DefaultConfigAdapter.java b/android/playground/src/main/java/com/alibaba/weex/extend/adapter/DefaultConfigAdapter.java
new file mode 100644
index 0000000..fa31138
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/extend/adapter/DefaultConfigAdapter.java
@@ -0,0 +1,32 @@
+/**
+ * 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 com.taobao.weex.adapter.IWXConfigAdapter;
+
+/**
+ * @author zhongcang
+ * @date 2019/6/19
+ */
+public class DefaultConfigAdapter implements IWXConfigAdapter {
+ @Override
+ public String getConfig(String nameSpace, String key, String defaultValue) {
+ return defaultValue;
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/extend/adapter/InterceptWXHttpAdapter.java b/android/playground/src/main/java/com/alibaba/weex/extend/adapter/InterceptWXHttpAdapter.java
new file mode 100644
index 0000000..58c8254
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/extend/adapter/InterceptWXHttpAdapter.java
@@ -0,0 +1,80 @@
+/*
+ * 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.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import com.taobao.weex.adapter.DefaultWXHttpAdapter;
+import com.taobao.weex.urlconnection.ByteArrayRequestEntity;
+import com.taobao.weex.urlconnection.SimpleRequestEntity;
+import com.taobao.weex.urlconnection.WeexURLConnectionManager;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+
+/**
+ * Created by moxun on 16/12/29.
+ */
+
+public class InterceptWXHttpAdapter extends DefaultWXHttpAdapter {
+
+ @NonNull
+ @Override
+ public IEventReporterDelegate getEventReporterDelegate() {
+ return new IEventReporterDelegate() {
+
+ WeexURLConnectionManager manager = new WeexURLConnectionManager(null);
+
+ @Override
+ public void preConnect(HttpURLConnection connection, @Nullable String body) {
+ SimpleRequestEntity requestEntity = null;
+ if (body != null) {
+ requestEntity = new ByteArrayRequestEntity(body.getBytes());
+ }
+
+ try {
+ manager.preConnect(connection, requestEntity);
+ } catch (Throwable throwable) {
+ manager.httpExchangeFailed(new IOException("Exception on preConnect", throwable));
+ }
+ }
+
+ @Override
+ public void postConnect() {
+ try {
+ manager.postConnect();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public InputStream interpretResponseStream(@Nullable InputStream inputStream) {
+ return manager.interpretResponseStream(inputStream);
+ }
+
+ @Override
+ public void httpExchangeFailed(IOException e) {
+ manager.httpExchangeFailed(e);
+ }
+ };
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/extend/adapter/WXAnalyzerDemoListener.java b/android/playground/src/main/java/com/alibaba/weex/extend/adapter/WXAnalyzerDemoListener.java
new file mode 100644
index 0000000..ec8e1ea
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/extend/adapter/WXAnalyzerDemoListener.java
@@ -0,0 +1,38 @@
+/**
+ * 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.util.Log;
+import com.taobao.weex.BuildConfig;
+import com.taobao.weex.performance.IWXAnalyzer;
+import com.taobao.weex.performance.WXAnalyzerDataTransfer;
+
+/**
+ * @author zhongcang
+ * @date 2018/9/17
+ */
+public class WXAnalyzerDemoListener implements IWXAnalyzer {
+ @Override
+ public void transfer(String group, String module, String type, String data) {
+ //WXAnalyzerDataTransfer.switchInteractionLog(true);
+ if (BuildConfig.DEBUG){
+ // Log.d("WXAnalyzerDemoListener", "transfer: ");
+ }
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/extend/adapter/WXInstanceApmAdapter.java b/android/playground/src/main/java/com/alibaba/weex/extend/adapter/WXInstanceApmAdapter.java
new file mode 100644
index 0000000..c9ff683
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/extend/adapter/WXInstanceApmAdapter.java
@@ -0,0 +1,167 @@
+/**
+ * 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 java.util.HashMap;
+import java.util.Map;
+
+import android.util.Log;
+import com.taobao.weex.performance.IWXApmMonitorAdapter;
+import com.taobao.weex.performance.WXInstanceApm;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+public class WXInstanceApmAdapter implements IWXApmMonitorAdapter {
+ private final APMInfo mInstanceInfo;
+ private final Map<String, APMInfo> mSubProcedureInfo;
+ private boolean isAppear = true;
+
+ WXInstanceApmAdapter() {
+ mInstanceInfo = new APMInfo(WXInstanceApm.WEEX_PAGE_TOPIC);
+ mSubProcedureInfo = new HashMap<>(1);
+ }
+
+ @Override
+ public void onStart(String instanceId) {
+ }
+
+ @Override
+ public void onEnd() {
+ printVale();
+ }
+
+ @Override
+ public void onEvent(String name, Object value) {
+ if (!isAppear){
+ return;
+ }
+ mInstanceInfo.eventMap.put(name, value);
+ }
+
+ @Override
+ public void onStage(String name, long timestamp) {
+ mInstanceInfo.stageMap.put(name, timestamp);
+ }
+
+ @Override
+ public void addProperty(String key, Object value) {
+ mInstanceInfo.propertyMap.put(key, value);
+ }
+
+ @Override
+ public void addStats(String key, double value) {
+ mInstanceInfo.statsMap.put(key, value);
+ }
+
+ @Override
+ public void onSubProcedureStage(String procedureName, String stageName) {
+ getAndCheckAndSubProcedureMap(procedureName).stageMap.put(stageName, System.currentTimeMillis());
+ }
+
+ @Override
+ public void onSubProcedureEvent(String procedureName, String eventName) {
+ getAndCheckAndSubProcedureMap(procedureName).eventMap.put(eventName, System.currentTimeMillis());
+ }
+
+ @Override
+ public void setSubProcedureStats(String procedureName, String name, double value) {
+ getAndCheckAndSubProcedureMap(procedureName).statsMap.put(name, value);
+ }
+
+ @Override
+ public void setSubProcedureProperties(String procedureName, String name, Object value) {
+ getAndCheckAndSubProcedureMap(procedureName).propertyMap.put(name, value);
+ }
+
+ @Override
+ public void onAppear() {
+ isAppear = true;
+ }
+
+ @Override
+ public void onDisappear() {
+ isAppear = false;
+ }
+
+ @Override
+ public String parseReportUrl(String originUrl) {
+ return originUrl;
+ }
+
+ private APMInfo getAndCheckAndSubProcedureMap(String procedureName) {
+ APMInfo info = mSubProcedureInfo.get(procedureName);
+ if (null != info) {
+ return info;
+ }
+ synchronized (mSubProcedureInfo) {
+ info = new APMInfo(procedureName);
+ mSubProcedureInfo.put(procedureName, info);
+ }
+ return info;
+ }
+
+ private void printVale() {
+ String val = "";
+ try {
+ JSONObject subProcedureJson = new JSONObject();
+ for (Map.Entry<String, APMInfo> entry : mSubProcedureInfo.entrySet()) {
+ subProcedureJson.put(entry.getKey(), entry.getValue().toJson());
+ }
+ val = mInstanceInfo.toJson()
+ .put("subProcedures", subProcedureJson)
+ .toString();
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ Log.i("wxApmInstance", val);
+ //WXLogUtils.d("wxApmInstance", val);
+ }
+
+ private class APMInfo {
+ private String infoName;
+ private Map<String, Object> stageMap;
+ private Map<String, Object> propertyMap;
+ private Map<String, Object> eventMap;
+ private Map<String, Object> statsMap;
+
+ APMInfo(String name) {
+ this.infoName = name;
+ stageMap = new HashMap<>();
+ propertyMap = new HashMap<>();
+ eventMap = new HashMap<>();
+ statsMap = new HashMap<>();
+ }
+
+ JSONObject toJson() throws JSONException {
+ return new JSONObject()
+ .put("stage", convertMapToJSON(stageMap))
+ .put("property", convertMapToJSON(propertyMap))
+ .put("event", convertMapToJSON(eventMap))
+ .put("stats", convertMapToJSON(statsMap));
+ }
+
+ private JSONObject convertMapToJSON(Map<String, Object> params) throws JSONException {
+ JSONObject json = new JSONObject();
+ for (Map.Entry<String, Object> entry : params.entrySet()) {
+ json.put(entry.getKey(), entry.getValue());
+ }
+ return json;
+ }
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/extend/component/RichText.java b/android/playground/src/main/java/com/alibaba/weex/extend/component/RichText.java
new file mode 100644
index 0000000..3b4b53f
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/extend/component/RichText.java
@@ -0,0 +1,54 @@
+/*
+ * 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.component;
+
+import android.content.Context;
+import android.support.annotation.NonNull;
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.method.LinkMovementMethod;
+import android.text.style.URLSpan;
+import android.widget.TextView;
+
+import com.taobao.weex.WXSDKInstance;
+import com.taobao.weex.ui.action.BasicComponentData;
+import com.taobao.weex.ui.component.WXComponent;
+import com.taobao.weex.ui.component.WXComponentProp;
+import com.taobao.weex.ui.component.WXVContainer;
+
+public class RichText extends WXComponent<TextView> {
+
+ public RichText(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) {
+ super(instance, parent, basicComponentData);
+ }
+
+ @Override
+ protected TextView initComponentHostView(@NonNull Context context) {
+ TextView view = new TextView(context);
+ view.setMovementMethod(LinkMovementMethod.getInstance());
+ return view;
+ }
+
+ @WXComponentProp(name = "tel")
+ public void setTelLink(String tel){
+ SpannableString spannable=new SpannableString(tel);
+ spannable.setSpan(new URLSpan("tel:"+tel),0,tel.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ ((TextView) getHostView()).setText(spannable);
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/extend/component/WXComponentSyncTest.java b/android/playground/src/main/java/com/alibaba/weex/extend/component/WXComponentSyncTest.java
new file mode 100644
index 0000000..0adeed4
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/extend/component/WXComponentSyncTest.java
@@ -0,0 +1,47 @@
+/*
+ * 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.component;
+
+import com.taobao.weex.WXSDKInstance;
+import com.taobao.weex.annotation.JSMethod;
+import com.taobao.weex.ui.action.BasicComponentData;
+import com.taobao.weex.ui.component.WXDiv;
+import com.taobao.weex.ui.component.WXVContainer;
+import com.taobao.weex.utils.WXLogUtils;
+
+/**
+ * Created by zhengshihan on 2016/12/30.
+ */
+
+public class WXComponentSyncTest extends WXDiv {
+
+ public WXComponentSyncTest(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) {
+ super(instance, parent, basicComponentData);
+ }
+
+ @JSMethod (uiThread = false)
+ public void testSyncCall(){
+ WXLogUtils.d("11WXComponentSyncTest :"+ Thread.currentThread().getName());
+ }
+
+ @JSMethod (uiThread = true)
+ public void testAsyncCall(){
+ WXLogUtils.e("22WXComponentSynTest :"+ Thread.currentThread().getName() );
+ }
+}
\ No newline at end of file
diff --git a/android/playground/src/main/java/com/alibaba/weex/extend/component/WXMask.java b/android/playground/src/main/java/com/alibaba/weex/extend/component/WXMask.java
new file mode 100644
index 0000000..252de1c
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/extend/component/WXMask.java
@@ -0,0 +1,169 @@
+/**
+ * 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.component;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Build;
+import android.support.annotation.NonNull;
+import android.view.Gravity;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.FrameLayout;
+import android.widget.PopupWindow;
+
+import com.alibaba.weex.extend.view.WXMaskView;
+import com.taobao.weex.WXSDKInstance;
+import com.taobao.weex.dom.CSSShorthand;
+import com.taobao.weex.dom.WXStyle;
+import com.taobao.weex.ui.action.BasicComponentData;
+import com.taobao.weex.ui.component.WXComponent;
+import com.taobao.weex.ui.component.WXVContainer;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by lixinke on 2016/12/26.
+ */
+
+public class WXMask extends WXVContainer {
+
+ private PopupWindow mPopupWindow;
+ private WXMaskView mContainerView;
+
+ public WXMask(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) {
+ super(instance, parent, basicComponentData);
+ }
+
+ @Override
+ protected View initComponentHostView(@NonNull Context context) {
+
+ mContainerView = new WXMaskView(context);
+ mPopupWindow = new PopupWindow(context);
+ mPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
+ mPopupWindow.setAttachedInDecor(true);
+ }
+
+ //setClippingEnabled(false) will cause INPUT_ADJUST_PAN invalid.
+ //mPopupWindow.setClippingEnabled(false);
+
+ mPopupWindow.setContentView(mContainerView);
+ mPopupWindow.setWidth(WindowManager.LayoutParams.WRAP_CONTENT);
+ mPopupWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
+ mPopupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN |
+ WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
+ mPopupWindow.setFocusable(true);
+
+ mPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
+ @Override
+ public void onDismiss() {
+ fireVisibleChangedEvent(false);
+ }
+ });
+
+ int y = 0;
+ int statusBarHeight = 0;
+ int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
+ if (resourceId > 0) {
+ statusBarHeight = context.getResources().getDimensionPixelSize(resourceId);
+ y = statusBarHeight;
+ }
+
+ mPopupWindow.showAtLocation(((Activity) context).getWindow().getDecorView(),
+ Gravity.TOP | Gravity.START,
+ 0,
+ y);
+ fireVisibleChangedEvent(true);
+
+ return mContainerView;
+ }
+
+ @Override
+ public boolean isVirtualComponent() {
+ return true;
+ }
+
+ @Override
+ public void removeVirtualComponent() {
+ if (mPopupWindow.isShowing()) {
+ mPopupWindow.dismiss();
+ }
+ }
+
+ private void fireVisibleChangedEvent(boolean visible) {
+ Map<String, Object> event = new HashMap<>(1);
+ event.put("visible", visible);
+ fireEvent("visiblechanged", event);
+ }
+
+ @Override
+ protected void setHostLayoutParams(View host, int width, int height, int left, int right, int top, int bottom) {
+ left = get(LEFT);
+ right = get(RIGHT);
+ top = get(TOP);
+ bottom = get(BOTTOM);
+ FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(width, height);
+
+ this.setMarginsSupportRTL(params, left, top, right, bottom);
+
+ getHostView().setLayoutParams(params);
+ }
+
+ private static final int LEFT = 0;
+ private static final int RIGHT = 1;
+ private static final int TOP = 2;
+ private static final int BOTTOM = 3;
+
+ private int get(int type) {
+ try {
+ CSSShorthand margin = getMargin();
+ WXStyle style = getStyles();
+ switch (type) {
+ case LEFT:
+ return add(style.getLeft(), margin.get(CSSShorthand.EDGE.LEFT));
+ case RIGHT:
+ return add(style.getRight(), margin.get(CSSShorthand.EDGE.RIGHT));
+ case TOP:
+ return add(style.getTop(), margin.get(CSSShorthand.EDGE.TOP));
+ case BOTTOM:
+ return add(style.getBottom(), margin.get(CSSShorthand.EDGE.BOTTOM));
+ }
+ } catch (Throwable t) {
+ //ignore
+ }
+ return 0;
+ }
+
+ private int add(float a, float b) {
+ if (Float.isNaN(a)) {
+ a = 0f;
+ }
+
+ if (Float.isNaN(b)) {
+ b = 0f;
+ }
+
+ return (int) (a + b);
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/extend/component/WXParallax.java b/android/playground/src/main/java/com/alibaba/weex/extend/component/WXParallax.java
new file mode 100644
index 0000000..281432c
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/extend/component/WXParallax.java
@@ -0,0 +1,364 @@
+/**
+ * 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.component;
+
+import android.graphics.Color;
+import android.support.annotation.Nullable;
+import android.support.v4.view.ViewCompat;
+import android.support.v7.widget.RecyclerView;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.animation.Animation;
+import android.view.animation.AnimationSet;
+import android.view.animation.RotateAnimation;
+import android.view.animation.ScaleAnimation;
+import android.view.animation.TranslateAnimation;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKInstance;
+import com.taobao.weex.common.Constants;
+import com.taobao.weex.common.ICheckBindingScroller;
+import com.taobao.weex.common.OnWXScrollListener;
+import com.taobao.weex.ui.action.BasicComponentData;
+import com.taobao.weex.ui.animation.WXAnimationBean;
+import com.taobao.weex.ui.component.Scrollable;
+import com.taobao.weex.ui.component.WXComponent;
+import com.taobao.weex.ui.component.WXDiv;
+import com.taobao.weex.ui.component.WXVContainer;
+import com.taobao.weex.ui.component.list.BasicListComponent;
+import com.taobao.weex.ui.component.list.template.WXRecyclerTemplateList;
+import com.taobao.weex.ui.view.listview.WXRecyclerView;
+import com.taobao.weex.utils.WXLogUtils;
+import com.taobao.weex.utils.WXResourceUtils;
+
+import java.util.ArrayList;
+
+
+/**
+ * Created by zhengshihan on 2017/5/3.
+ */
+
+public class WXParallax extends WXDiv implements OnWXScrollListener, ICheckBindingScroller {
+
+ public final static String WX_TRANSFORM = "transform";
+ public final static String WX_OPACITY = "opacity";
+ public static final String PARALLAX = "parallax";
+ public static final String BINDING_SCROLLER = "bindingScroller";
+
+
+ ArrayList<TransformCreator> mTransformPropArrayList = new ArrayList<>();
+ BackgroundColorCreator mBackgroundColor;
+ String mBindingRef = "";
+ WXComponent mBindingComponent;
+
+ private int mBackGroundColor = 0;
+ private float mOffsetY = 0;
+
+ public WXParallax(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) {
+ super(instance, parent, basicComponentData);
+ initTransform(getAttrs().get(WX_TRANSFORM));
+ initOpacity(getAttrs().get(Constants.Name.OPACITY));
+ initBackgroundColor(getAttrs().get(Constants.Name.BACKGROUND_COLOR));
+
+ mBindingRef = (String) (getAttrs().get(BINDING_SCROLLER));
+ instance.registerOnWXScrollListener(this);
+ }
+
+ private void initBackgroundColor(Object obj) {
+ if (obj == null)
+ return;
+
+ if (obj instanceof JSONObject) {
+ mBackgroundColor = new BackgroundColorCreator();
+ JSONObject object = (JSONObject) obj;
+
+ JSONArray in = object.getJSONArray("in");
+ mBackgroundColor.input = new int[in.size()];
+ for (int i = 0; i < in.size(); i++) {
+ mBackgroundColor.input[i] = in.getInteger(i);
+ }
+
+ JSONArray out = object.getJSONArray("out");
+ mBackgroundColor.output = new int[out.size()];
+ for (int i = 0; i < out.size(); i++) {
+ String colorStr = out.getString(i);
+ mBackgroundColor.output[i] = WXResourceUtils.getColor(colorStr);
+ }
+ }
+ }
+
+ private void initOpacity(Object obj) {
+ if (obj == null)
+ return;
+
+ if (obj instanceof JSONObject) {
+ mTransformPropArrayList.add(new TransformCreator(WX_OPACITY, (JSONObject) obj));
+ }
+
+ }
+
+ private void initTransform(Object propStr) {
+
+ if (propStr == null) {
+ WXLogUtils.w("WXParallax initAnimation propStr ==null");
+ return;
+ }
+ JSONArray jsonObject;
+ if (propStr instanceof JSONArray) {
+ jsonObject = (JSONArray) propStr;
+ for (int i = 0; i < jsonObject.size(); i++) {
+ JSONObject object = jsonObject.getJSONObject(i);
+ mTransformPropArrayList.add(i,
+ new TransformCreator(object.getString("type"), object));
+ }
+ }
+ }
+
+ @Override
+ public boolean isNeedScroller(String ref, Object option) {
+
+ mBindingRef = (String) (getAttrs().get(BINDING_SCROLLER));
+ if (TextUtils.isEmpty(mBindingRef)) {
+ WXComponent root = getInstance().getRootComponent();
+ if (root != null && root instanceof WXVContainer) {
+ Scrollable scrollable = root.getFirstScroller();
+ if (scrollable != null) {
+ mBindingRef = scrollable.getRef();
+ }
+ }
+ }
+ if (!TextUtils.isEmpty(mBindingRef)
+ && !TextUtils.isEmpty(ref)
+ && ref.equals(mBindingRef)) {
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void onScrolled(View view, int dx, int dy) {
+ if(ViewCompat.isInLayout(view)){
+ if(mBindingComponent == null && mBindingRef != null){
+ mBindingComponent = findComponent(mBindingRef);
+ }
+ if(mBindingComponent instanceof BasicListComponent
+ && view instanceof RecyclerView){
+ BasicListComponent listComponent = (BasicListComponent) mBindingComponent;
+ mOffsetY = Math.abs(listComponent.calcContentOffset((RecyclerView) view));
+ }else if(mBindingComponent instanceof WXRecyclerTemplateList
+ && view instanceof RecyclerView){
+ WXRecyclerTemplateList listComponent = (WXRecyclerTemplateList) mBindingComponent;
+ mOffsetY = Math.abs(listComponent.calcContentOffset((RecyclerView) view));
+ }
+ }else{
+ mOffsetY = mOffsetY + dy;
+ }
+
+ AnimationSet animationSet = new AnimationSet(true);
+ boolean hasAnimation = false;
+ for (int i = 0; i < mTransformPropArrayList.size(); i++) {
+ TransformCreator creator = mTransformPropArrayList.get(i);
+ Animation animation = creator.getAnimation(dx, dy);
+ if (animation != null) {
+ animationSet.addAnimation(animation);
+ hasAnimation = true;
+ }
+ }
+
+ if (hasAnimation) {
+ animationSet.setFillAfter(true);
+ if (getHostView() != null) {
+ getHostView().startAnimation(animationSet);
+ }
+ }
+
+ if (mBackgroundColor != null) {
+ int color = mBackgroundColor.getColor(dx, dy);
+ if (mBackGroundColor != color) {
+ getHostView().setBackgroundColor(color);
+ mBackGroundColor = color;
+ }
+ }
+ }
+
+ @Override
+ public void onScrollStateChanged(View view, int x, int y, int newState) {
+
+ }
+
+
+ private class BackgroundColorCreator {
+
+ int[] input;
+ int[] output;
+
+ int getColor(int XDelta, int YDelta) {
+ if (WXEnvironment.isApkDebugable()) {
+ WXLogUtils.d("WXParallax:getColor: XDelta" + XDelta + " YDelta:" + YDelta + " mOffsetY" + mOffsetY);
+ }
+ int r1, g1, b1;
+
+ if (mOffsetY > input[1]) {
+ return output[1];
+ }
+
+ if (mOffsetY < input[0]) {
+ return output[0];
+ }
+
+ r1 = Color.red(output[0]) + (int) (mOffsetY - input[0]) * (Color.red(output[1]) - Color.red(output[0])) / (input[1] - input[0]);
+ g1 = Color.green(output[0]) + (int) (mOffsetY - input[0]) * (Color.green(output[1]) - Color.green(output[0])) / (input[1] - input[0]);
+ b1 = Color.blue(output[0]) + (int) (mOffsetY - input[0]) * (Color.blue(output[1]) - Color.blue(output[0])) / (input[1] - input[0]);
+
+ if (WXEnvironment.isApkDebugable()) {
+ WXLogUtils.d("WXParallax:getColor: r1" + r1 + " g1:" + g1 + " b1:" + b1);
+ }
+ return Color.rgb(r1, g1, b1);
+ }
+
+ }
+
+ private class TransformCreator {
+
+ String transformType;
+ float[] input, output;
+ float fromTranslateX, fromTranslateY;
+ float fromScaleX, fromScaleY;
+ float fromRotate, fromOpacity;
+
+ TransformCreator(String type, JSONObject object) {
+ transformType = type;
+ JSONArray in = object.getJSONArray("in");
+ input = parseParamArray(in);
+ JSONArray out = object.getJSONArray("out");
+ output = parseParamArray(out);
+
+ switch (transformType) {
+ case WXAnimationBean.Style.WX_TRANSLATE:
+ fromTranslateX = output[0];
+ fromTranslateY = output[1];
+ break;
+ case WXAnimationBean.Style.WX_SCALE:
+ fromScaleX = output[0];
+ fromScaleY = output[1];
+ break;
+ case WXAnimationBean.Style.WX_ROTATE:
+ fromRotate = output[0];
+ break;
+ case WX_OPACITY:
+ fromOpacity = output[0];
+ break;
+ }
+ }
+
+ float[] parseParamArray(JSONArray in) {
+
+ int size = in.size();
+ float[] param = new float[size];
+ for (int j = 0; j < size; j++) {
+ param[j] = in.getFloatValue(j);
+ }
+ return param;
+ }
+
+
+ @Nullable
+ Animation getAnimation(float XDelta, float YDelta) {
+
+ float offset = mOffsetY;
+ if (offset > input[1]) {
+ offset = input[1];
+ }
+ if (offset < input[0]) {
+ offset = input[0];
+ }
+ float toTranslateX, toTranslateY, toOpacity, toScaleX, toScaleY, toRotate;
+ Animation animation = null;
+
+ if (WXEnvironment.isApkDebugable()) {
+ WXLogUtils.d("WXParallax", "type:" + transformType + " XDelta:" + XDelta + " YDelta:" + YDelta);
+ }
+ switch (transformType) {
+
+ case WXAnimationBean.Style.WX_TRANSLATE:
+ toTranslateX = output[0] + (output[2] - output[0]) * (offset - input[0]) / (input[1] - input[0]);
+ toTranslateY = output[1] + (output[3] - output[1]) * (offset - input[0]) / (input[1] - input[0]);
+
+ if (fromTranslateX == toTranslateX && fromTranslateY == toTranslateY) {
+ return null;
+ }
+ animation = new TranslateAnimation(fromTranslateX, toTranslateX, fromTranslateY, toTranslateY);
+
+ fromTranslateX = toTranslateX;
+ fromTranslateY = toTranslateY;
+
+ if (WXEnvironment.isApkDebugable()) {
+ WXLogUtils.d("WXParallax", "XDelta:" + XDelta + " YDelta:" + YDelta);
+ WXLogUtils.d("WXParallax", " fromTranslateX:" + fromTranslateX + " toTranslateX:" + toTranslateX + " fromTranslateY:" + fromTranslateY + " toTranslateY:" + toTranslateY);
+ }
+
+ break;
+ case WXAnimationBean.Style.WX_SCALE:
+ toScaleX = output[0] + (output[2] - output[0]) * (offset - input[0]) / (input[1] - input[0]);
+ toScaleY = output[1] + (output[3] - output[1]) * (offset - input[0]) / (input[1] - input[0]);
+
+ if (fromScaleX == toScaleX && fromScaleY == toScaleY) {
+ return null;
+ }
+ animation = new ScaleAnimation(fromScaleX, toScaleX, fromScaleY, toScaleY);
+
+ if (WXEnvironment.isApkDebugable()) {
+ WXLogUtils.d("WXParallax", " fromScaleX:" + fromScaleX + " toScaleX:" + toScaleX + " fromScaleY:" + fromScaleY + " toScaleY:" + toScaleY);
+ }
+
+ fromScaleX = toScaleX;
+ fromScaleY = toScaleY;
+ break;
+
+ case WXAnimationBean.Style.WX_ROTATE:
+ toRotate = output[0] + (output[1] - output[0]) * (offset - input[0]) / (input[1] - input[0]);
+ if (fromRotate == toRotate) {
+ return null;
+ }
+ animation = new RotateAnimation(fromRotate, toRotate, output[2], output[3]);
+ fromRotate = toRotate;
+ break;
+
+ case WX_OPACITY:
+ toOpacity = output[0] + (output[1] - output[0]) * (offset - input[0]) / (input[1] - input[0]);
+ if (fromOpacity == toOpacity) {
+ return null;
+ }
+ setOpacity(toOpacity);
+// animation = new AlphaAnimation(fromOpacity, toOpacity);
+
+ if (WXEnvironment.isApkDebugable()) {
+ WXLogUtils.d("WXParallax", "opacity fromOpacity:" + fromOpacity + " toOpacity:" + toOpacity);
+ }
+
+ fromOpacity = toOpacity;
+ break;
+ }
+
+ return animation;
+ }
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/extend/module/GeolocationModule.java b/android/playground/src/main/java/com/alibaba/weex/extend/module/GeolocationModule.java
new file mode 100644
index 0000000..98f0c92
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/extend/module/GeolocationModule.java
@@ -0,0 +1,159 @@
+/*
+ * 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.module;
+
+import android.Manifest;
+import android.app.Activity;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.LocalBroadcastManager;
+
+import com.alibaba.weex.extend.module.location.ILocatable;
+import com.alibaba.weex.extend.module.location.LocationFactory;
+import com.taobao.weex.WXSDKManager;
+import com.taobao.weex.common.Destroyable;
+import com.taobao.weex.annotation.JSMethod;
+import com.taobao.weex.common.WXModule;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by lixinke on 16/9/10.
+ */
+public class GeolocationModule extends WXModule implements Destroyable {
+
+ private ILocatable mILocatable;
+
+ public GeolocationModule() {
+ mILocatable = LocationFactory.getLocationProvider(mWXSDKInstance);
+ }
+
+ /**
+ * 获取当前位置信息,只回调一次。
+ *
+ * @param successCallback 成功回调function id.
+ * @param errorCallback 错误回调function id.(例如:没有权限)
+ * @param params JSON格式的参数(例如:准确度等).
+ */
+ @JSMethod
+ public void getCurrentPosition(String successCallback, String errorCallback, String params) {
+ mILocatable.setWXSDKInstance(mWXSDKInstance);
+ if (checkPermission()) {
+ mILocatable.getCurrentPosition(successCallback, errorCallback, params);
+ } else {
+ requestPermission(successCallback, errorCallback, params, ILocatable.REQUEST_CUR_PERMISSION_CODE);
+ }
+ }
+
+
+ /**
+ * 注册监听全局定位
+ *
+ * @param successCallback 定位成功回调function id.
+ * @param errorCallback 错误回调(例如:没有权限等).
+ * @param params SON格式的参数(例如:准确度等).
+ */
+ @JSMethod
+ public void watchPosition(String successCallback, String errorCallback, String params) {
+ mILocatable.setWXSDKInstance(mWXSDKInstance);
+ if (checkPermission()) {
+ mILocatable.watchPosition(successCallback, errorCallback, params);
+ } else {
+ requestPermission(successCallback, errorCallback, params, ILocatable.REQUEST_WATCH_PERMISSION_CODE);
+ }
+ }
+
+ /**
+ * 注销监听全局定位
+ *
+ * @param registerID 注册时返回的唯一ID。
+ */
+ @JSMethod
+ public void clearWatch(String registerID) {
+ mILocatable.setWXSDKInstance(mWXSDKInstance);
+ mILocatable.clearWatch(registerID);
+ }
+
+
+ @Override
+ public void destroy() {
+ mILocatable.destroy();
+ }
+
+ private void requestPermission(String successCallback, String errorCallback, String params, int requestCurPermissionCode) {
+ ActivityCompat.requestPermissions((Activity) mWXSDKInstance.getContext(),
+ new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, requestCurPermissionCode);
+ LocalBroadcastManager.getInstance(mWXSDKInstance.getContext())
+ .registerReceiver(new PerReceiver(mWXSDKInstance.getInstanceId(), mILocatable, successCallback, errorCallback, params), new IntentFilter("actionRequestPermissionsResult"));
+ }
+
+ private boolean checkPermission() {
+ return ActivityCompat.checkSelfPermission(mWXSDKInstance.getContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
+ && ActivityCompat.checkSelfPermission(mWXSDKInstance.getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED;
+ }
+
+ static class PerReceiver extends BroadcastReceiver {
+
+ String mInstanceId;
+ ILocatable mLocatable;
+ String mSuccessCallback;
+ String mErrorCallback;
+ String mParams;
+
+ PerReceiver(String instanceId, ILocatable locatable, String successCallback, String errorCallback, String params) {
+ this.mLocatable = locatable;
+ this.mSuccessCallback = successCallback;
+ this.mErrorCallback = errorCallback;
+ this.mParams = params;
+ this.mInstanceId = instanceId;
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ int code = intent.getIntExtra(ILocatable.REQUEST_PERMISSION_CODE, 0);
+ int[] grantResults = intent.getIntArrayExtra("grantResults");
+ if (code == ILocatable.REQUEST_CUR_PERMISSION_CODE) {
+ if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ mLocatable.getCurrentPosition(mSuccessCallback, mErrorCallback, mParams);
+ } else {
+ noPermission();
+ }
+ } else if (code == ILocatable.REQUEST_WATCH_PERMISSION_CODE) {
+ if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ mLocatable.watchPosition(mSuccessCallback, mErrorCallback, mParams);
+ } else {
+ noPermission();
+ }
+ }
+ LocalBroadcastManager.getInstance(context).unregisterReceiver(this);
+ }
+
+ private void noPermission() {
+ Map<String, Object> options = new HashMap<>();
+ options.put(ILocatable.ERROR_CODE, ILocatable.ErrorCode.NO_PERMISSION_ERROR);
+ options.put(ILocatable.ERROR_MSG, ILocatable.ErrorMsg.NO_PERMISSION_ERROR);
+ WXSDKManager.getInstance().callback(mInstanceId, mErrorCallback, options);
+ }
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/extend/module/MyModule.java b/android/playground/src/main/java/com/alibaba/weex/extend/module/MyModule.java
new file mode 100644
index 0000000..c2b0214
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/extend/module/MyModule.java
@@ -0,0 +1,32 @@
+/*
+ * 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.module;
+
+import android.widget.Toast;
+
+import com.taobao.weex.annotation.JSMethod;
+import com.taobao.weex.common.WXModule;
+
+public class MyModule extends WXModule {
+
+ @JSMethod(uiThread = true)
+ public void printLog(String msg) {
+ Toast.makeText(mWXSDKInstance.getContext(),msg,Toast.LENGTH_SHORT).show();
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/extend/module/RenderModule.java b/android/playground/src/main/java/com/alibaba/weex/extend/module/RenderModule.java
new file mode 100644
index 0000000..1ad0da7
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/extend/module/RenderModule.java
@@ -0,0 +1,33 @@
+/*
+ * 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.module;
+
+import android.util.Log;
+
+import com.taobao.weex.annotation.JSMethod;
+import com.taobao.weex.common.WXModule;
+
+
+public class RenderModule extends WXModule {
+
+ @JSMethod
+ public void performClick() {
+ Log.d("Render", "Render");
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/extend/module/SyncTestModule.java b/android/playground/src/main/java/com/alibaba/weex/extend/module/SyncTestModule.java
new file mode 100644
index 0000000..74ad1d9
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/extend/module/SyncTestModule.java
@@ -0,0 +1,71 @@
+/*
+ * 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.module;
+
+import com.taobao.weex.annotation.JSMethod;
+import com.taobao.weex.common.WXModule;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by zhengshihan on 2016/12/28.
+ */
+
+public class SyncTestModule extends WXModule {
+
+ @JSMethod(uiThread = false)
+ public ArrayList getArray(){
+ ArrayList list = new ArrayList();
+ list.add("ArrayList test 1");
+ list.add("ArrayList test 2");
+ return list;
+ }
+ @JSMethod(uiThread = false)
+ public String getString(){
+
+ return "getString :i am string ";
+ }
+
+ @JSMethod(uiThread = false)
+ public int getNumber(){
+ return 1111;
+ }
+
+ /**
+ * JSON NOT allow KeyValue as non-string value
+ * @return
+ */
+ @JSMethod(uiThread = false)
+ public Object getObject(){
+ ArrayList list = new ArrayList();
+ list.add("222");
+ list.add("test");
+ Map map = new HashMap();
+ map.put(11,"test11");
+ map.put("22","test22");
+ list.add(map);
+ return list;
+
+ }
+
+
+
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/extend/module/WXEventModule.java b/android/playground/src/main/java/com/alibaba/weex/extend/module/WXEventModule.java
new file mode 100644
index 0000000..5c63a1f
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/extend/module/WXEventModule.java
@@ -0,0 +1,138 @@
+/*
+ * 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.module;
+
+import android.Manifest;
+import android.app.Activity;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.ContextCompat;
+import android.support.v7.app.AlertDialog;
+import android.support.v7.app.AppCompatActivity;
+import android.text.TextUtils;
+import android.widget.Toast;
+
+import com.alibaba.weex.WXPageActivity;
+import com.google.zxing.client.android.CaptureActivity;
+import com.taobao.weex.annotation.JSMethod;
+import com.taobao.weex.bridge.JSCallback;
+import com.taobao.weex.common.WXModule;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class WXEventModule extends WXModule {
+
+ private static final String WEEX_CATEGORY = "com.taobao.android.intent.category.WEEX";
+ private static final String WEEX_ACTION = "com.taobao.android.intent.action.WEEX";
+
+ private static final int CAMERA_PERMISSION_REQUEST_CODE = 0x9;
+
+
+ @JSMethod(uiThread = true)
+ public void openURL(String url) {
+ if (TextUtils.isEmpty(url)) {
+ return;
+ }
+ String scheme = Uri.parse(url).getScheme();
+ StringBuilder builder = new StringBuilder();
+
+ if ("weex://go/scan".equals(url)) {
+ if (ContextCompat.checkSelfPermission(mWXSDKInstance.getContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
+ if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) mWXSDKInstance.getContext(), Manifest.permission.CAMERA)) {
+ showCameraPermissionRationale();
+ } else{
+ ActivityCompat.requestPermissions((Activity) mWXSDKInstance.getContext(), new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_REQUEST_CODE);
+ }
+ } else {
+ mWXSDKInstance.getContext().startActivity(new Intent(mWXSDKInstance.getContext(), CaptureActivity.class));
+ }
+ return;
+ }
+
+ if (TextUtils.equals("http", scheme) || TextUtils.equals("https", scheme) || TextUtils.equals("file", scheme)) {
+ builder.append(url);
+ } else {
+ builder.append("http:");
+ builder.append(url);
+ }
+
+ Uri uri = Uri.parse(builder.toString());
+ Intent intent = new Intent(mWXSDKInstance.getContext(),WXPageActivity.class);
+ intent.setAction(WEEX_ACTION);
+ intent.setData(uri);
+ intent.addCategory(WEEX_CATEGORY);
+ mWXSDKInstance.getContext().startActivity(intent);
+
+ if (mWXSDKInstance.checkModuleEventRegistered("event", this)) {
+ HashMap<String,Object> params=new HashMap<>();
+ params.put("param1","param1");
+ params.put("param2","param2");
+ params.put("param3","param3");
+ mWXSDKInstance.fireModuleEvent("event", this, params);
+ }
+ }
+
+ private void showCameraPermissionRationale() {
+ if (mWXSDKInstance.getContext() instanceof AppCompatActivity) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(((AppCompatActivity) mWXSDKInstance.getContext()));
+ builder.setMessage("Weex playground need the camera permission to scan QR code");
+ builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ ActivityCompat.requestPermissions((Activity) mWXSDKInstance.getContext(), new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_REQUEST_CODE);
+ }
+ });
+ builder.create().show();
+ }
+ }
+
+ /*
+ * a test method for macaca case, you can fire globalEvent when download finish、device shaked and so on.
+ * @param event event name
+ * */
+ @JSMethod(uiThread = true)
+ public void fireNativeGlobalEvent(String event, JSCallback callback) {
+ Map<String,Object> params=new HashMap<String,Object>();
+ params.put("eventParam","value");
+
+ mWXSDKInstance.fireGlobalEventCallback(event, params);
+ if (null != callback) {
+ Map<String, Boolean> result = new HashMap<String, Boolean>();
+ result.put("ok",true);
+ callback.invoke(result);
+ }
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) {
+ if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ mWXSDKInstance.getContext().startActivity(new Intent(mWXSDKInstance.getContext(), CaptureActivity.class));
+ } else {
+ Toast.makeText(mWXSDKInstance.getContext(), "request camara permission fail!", Toast.LENGTH_SHORT).show();
+ }
+ }
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/extend/module/WXTitleBar.java b/android/playground/src/main/java/com/alibaba/weex/extend/module/WXTitleBar.java
new file mode 100644
index 0000000..617b1fd
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/extend/module/WXTitleBar.java
@@ -0,0 +1,127 @@
+/**
+ * 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.module;
+
+import android.app.Activity;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.support.v4.graphics.drawable.DrawableCompat;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
+import android.view.Menu;
+import android.view.MenuItem;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.weex.R;
+import com.taobao.weex.annotation.JSMethod;
+import com.taobao.weex.common.WXModule;
+import com.taobao.weex.utils.WXResourceUtils;
+
+
+/**
+ * Created by moxun on 12/01/2018.
+ */
+
+public class WXTitleBar extends WXModule {
+ @JSMethod
+ public void setTitle(String title) {
+ ActionBar actionBar = getActionBar();
+ if (actionBar != null) {
+ actionBar.setTitle(String.valueOf(title));
+ }
+ }
+
+ @JSMethod
+ public void setStyle(JSONObject object) {
+ String bgColor = object.getString("backgroundColor");
+ String color = object.getString("foregroundColor");
+ ActionBar actionBar = getActionBar();
+ if (actionBar != null) {
+ if (bgColor != null) {
+ int c = WXResourceUtils.getColor(bgColor);
+ actionBar.setBackgroundDrawable(new ColorDrawable(c));
+ }
+
+ if (color != null) {
+ int c = WXResourceUtils.getColor(color);
+
+ Toolbar toolbar = (Toolbar) ((Activity) mWXSDKInstance.getContext()).findViewById(R.id.toolbar);
+ if (toolbar != null) {
+ toolbar.setTitleTextColor(c);
+ toolbar.setSubtitleTextColor(c);
+
+ Drawable upNavigation = toolbar.getNavigationIcon();
+ if (null != upNavigation) {
+ upNavigation = DrawableCompat.wrap(upNavigation);
+ upNavigation = upNavigation.mutate();
+ DrawableCompat.setTint(upNavigation, c);
+ toolbar.setNavigationIcon(upNavigation);
+ }
+
+ Drawable overflowIcon = toolbar.getOverflowIcon();
+ if (null != overflowIcon) {
+ overflowIcon = DrawableCompat.wrap(overflowIcon);
+ overflowIcon = overflowIcon.mutate();
+ DrawableCompat.setTint(overflowIcon, c);
+ toolbar.setOverflowIcon(overflowIcon);
+ }
+
+ Menu menu = toolbar.getMenu();
+ if (menu != null && menu.size() > 0) {
+ for (int i = 0; i < menu.size(); i++) {
+ MenuItem item = menu.getItem(i);
+ if (item != null && item.getIcon() != null) {
+ Drawable drawable = item.getIcon();
+ if (null != drawable) {
+ drawable = DrawableCompat.wrap(drawable);
+ drawable = drawable.mutate();
+ DrawableCompat.setTint(drawable, c);
+ item.setIcon(drawable);
+ }
+ }
+ }
+ ((Activity) mWXSDKInstance.getContext()).invalidateOptionsMenu();
+ }
+ }
+ }
+ }
+ }
+
+ @JSMethod
+ public void showTitleBar(String isShow) {
+ ActionBar actionBar = getActionBar();
+ if (actionBar != null) {
+ if ("true".equals(isShow) && !actionBar.isShowing()) {
+ actionBar.show();
+ }
+
+ if ("false".equals(isShow) && actionBar.isShowing()) {
+ actionBar.hide();
+ }
+ }
+ }
+
+ private ActionBar getActionBar() {
+ if (mWXSDKInstance.getContext() instanceof AppCompatActivity) {
+ return ((AppCompatActivity) mWXSDKInstance.getContext()).getSupportActionBar();
+ }
+ return null;
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/extend/module/WXWsonTestModule.java b/android/playground/src/main/java/com/alibaba/weex/extend/module/WXWsonTestModule.java
new file mode 100644
index 0000000..11a2d12
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/extend/module/WXWsonTestModule.java
@@ -0,0 +1,101 @@
+/**
+ * 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.module;
+
+import android.util.Log;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.annotation.JSMethod;
+import com.taobao.weex.bridge.JSCallback;
+import com.taobao.weex.bridge.WXBridgeManager;
+import com.taobao.weex.common.WXModule;
+import com.taobao.weex.utils.WXWsonJSONSwitch;
+import com.taobao.weex.wson.Wson;
+
+/**
+ * Created by furture on 2018/1/18.
+ */
+
+public class WXWsonTestModule extends WXModule {
+
+ @JSMethod(uiThread = false)
+ public boolean callPass(JSONObject params) {
+ if(params.get("refundId") != null){
+ if(params.get("refundId").getClass() != Long.class){
+ Log.e("Weex", "weex wson refundId failed case");
+ return false;
+ }
+ return ((Long)params.get("refundId")) == 6419458776149741l;
+ }
+
+ if(params.get("refundId2") != null){
+ if(params.get("refundId2").getClass() != Long.class){
+ Log.e("Weex", "weex wson refundId failed case");
+ return false;
+ }
+ return ((Long)params.get("refundId2")) == 64194587761497416l;
+ }
+
+
+
+
+ return true;
+ }
+
+ @JSMethod(uiThread = false)
+ public Object back(JSONObject params) {
+ JSONObject back = new JSONObject(params);
+ back.put("longMax", Long.MAX_VALUE);
+ back.put("longMin", Long.MIN_VALUE);
+ back.put("javaJSON", back.toJSONString());
+ return back;
+ }
+
+ @JSMethod(uiThread = false)
+ public void backAsync(JSONObject params, JSCallback callback) {
+ JSONObject back = new JSONObject(params);
+ back.put("longMax", Long.MAX_VALUE);
+ back.put("longMin", Long.MIN_VALUE);
+ back.put("javaJSON", back.toJSONString());
+ callback.invoke(back);
+ }
+
+ @JSMethod(uiThread = false)
+ public Object benchmark(JSONObject params) {
+ if(params == null){
+ throw new RuntimeException("params is null");
+ }//do nothing
+ return params;
+ }
+
+ @JSMethod(uiThread = false)
+ public void switchTrans(JSCallback callback) {
+ if(WXWsonJSONSwitch.USE_WSON){
+ WXBridgeManager.updateGlobalConfig("wson_off");
+ callback.invoke("wson off, use json");
+ }else{
+ WXBridgeManager.updateGlobalConfig("wson_on");
+ callback.invoke("wson on, use wson");
+ }
+ }
+
+
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/extend/module/location/DefaultLocation.java b/android/playground/src/main/java/com/alibaba/weex/extend/module/location/DefaultLocation.java
new file mode 100644
index 0000000..5b24def
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/extend/module/location/DefaultLocation.java
@@ -0,0 +1,373 @@
+/*
+ * 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.module.location;
+
+import android.Manifest;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.location.Address;
+import android.location.Criteria;
+import android.location.Geocoder;
+import android.location.Location;
+import android.location.LocationListener;
+import android.location.LocationManager;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.support.v4.app.ActivityCompat;
+import android.text.TextUtils;
+
+import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKInstance;
+import com.taobao.weex.bridge.SimpleJSCallback;
+import com.taobao.weex.utils.WXLogUtils;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+public class DefaultLocation implements ILocatable {
+
+ private static final String TAG = "DefaultLocation";
+ private static final int TIME_OUT_WHAT = 0x11;
+
+ private Map<String, WXLocationListener> mRegisterSucCallbacks = new HashMap<>();
+ private List<WXLocationListener> mWXLocationListeners = new ArrayList<>();
+ private WXSDKInstance mWXSDKInstance;
+ private LocationManager mLocationManager;
+
+ private static final int GPS_TIMEOUT = 15000;
+ private int MIN_TIME = 20000;
+ private int MIN_DISTANCE = 5;
+
+ public DefaultLocation(WXSDKInstance instance) {
+ mWXSDKInstance = instance;
+ }
+
+ @Override
+ public void setWXSDKInstance(WXSDKInstance WXSDKInstance) {
+ mWXSDKInstance = WXSDKInstance;
+ }
+
+ @Override
+ public void getCurrentPosition(final String successCallback, final String errorCallback, final String params) {
+ WXLogUtils.d(TAG, "into--[getCurrentPosition] successCallback:" + successCallback + " \nerrorCallback:" + errorCallback + " \nparams:" + params);
+ if (!TextUtils.isEmpty(params)) {
+ try {
+ JSONObject jsObj = new JSONObject(params);
+ boolean enableHighAccuracy = jsObj.optBoolean("enableHighAccuracy");
+ boolean enableAddress = jsObj.optBoolean("address");
+ WXLocationListener listener = findLocation(null, successCallback, errorCallback, enableHighAccuracy, enableAddress);
+ if (listener != null) {
+ mWXLocationListeners.add(listener);
+ }
+ return;
+ } catch (JSONException e) {
+ WXLogUtils.e(TAG, e);
+ }
+ }
+ Map<String, Object> options = new HashMap<>();
+ options.put(ERROR_CODE, ErrorCode.PARAMS_ERROR);
+ options.put(ERROR_MSG, ErrorMsg.PARAMS_ERROR);
+ if (mWXSDKInstance != null) {
+ new SimpleJSCallback(mWXSDKInstance.getInstanceId(), errorCallback).invoke(options);
+ }
+ }
+
+ private WXLocationListener findLocation(String watchId, String sucCallback, String errorCallback, boolean enableHighAccuracy, boolean enableAddress) {
+ WXLogUtils.d(TAG, "into--[findLocation] mWatchId:" + watchId + "\nsuccessCallback:" + sucCallback + "\nerrorCallback:" + errorCallback + "\nenableHighAccuracy:" + enableHighAccuracy + "\nmEnableAddress:" + enableAddress);
+
+ if (mLocationManager == null) {
+ mLocationManager = (LocationManager) mWXSDKInstance.getContext().getSystemService(Context.LOCATION_SERVICE);
+ }
+ Criteria criteria = new Criteria();
+ if (enableHighAccuracy) {
+ criteria.setAccuracy(Criteria.ACCURACY_COARSE);
+ }
+ //String provider = locationManager.getBestProvider(criteria, false);
+ if (ActivityCompat.checkSelfPermission(mWXSDKInstance.getContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mWXSDKInstance.getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
+ WXLocationListener WXLocationListener = new WXLocationListener(mLocationManager, mWXSDKInstance, watchId, sucCallback, errorCallback, enableAddress);
+ if (mLocationManager.getAllProviders().contains(LocationManager.GPS_PROVIDER)) {
+ mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME, MIN_DISTANCE, WXLocationListener);
+ }
+ if (mLocationManager.getAllProviders().contains(LocationManager.NETWORK_PROVIDER)) {
+ mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME, MIN_DISTANCE, WXLocationListener);
+ }
+ return WXLocationListener;
+ } else {
+ Map<String, Object> options = new HashMap<>();
+ options.put(ERROR_CODE, ErrorCode.NO_PERMISSION_ERROR);
+ options.put(ERROR_MSG, ErrorMsg.NO_PERMISSION_ERROR);
+ if (mWXSDKInstance != null) {
+ new SimpleJSCallback(mWXSDKInstance.getInstanceId(), errorCallback).invoke(options);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void watchPosition(final String successCallback, final String errorCallback, final String params) {
+ if (WXEnvironment.isApkDebugable()){
+ WXLogUtils.d("into--[watchPosition] successCallback:" + successCallback + " errorCallback:" + errorCallback + "\nparams:" + params);
+ }
+ if (!TextUtils.isEmpty(params)) {
+ try {
+ JSONObject jsObj = new JSONObject(params);
+ boolean enableHighAccuracy = jsObj.optBoolean("enableHighAccuracy");
+ boolean enableAddress = jsObj.optBoolean("address");
+
+ String id = UUID.randomUUID().toString();
+ WXLocationListener listener = findLocation(id, successCallback, errorCallback, enableHighAccuracy, enableAddress);
+ if (listener != null) {
+ mRegisterSucCallbacks.put(id, listener);
+ }
+ return;
+ } catch (JSONException e) {
+ WXLogUtils.e(TAG, e);
+ }
+ }
+ Map<String, Object> options = new HashMap<>();
+ options.put(ERROR_CODE, ErrorCode.PARAMS_ERROR);
+ options.put(ERROR_MSG, ErrorMsg.PARAMS_ERROR);
+ if (mWXSDKInstance != null) {
+ new SimpleJSCallback(mWXSDKInstance.getInstanceId(), errorCallback).invoke(options);
+ }
+ }
+
+ @Override
+ public void clearWatch(String watchId) {
+ WXLogUtils.d("into--[clearWatch] mWatchId:" + watchId);
+ if (mWXSDKInstance == null || mWXSDKInstance.isDestroy() || mLocationManager == null) {
+ return;
+ }
+ if (ActivityCompat.checkSelfPermission(mWXSDKInstance.getContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mWXSDKInstance.getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
+ WXLocationListener listener = mRegisterSucCallbacks.get(watchId);
+ if (listener != null) {
+ listener.destroy();
+ mLocationManager.removeUpdates(listener);
+ }
+ mRegisterSucCallbacks.remove(watchId);
+ }
+ }
+
+ @Override
+ public void destroy() {
+ WXLogUtils.d("into--[destroy]");
+ if (mWXSDKInstance == null || mWXSDKInstance.isDestroy() || mLocationManager == null) {
+ return;
+ }
+
+ if (mWXLocationListeners != null && mWXLocationListeners.size() > 0) {
+ if (ActivityCompat.checkSelfPermission(mWXSDKInstance.getContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mWXSDKInstance.getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
+ for (WXLocationListener listener : mWXLocationListeners) {
+ if (listener != null) {
+ listener.destroy();
+ mLocationManager.removeUpdates(listener);
+ }
+ }
+ mWXLocationListeners.clear();
+ }
+ }
+
+ if (mRegisterSucCallbacks != null && mRegisterSucCallbacks.size() > 0) {
+ Collection<WXLocationListener> values = mRegisterSucCallbacks.values();
+ if (ActivityCompat.checkSelfPermission(mWXSDKInstance.getContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mWXSDKInstance.getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
+ for (WXLocationListener listener : values) {
+ listener.destroy();
+ mLocationManager.removeUpdates(listener);
+ }
+ mRegisterSucCallbacks.clear();
+ }
+ }
+ }
+
+ static class WXLocationListener implements LocationListener, Handler.Callback {
+
+ private Context mContext = null;
+ private String mWatchId;
+ private SimpleJSCallback mSucCallback = null;
+ private SimpleJSCallback mErrorCallback = null;
+ private boolean mEnableAddress;
+ private Handler mHandler;
+ private LocationManager mLocationManager;
+
+ private WXLocationListener(LocationManager locationManager, WXSDKInstance instance, String watchId, String sucCallback, String errorCallback, boolean enableAddress) {
+ this.mWatchId = watchId;
+ if (instance != null) {
+ this.mSucCallback = new SimpleJSCallback(instance.getInstanceId(), sucCallback);
+ this.mErrorCallback = new SimpleJSCallback(instance.getInstanceId(), errorCallback);
+ mContext = instance.getContext();
+ }
+ this.mEnableAddress = enableAddress;
+ mHandler = new Handler(this);
+ mLocationManager = locationManager;
+ mHandler.sendEmptyMessageDelayed(TIME_OUT_WHAT, GPS_TIMEOUT);
+ }
+
+ @Override
+ public void onLocationChanged(Location location) {
+ mHandler.removeMessages(TIME_OUT_WHAT);
+ WXLogUtils.d(TAG, "into--[onLocationChanged] location:" + location == null ? "Location is NULL!" : location.toString());
+
+ if (location != null) {
+ Map<String, Object> result = new HashMap<>();
+ Map<String, Object> coords = new HashMap<>();
+ double longitude = location.getLongitude();
+ double latitude = location.getLatitude();
+ coords.put("longitude", longitude);
+ coords.put("latitude", latitude);
+ coords.put("altitude", location.getAltitude());
+ coords.put("accuracy", location.getAccuracy());
+ coords.put("heading", location.getBearing());
+ coords.put("speed", location.getSpeed());
+ result.put(COORDS, coords);
+
+ // 行政区域
+ if (mEnableAddress) {
+ Address addr = getAddress(latitude, longitude);
+ Map<String, Object> address = new HashMap<>();
+ if (addr != null) {
+ address.put("country", addr.getCountryName());
+ address.put("province", addr.getAdminArea());
+ address.put("city", addr.getLocality());
+ address.put("cityCode", addr.getPostalCode());
+ address.put("area", addr.getSubLocality());
+ address.put("road", addr.getThoroughfare());
+ // 其中getAddressLine(0)表示国家,getAddressLine(1)表示精确到某个区,getAddressLine(2)表示精确到具体的街
+ StringBuilder sb = new StringBuilder();
+ for (int i = 1; i <= 2; i++) {
+ if (!TextUtils.isEmpty(addr.getAddressLine(i))) { //防止null导致的拼接错误
+ sb.append(addr.getAddressLine(i));
+ }
+ }
+ address.put("addressLine", sb.toString());
+ }
+ result.put(ADDRESS, address);
+ }
+ result.put(ERROR_CODE, ErrorCode.SUCCESS);
+ result.put(ERROR_MSG, ErrorMsg.SUCCESS);
+ if (!TextUtils.isEmpty(mWatchId)) {
+ result.put(WATCH_ID, mWatchId);
+ }
+
+ if (mSucCallback != null) {
+ boolean isKeepAlive = TextUtils.isEmpty(mWatchId) ? false : true;
+ if (isKeepAlive) {
+ mSucCallback.invokeAndKeepAlive(result);
+ } else {
+ mSucCallback.invoke(result);
+ }
+ }
+ } else {
+ Map<String, Object> options = new HashMap<>();
+ options.put(ERROR_CODE, ErrorCode.LOCATION_ERROR);
+ options.put(ERROR_MSG, ErrorMsg.LOCATION_ERROR);
+ if (!TextUtils.isEmpty(mWatchId)) {
+ options.put(WATCH_ID, mWatchId);
+ }
+ if (mErrorCallback != null) {
+ boolean isKeepAlive = TextUtils.isEmpty(mWatchId) ? false : true;
+ if (isKeepAlive) {
+ mErrorCallback.invokeAndKeepAlive(options);
+ } else {
+ mErrorCallback.invoke(options);
+ }
+ }
+ }
+ if (TextUtils.isEmpty(mWatchId) && mContext != null) {
+ if (mLocationManager != null && ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
+ destroy();
+ mLocationManager.removeUpdates(this);
+ }
+ }
+ }
+
+ @Override
+ public void onStatusChanged(String provider, int status, Bundle extras) {
+ WXLogUtils.i(TAG, "into--[onStatusChanged] provider:" + provider + " status:" + status);
+ }
+
+ @Override
+ public void onProviderEnabled(String provider) {
+ WXLogUtils.i(TAG, "into--[onProviderEnabled] provider:" + provider);
+ }
+
+ @Override
+ public void onProviderDisabled(String provider) {
+ WXLogUtils.i(TAG, "into--[onProviderDisabled] provider:" + provider);
+ }
+
+ @Override
+ public boolean handleMessage(Message msg) {
+ if (msg.what == TIME_OUT_WHAT) {
+ WXLogUtils.d(TAG, "into--[handleMessage] Location Time Out!");
+ if (mContext == null || mLocationManager == null) {
+ return false;
+ }
+ if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
+ mLocationManager.removeUpdates(this);
+ }
+ Map<String, Object> options = new HashMap<>();
+ options.put(ERROR_CODE, ErrorCode.LOCATION_TIME_OUT);
+ options.put(ERROR_MSG, ErrorMsg.LOCATION_TIME_OUT);
+ if (!TextUtils.isEmpty(mWatchId)) {
+ options.put(WATCH_ID, mWatchId);
+ }
+ if (mErrorCallback != null) {
+ mErrorCallback.invoke(options);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * get address info
+ */
+ private Address getAddress(double latitude, double longitude) {
+ WXLogUtils.d(TAG, "into--[getAddress] latitude:" + latitude + " longitude:" + longitude);
+ try {
+ if (mContext == null) {
+ return null;
+ }
+ Geocoder gc = new Geocoder(mContext);
+ List<Address> list = gc.getFromLocation(latitude, longitude, 1);
+ if (list != null && list.size() > 0) {
+ return list.get(0);
+ }
+ } catch (Exception e) {
+ WXLogUtils.e(TAG, e);
+ }
+ return null;
+ }
+
+ public void destroy() {
+ if (mHandler != null) {
+ mHandler.removeMessages(TIME_OUT_WHAT);
+ mContext = null;
+ }
+ }
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/extend/module/location/ILocatable.java b/android/playground/src/main/java/com/alibaba/weex/extend/module/location/ILocatable.java
new file mode 100644
index 0000000..09034e8
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/extend/module/location/ILocatable.java
@@ -0,0 +1,94 @@
+/*
+ * 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.module.location;
+
+import com.taobao.weex.WXSDKInstance;
+
+/**
+ */
+public interface ILocatable {
+
+ int REQUEST_CUR_PERMISSION_CODE = 0x12;
+ int REQUEST_WATCH_PERMISSION_CODE = 0x13;
+
+
+ String REQUEST_PERMISSION_CODE = "requestCode";
+ String ERROR_CODE = "errorCode";
+ String ERROR_MSG = "errorMsg";
+ String COORDS = "coords";
+ String ADDRESS = "address";
+ String WATCH_ID = "watchId";
+
+ interface ErrorCode {
+
+ int SUCCESS = 90000;
+ int NO_PERMISSION_ERROR = 90001;
+ int PARAMS_ERROR = 90002;
+ int LOCATION_ERROR = 9003;
+ int LOCATION_TIME_OUT = 9004;
+ }
+
+ interface ErrorMsg {
+
+ String NO_PERMISSION_ERROR = "NO PERMISSION";
+ String PARAMS_ERROR = "PARAMS_ERROR";
+ String LOCATION_ERROR = "LOCATION_FAIL";
+ String LOCATION_TIME_OUT = "LOCATION_TIME_OUT";
+ String SUCCESS = "SUCCESS";
+
+ }
+
+ /**
+ * Get current location information, the callback only once
+ *
+ * @param successCallback success callback function id.
+ * @param errorCallback error callback function id.(example:no persimmon)
+ * @param params JSON parameter(example:address).
+ */
+ void getCurrentPosition(String successCallback, String errorCallback, String params);
+
+ /**
+ * register global location listener,if location change,you will be notify.
+ *
+ * @param successCallback location success callback function id.
+ * @param errorCallback location error callback (example:no persimmon).
+ * @param params JSON parameter(example:address).
+ */
+ void watchPosition(String successCallback, String errorCallback, String params);
+
+ /**
+ * remove global location listener.
+ *
+ * @param watchId register id,you can get from watchPosition method。
+ */
+ void clearWatch(String watchId);
+
+ /**
+ * set instance
+ *
+ * @param instance instance
+ */
+ void setWXSDKInstance(WXSDKInstance instance);
+
+ /**
+ * this method will call when module destroy.
+ */
+ void destroy();
+
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/extend/module/location/LocationFactory.java b/android/playground/src/main/java/com/alibaba/weex/extend/module/location/LocationFactory.java
new file mode 100644
index 0000000..055dfc9
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/extend/module/location/LocationFactory.java
@@ -0,0 +1,30 @@
+/*
+ * 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.module.location;
+
+import com.taobao.weex.WXSDKInstance;
+
+/**
+ */
+public class LocationFactory {
+
+ public static ILocatable getLocationProvider(WXSDKInstance context){
+ return new DefaultLocation(context);
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/extend/view/WXMaskView.java b/android/playground/src/main/java/com/alibaba/weex/extend/view/WXMaskView.java
new file mode 100644
index 0000000..5ea766c
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/extend/view/WXMaskView.java
@@ -0,0 +1,34 @@
+/*
+ * 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.view;
+
+import android.content.Context;
+
+import com.taobao.weex.ui.view.WXFrameLayout;
+
+/**
+ * Created by lixinke on 2016/12/26.
+ */
+
+public class WXMaskView extends WXFrameLayout {
+
+ public WXMaskView(Context context) {
+ super(context);
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/https/HotRefreshManager.java b/android/playground/src/main/java/com/alibaba/weex/https/HotRefreshManager.java
new file mode 100644
index 0000000..c220d9c
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/https/HotRefreshManager.java
@@ -0,0 +1,119 @@
+/*
+ * 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.https;
+
+import android.os.Handler;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.alibaba.weex.constants.Constants;
+import com.squareup.okhttp.OkHttpClient;
+import com.squareup.okhttp.Request;
+import com.squareup.okhttp.Response;
+import com.squareup.okhttp.ws.WebSocket;
+import com.squareup.okhttp.ws.WebSocketCall;
+import com.squareup.okhttp.ws.WebSocketListener;
+
+import java.io.IOException;
+
+import okio.Buffer;
+import okio.BufferedSource;
+
+/**
+ */
+public class HotRefreshManager {
+
+ private static final String TAG = "HotRefreshManager";
+
+ private static HotRefreshManager hotRefreshInstance = new HotRefreshManager();
+ private WebSocket mWebSocket = null;
+ private Handler mHandler = null;
+
+ private HotRefreshManager() {
+ }
+
+ public static HotRefreshManager getInstance() {
+ return hotRefreshInstance;
+ }
+
+ public void setHandler(Handler handler) {
+ mHandler = handler;
+ }
+
+ public boolean disConnect() {
+ if (mWebSocket != null) {
+ try {
+ mWebSocket.close(1000, "activity finish!");
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return true;
+ }
+
+ public boolean connect(String url) {
+ OkHttpClient httpClient = new OkHttpClient();
+ Request request = new Request.Builder().url(url).addHeader("sec-websocket-protocol", "echo-protocol").build();
+ WebSocketCall.create(httpClient, request).enqueue(new WXWebSocketListener(url));
+
+ return true;
+ }
+
+ class WXWebSocketListener implements WebSocketListener {
+
+ private String mUrl;
+
+ WXWebSocketListener(String url) {
+ mUrl = url;
+ }
+
+ @Override
+ public void onOpen(WebSocket webSocket, Request request, Response response) throws IOException {
+ mWebSocket = webSocket;
+ }
+
+ @Override
+ public void onMessage(BufferedSource payload, WebSocket.PayloadType type) throws IOException {
+ if (type == WebSocket.PayloadType.TEXT) {
+ String temp = payload.readUtf8();
+ Log.e(TAG, "into--[onMessage] msg:" + temp);
+ payload.close();
+
+ if (TextUtils.equals("refresh", temp) && mHandler != null) {
+ mHandler.obtainMessage(Constants.HOT_REFRESH_REFRESH, 0, 0, mUrl).sendToTarget();
+ }
+ }
+ }
+
+ @Override
+ public void onPong(Buffer payload) {
+
+ }
+
+ @Override
+ public void onClose(int code, String reason) {
+ mWebSocket = null;
+ }
+
+ @Override
+ public void onFailure(IOException e) {
+ mWebSocket = null;
+ }
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/https/WXHttpManager.java b/android/playground/src/main/java/com/alibaba/weex/https/WXHttpManager.java
new file mode 100644
index 0000000..a47bbb0
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/https/WXHttpManager.java
@@ -0,0 +1,60 @@
+/*
+ * 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.https;
+
+import android.os.Handler;
+import android.os.Message;
+
+public class WXHttpManager {
+
+ private static WXHttpManager wxHttpManager;
+ private WXOkHttpDispatcher mOkHttpDispatcher;
+ private Handler mHandler = new Handler(new Handler.Callback() {
+
+ @Override
+ public boolean handleMessage(Message msg) {
+ WXHttpTask httpTask = (WXHttpTask) msg.obj;
+ if (httpTask == null || httpTask.requestListener == null) {
+ return true;
+ }
+ WXHttpResponse response = httpTask.response;
+ if (response == null || response.code >= 300) {
+ httpTask.requestListener.onError(httpTask);
+ } else {
+ httpTask.requestListener.onSuccess(httpTask);
+ }
+ return true;
+ }
+ });
+
+ private WXHttpManager() {
+ mOkHttpDispatcher = new WXOkHttpDispatcher(mHandler);
+ }
+
+ public static WXHttpManager getInstance() {
+ if (wxHttpManager == null) {
+ wxHttpManager = new WXHttpManager();
+ }
+ return wxHttpManager;
+ }
+
+ public void sendRequest(WXHttpTask httpTask) {
+ mOkHttpDispatcher.dispatchSubmit(httpTask);
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/https/WXHttpResponse.java b/android/playground/src/main/java/com/alibaba/weex/https/WXHttpResponse.java
new file mode 100644
index 0000000..bcced31
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/https/WXHttpResponse.java
@@ -0,0 +1,25 @@
+/*
+ * 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.https;
+
+public class WXHttpResponse {
+
+ public int code;
+ public byte[] data;
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/https/WXHttpTask.java b/android/playground/src/main/java/com/alibaba/weex/https/WXHttpTask.java
new file mode 100644
index 0000000..c1e0559
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/https/WXHttpTask.java
@@ -0,0 +1,26 @@
+/*
+ * 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.https;
+
+public class WXHttpTask {
+
+ public String url;
+ public WXRequestListener requestListener;
+ public WXHttpResponse response;
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/https/WXOkHttpDispatcher.java b/android/playground/src/main/java/com/alibaba/weex/https/WXOkHttpDispatcher.java
new file mode 100644
index 0000000..515a63b
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/https/WXOkHttpDispatcher.java
@@ -0,0 +1,103 @@
+/*
+ * 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.https;
+
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
+
+import com.squareup.okhttp.OkHttpClient;
+import com.squareup.okhttp.Request;
+import com.squareup.okhttp.Response;
+
+import java.util.concurrent.TimeUnit;
+
+public class WXOkHttpDispatcher {
+
+ static final int DEFAULT_READ_TIMEOUT_MILLIS = 20 * 1000; // 20s
+ static final int DEFAULT_WRITE_TIMEOUT_MILLIS = 20 * 1000; // 20s
+ static final int DEFAULT_CONNECT_TIMEOUT_MILLIS = 15 * 1000; // 15s
+ private static final int SUBMIT = 0x01;
+ private final OkHttpClient mOkHttpClient;
+ private final HandlerThread mDispatcherThread;
+ private Handler mUiHandler;
+ private DispatcherHandler mDispatcherHandler;
+
+ public WXOkHttpDispatcher(Handler handler) {
+ mUiHandler = handler;
+ mOkHttpClient = defaultOkHttpClient();
+ mDispatcherThread = new HandlerThread("dispatcherThread");
+ mDispatcherThread.start();
+ mDispatcherHandler = new DispatcherHandler(mDispatcherThread.getLooper(), mOkHttpClient, mUiHandler);
+ }
+
+ private static OkHttpClient defaultOkHttpClient() {
+ OkHttpClient client = new OkHttpClient();
+ client.setConnectTimeout(DEFAULT_CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
+ client.setReadTimeout(DEFAULT_READ_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
+ client.setWriteTimeout(DEFAULT_WRITE_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
+ return client;
+ }
+
+ public void dispatchSubmit(WXHttpTask task) {
+ mDispatcherHandler.sendMessage(mDispatcherHandler.obtainMessage(SUBMIT, task));
+ }
+
+ private static class DispatcherHandler extends Handler {
+
+ private OkHttpClient mOkHttpClient;
+ private Handler mUiHandler;
+
+ public DispatcherHandler(Looper looper, OkHttpClient okHttpClient, Handler handler) {
+ super(looper);
+ mOkHttpClient = okHttpClient;
+ mUiHandler = handler;
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ int what = msg.what;
+
+ switch (what) {
+ case SUBMIT: {
+ WXHttpTask task = (WXHttpTask) msg.obj;
+ Request.Builder builder = new Request.Builder().header("User-Agent", "WeAppPlusPlayground/1.0").url(task.url);
+ WXHttpResponse httpResponse = new WXHttpResponse();
+ try {
+ Response response = mOkHttpClient.newCall(builder.build()).execute();
+ httpResponse.code = response.code();
+ httpResponse.data = response.body().bytes();
+ task.response = httpResponse;
+ mUiHandler.sendMessage(mUiHandler.obtainMessage(1, task));
+ } catch (Throwable e) {
+ e.printStackTrace();
+ httpResponse.code = 1000;
+ mUiHandler.sendMessage(mUiHandler.obtainMessage(1, task));
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/https/WXRequestListener.java b/android/playground/src/main/java/com/alibaba/weex/https/WXRequestListener.java
new file mode 100644
index 0000000..933eb11
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/https/WXRequestListener.java
@@ -0,0 +1,26 @@
+/*
+ * 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.https;
+
+public interface WXRequestListener {
+
+ void onSuccess(WXHttpTask task);
+
+ void onError(WXHttpTask task);
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/update/CheckForUpdateUtil.java b/android/playground/src/main/java/com/alibaba/weex/update/CheckForUpdateUtil.java
new file mode 100644
index 0000000..6bb0d84
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/update/CheckForUpdateUtil.java
@@ -0,0 +1,167 @@
+/**
+ * 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.update;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.TextView;
+
+import com.alibaba.weex.R;
+import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKManager;
+import com.taobao.weex.adapter.IWXHttpAdapter;
+import com.taobao.weex.common.WXRequest;
+import com.taobao.weex.common.WXResponse;
+import com.taobao.weex.utils.WXLogUtils;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.net.URL;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by moxun on 2018/3/9.
+ */
+
+public class CheckForUpdateUtil {
+ public static void checkForUpdate(final Context context) {
+ PackageManager pm = context.getPackageManager();
+ try {
+ PackageInfo info = pm.getPackageInfo(context.getPackageName(), 0);
+ if (info != null) {
+ int versionCode = info.versionCode;
+ String updateUrl = "http://dotwe.org/release/latest?v=" + versionCode;
+ WXRequest request = new WXRequest();
+ request.method = "GET";
+ request.url = updateUrl;
+ WXLogUtils.d("Update", "check for update: " + versionCode);
+ WXSDKManager.getInstance().getIWXHttpAdapter().sendRequest(request, new IWXHttpAdapter.OnHttpListener() {
+ @Override
+ public void onHttpStart() {
+
+ }
+
+ @Override
+ public void onHeadersReceived(int statusCode, Map<String, List<String>> headers) {
+
+ }
+
+ @Override
+ public void onHttpUploadProgress(int uploadProgress) {
+
+ }
+
+ @Override
+ public void onHttpResponseProgress(int loadedLength) {
+
+ }
+
+ @Override
+ public void onHttpFinish(final WXResponse response) {
+ if (!response.statusCode.equals("200")) {
+ WXLogUtils.e("Update", "failed: " + response.statusCode);
+ return;
+ }
+ WXSDKManager.getInstance().getWXRenderManager().postOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ String s = new String(response.originalData);
+ if (!TextUtils.isEmpty(s)) {
+ try {
+ WXLogUtils.d("Update", s);
+ JSONObject object = new JSONObject(s);
+ JSONObject params = object.optJSONObject("params");
+ if (params != null) {
+ boolean hasUpdate = params.optBoolean("hasUpdate", false);
+ if (hasUpdate) {
+ String version = params.optString("version", "latest");
+ String updateDate = params.optString("updateDate", "");
+ final String updateUrl = params.optString("updateUrl", "");
+
+ try {
+ new URL(updateUrl);
+ } catch (Throwable t) {
+ WXLogUtils.e("Update", "Invalid update url");
+ return;
+ }
+
+ String updateDescription = params.optString("updateDescription", null);
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(context);
+
+ View view = LayoutInflater.from(context).inflate(R.layout.common_update_notify_dialog, null);
+ TextView textView = (TextView) view.findViewById(R.id.common_update_dialog_msg);
+ textView.setText(getMsg(version, updateDate, updateDescription));
+ builder.setCancelable(false)
+ .setView(view)
+ .setPositiveButton(R.string.update_now, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ UpdateService.startActionUpdate(context, updateUrl);
+ dialog.dismiss();
+ }
+ });
+
+ builder.setNegativeButton(R.string.update_remind_later, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ }
+ });
+
+ builder.create().show();
+ }
+ }
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }, 0);
+ }
+ });
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private static String getMsg(String v, String date, String desc) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(getStringRes(R.string.update_version)).append(v).append("\n")
+ .append(getStringRes(R.string.update_date)).append(date).append("\n")
+ .append(getStringRes(R.string.update_desc)).append(desc);
+ return sb.toString();
+ }
+
+ public static String getStringRes(int id) {
+ if (WXEnvironment.getApplication() != null) {
+ return WXEnvironment.getApplication().getString(id);
+ }
+ return "";
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/update/Downloader.java b/android/playground/src/main/java/com/alibaba/weex/update/Downloader.java
new file mode 100644
index 0000000..48675f6
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/update/Downloader.java
@@ -0,0 +1,130 @@
+/**
+ * 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.update;
+
+import com.squareup.okhttp.Callback;
+import com.squareup.okhttp.OkHttpClient;
+import com.squareup.okhttp.Request;
+import com.squareup.okhttp.Response;
+import com.taobao.weex.WXSDKManager;
+import com.taobao.weex.utils.WXLogUtils;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Created by moxun on 2018/3/9.
+ */
+
+public class Downloader {
+
+ public static void download(String url, final DownloadCallback callback) {
+ OkHttpClient client = new OkHttpClient();
+ Request request = new Request.Builder()
+ .url(url)
+ .get()
+ .build();
+
+ client.newCall(request).enqueue(new Callback() {
+ @Override
+ public void onFailure(Request request, IOException e) {
+ callback.onError(e);
+ }
+
+ @Override
+ public void onResponse(Response response) throws IOException {
+ callback.handleResponse(response);
+ }
+ });
+ }
+
+ public abstract static class DownloadCallback {
+ private String destDirPath;
+ private String destFileName;
+
+ public abstract void onProgress(float progress);
+
+ public abstract void onResponse(File file);
+
+ public abstract void onError(Exception e);
+
+ public DownloadCallback(String destDirPath, String destFileName) {
+ this.destDirPath = destDirPath;
+ this.destFileName = destFileName;
+ }
+
+ private void handleResponse(Response response) throws IOException {
+ final File file = saveToFile(response);
+ if (file != null && file.exists() && file.length() > 0) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ onResponse(file);
+ }
+ });
+ } else {
+ onError(new RuntimeException("Failed to save file"));
+ }
+ }
+
+ private File saveToFile(Response response) throws IOException {
+ InputStream is = null;
+ byte[] buf = new byte[40960];
+ int len = 0;
+ FileOutputStream fos = null;
+ try {
+ is = response.body().byteStream();
+ final long total = response.body().contentLength();
+ long sum = 0;
+
+ WXLogUtils.e(total + "");
+
+ File dir = new File(destDirPath);
+ if (!dir.exists()) {
+ dir.mkdirs();
+ }
+ File file = new File(dir, destFileName);
+ fos = new FileOutputStream(file);
+ while ((len = is.read(buf)) != -1) {
+ sum += len;
+ fos.write(buf, 0, len);
+ final long finalSum = sum;
+
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ onProgress(finalSum * 1.0f / total);
+ }
+ });
+ }
+ fos.flush();
+ return file;
+ } finally {
+ if (is != null) is.close();
+ if (fos != null) fos.close();
+ }
+ }
+
+ private void runOnUiThread(Runnable task) {
+ WXSDKManager.getInstance().getWXRenderManager().postOnUiThread(task, 0);
+ }
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/update/UpdateService.java b/android/playground/src/main/java/com/alibaba/weex/update/UpdateService.java
new file mode 100644
index 0000000..8e024e0
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/update/UpdateService.java
@@ -0,0 +1,126 @@
+/**
+ * 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.update;
+
+import android.app.IntentService;
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Build;
+import android.support.v4.content.FileProvider;
+import android.support.v7.app.NotificationCompat;
+import android.widget.Toast;
+
+import com.alibaba.weex.BuildConfig;
+import com.alibaba.weex.R;
+import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKManager;
+import com.taobao.weex.utils.WXLogUtils;
+
+import java.io.File;
+
+public class UpdateService extends IntentService {
+
+ private static final String ACTION_UPDATE = "com.taobao.weex.service.action.UPDATE";
+ private static final String EXTRA_URL = "com.taobao.weex.service.extra.URL";
+ private final int NOTIFY_ID = 10006024;
+
+ private NotificationManager manager;
+ private NotificationCompat.Builder builder;
+
+ public static void startActionUpdate(Context context, String url) {
+ Intent intent = new Intent(context, UpdateService.class);
+ intent.setAction(ACTION_UPDATE);
+ intent.putExtra(EXTRA_URL, url);
+ context.startService(intent);
+ }
+
+ public UpdateService() {
+ super("UpdateService");
+ }
+
+ @Override
+ protected void onHandleIntent(Intent intent) {
+ if (intent != null) {
+ final String action = intent.getAction();
+ if (ACTION_UPDATE.equals(action)) {
+ final String url = intent.getStringExtra(EXTRA_URL);
+ handleActionUpdate(url);
+ }
+ }
+ }
+
+ private void handleActionUpdate(String url) {
+ manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
+ builder = new NotificationCompat.Builder(this);
+ builder.setContentTitle(CheckForUpdateUtil.getStringRes(R.string.update_downloading))
+ .setContentText(CheckForUpdateUtil.getStringRes(R.string.update_progress) + " 0%")
+ .setTicker(CheckForUpdateUtil.getStringRes(R.string.update_downloading))
+ .setWhen(System.currentTimeMillis())
+ .setPriority(Notification.PRIORITY_DEFAULT)
+ .setSmallIcon(R.mipmap.ic_launcher)
+ .setProgress(100, 0, false);
+ manager.notify(NOTIFY_ID, builder.build());
+
+ WXLogUtils.e("Update", "start download");
+ Downloader.download(url, new Downloader.DownloadCallback(getCacheDir().getAbsolutePath(), "playground.apk") {
+
+ @Override
+ public void onProgress(float progress) {
+ if (progress * 100 - progress >= 1) {
+ int p = (int) (progress * 100);
+ builder.setContentText(CheckForUpdateUtil.getStringRes(R.string.update_progress) + p + "%");
+ builder.setProgress(100, p, false);
+ manager.notify(NOTIFY_ID, builder.build());
+ WXLogUtils.d("Update", "progress:" + p);
+ }
+ }
+
+ @Override
+ public void onResponse(File file) {
+ WXLogUtils.d("Update", "success: " + file.getAbsolutePath());
+ manager.cancel(NOTIFY_ID);
+ Uri uri = Uri.fromFile(file);
+ Intent installIntent = new Intent(Intent.ACTION_VIEW);
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+ installIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ Uri contentUri = FileProvider.getUriForFile(WXEnvironment.getApplication(), BuildConfig.APPLICATION_ID + ".fileprovider", file);
+ installIntent.setDataAndType(contentUri, "application/vnd.android.package-archive");
+ } else {
+ installIntent.setDataAndType(uri, "application/vnd.android.package-archive");
+ installIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
+ startActivity(installIntent);
+ }
+
+ @Override
+ public void onError(final Exception e) {
+ WXSDKManager.getInstance().getWXRenderManager().postOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ Toast.makeText(UpdateService.this, "Failed to update:" + e.getMessage(), Toast.LENGTH_SHORT).show();
+ }
+ }, 0);
+ }
+ });
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/util/CoverageDataDumper.java b/android/playground/src/main/java/com/alibaba/weex/util/CoverageDataDumper.java
new file mode 100644
index 0000000..adc0476
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/util/CoverageDataDumper.java
@@ -0,0 +1,36 @@
+/*
+ * 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.util;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+import com.taobao.weex.utils.WXLogUtils;
+
+import java.io.File;
+
+public class CoverageDataDumper extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+// JacocoCodeCoverage.dumpCodeCoverage(context);
+ JacocoCodeCoverage.dumpCodeCoverageByJacoco(context);
+ }
+}
diff --git a/android/playground/src/main/java/com/alibaba/weex/util/JacocoCodeCoverage.java b/android/playground/src/main/java/com/alibaba/weex/util/JacocoCodeCoverage.java
new file mode 100644
index 0000000..bcef856
--- /dev/null
+++ b/android/playground/src/main/java/com/alibaba/weex/util/JacocoCodeCoverage.java
@@ -0,0 +1,93 @@
+/*
+ * 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.util;
+
+import android.content.Context;
+import android.util.Log;
+
+import com.taobao.weex.utils.WXLogUtils;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.lang.reflect.InvocationTargetException;
+
+public class JacocoCodeCoverage {
+ public static final String TAG = "CoverageDataDumper";
+
+ public static void dumpCodeCoverage(Context context){
+
+ WXLogUtils.d( TAG, "CoverageDataDumper BroadcastReceiver " );
+
+ try {
+ Class
+ .forName( "com.vladium.emma.rt.RT" )
+ .getMethod( "dumpCoverageData", File.class, boolean.class, boolean.class )
+ .invoke( null,
+ new File(context.getExternalFilesDir( null ) + "/coverage.ec" ),
+ true, // merge
+ false // stopDataCollection
+ );
+ WXLogUtils.d( TAG, "generateCoverageReport: ok! " +
+ "file in [Android/data/com.alibaba.weex/files]" );
+ }
+
+ catch ( Exception e ) {
+ WXLogUtils.e( TAG, e );
+ }
+ }
+
+ public static void dumpCodeCoverageByJacoco(Context context){
+
+ WXLogUtils.d(TAG, "generateCoverageReport()");
+
+ java.io.File coverageFile = new File(context.getExternalFilesDir( null ) + "/coverage.ec");
+ OutputStream out = null;
+ // We may use this if we want to avoid refecltion and we include
+ // emma.jar
+ //RT.dumpCoverageData(coverageFile, false, false);
+ // Use reflection to call emma dump coverage method, to avoid
+ // always statically compiling against emma jar
+ try {
+ Object agent = Class.forName("org.jacoco.agent.rt.RT")
+ .getMethod("getAgent")
+ .invoke(null);
+ out = new FileOutputStream(coverageFile,false);
+ out.write((byte[]) agent.getClass().getMethod("getExecutionData", boolean.class)
+ .invoke(agent, false));
+ WXLogUtils.d( TAG, "generateCoverageReport: ok! " +
+ "file in [Android/data/com.alibaba.weex/files]" );
+
+ } catch (Exception e) {
+ Log.e(TAG, e.toString());
+ } finally {
+ if (out != null) {
+ try {
+ out.close();
+ } catch (IOException e) {
+ Log.e(TAG, e.getMessage().toString());
+ }
+ }
+ }
+ }
+}
+
+
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/AmbientLightManager.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/AmbientLightManager.java
new file mode 100755
index 0000000..cc4e405
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/AmbientLightManager.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2012 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+import android.preference.PreferenceManager;
+
+import com.google.zxing.client.android.camera.CameraManager;
+import com.google.zxing.client.android.camera.FrontLightMode;
+
+/**
+ * Detects ambient light and switches on the front light when very dark, and off again when sufficiently light.
+ *
+ * @author Sean Owen
+ * @author Nikolaus Huber
+ */
+final class AmbientLightManager implements SensorEventListener {
+
+ private static final float TOO_DARK_LUX = 45.0f;
+ private static final float BRIGHT_ENOUGH_LUX = 450.0f;
+
+ private final Context context;
+ private CameraManager cameraManager;
+ private Sensor lightSensor;
+
+ AmbientLightManager(Context context) {
+ this.context = context;
+ }
+
+ void start(CameraManager cameraManager) {
+ this.cameraManager = cameraManager;
+ SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
+ if (FrontLightMode.readPref(sharedPrefs) == FrontLightMode.AUTO) {
+ SensorManager sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
+ lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
+ if (lightSensor != null) {
+ sensorManager.registerListener(this, lightSensor, SensorManager.SENSOR_DELAY_NORMAL);
+ }
+ }
+ }
+
+ void stop() {
+ if (lightSensor != null) {
+ SensorManager sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
+ sensorManager.unregisterListener(this);
+ cameraManager = null;
+ lightSensor = null;
+ }
+ }
+
+ @Override
+ public void onSensorChanged(SensorEvent sensorEvent) {
+ float ambientLightLux = sensorEvent.values[0];
+ if (cameraManager != null) {
+ if (ambientLightLux <= TOO_DARK_LUX) {
+ cameraManager.setTorch(true);
+ } else if (ambientLightLux >= BRIGHT_ENOUGH_LUX) {
+ cameraManager.setTorch(false);
+ }
+ }
+ }
+
+ @Override
+ public void onAccuracyChanged(Sensor sensor, int accuracy) {
+ // do nothing
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/BeepManager.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/BeepManager.java
new file mode 100755
index 0000000..7cf7467
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/BeepManager.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2010 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.res.AssetFileDescriptor;
+import android.media.AudioManager;
+import android.media.MediaPlayer;
+import android.os.Vibrator;
+import android.preference.PreferenceManager;
+import android.util.Log;
+
+import com.alibaba.weex.R;
+
+import java.io.Closeable;
+import java.io.IOException;
+
+
+/**
+ * Manages beeps and vibrations for {@link CaptureActivity}.
+ */
+final class BeepManager implements MediaPlayer.OnErrorListener, Closeable {
+
+ private static final String TAG = BeepManager.class.getSimpleName();
+
+ private static final float BEEP_VOLUME = 0.10f;
+ private static final long VIBRATE_DURATION = 200L;
+
+ private final Activity activity;
+ private MediaPlayer mediaPlayer;
+ private boolean playBeep;
+ private boolean vibrate;
+
+ BeepManager(Activity activity) {
+ this.activity = activity;
+ this.mediaPlayer = null;
+ updatePrefs();
+ }
+
+ synchronized void updatePrefs() {
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
+ playBeep = shouldBeep(prefs, activity);
+ vibrate = prefs.getBoolean(PreferencesActivity.KEY_VIBRATE, false);
+ if (playBeep && mediaPlayer == null) {
+ // The volume on STREAM_SYSTEM is not adjustable, and users found it too loud,
+ // so we now play on the music stream.
+ activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);
+ mediaPlayer = buildMediaPlayer(activity);
+ }
+ }
+
+ synchronized void playBeepSoundAndVibrate() {
+ if (playBeep && mediaPlayer != null) {
+ mediaPlayer.start();
+ }
+ if (vibrate) {
+ Vibrator vibrator = (Vibrator) activity.getSystemService(Context.VIBRATOR_SERVICE);
+ vibrator.vibrate(VIBRATE_DURATION);
+ }
+ }
+
+ private static boolean shouldBeep(SharedPreferences prefs, Context activity) {
+ boolean shouldPlayBeep = prefs.getBoolean(PreferencesActivity.KEY_PLAY_BEEP, true);
+ if (shouldPlayBeep) {
+ // See if sound settings overrides this
+ AudioManager audioService = (AudioManager) activity.getSystemService(Context.AUDIO_SERVICE);
+ if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {
+ shouldPlayBeep = false;
+ }
+ }
+ return shouldPlayBeep;
+ }
+
+ private MediaPlayer buildMediaPlayer(Context activity) {
+ MediaPlayer mediaPlayer = new MediaPlayer();
+ try {
+ AssetFileDescriptor file = activity.getResources().openRawResourceFd(R.raw.beep);
+ try {
+ mediaPlayer.setDataSource(file.getFileDescriptor(), file.getStartOffset(), file.getLength());
+ } finally {
+ file.close();
+ }
+ mediaPlayer.setOnErrorListener(this);
+ mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
+ mediaPlayer.setLooping(false);
+ mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME);
+ mediaPlayer.prepare();
+ return mediaPlayer;
+ } catch (IOException ioe) {
+ Log.w(TAG, ioe);
+ mediaPlayer.release();
+ return null;
+ }
+ }
+
+ @Override
+ public synchronized boolean onError(MediaPlayer mp, int what, int extra) {
+ if (what == MediaPlayer.MEDIA_ERROR_SERVER_DIED) {
+ // we are finished, so put up an appropriate error toast if required and finish
+ activity.finish();
+ } else {
+ // possibly media player error, so release and recreate
+ close();
+ updatePrefs();
+ }
+ return true;
+ }
+
+ @Override
+ public synchronized void close() {
+ if (mediaPlayer != null) {
+ mediaPlayer.release();
+ mediaPlayer = null;
+ }
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/CaptureActivity.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/CaptureActivity.java
new file mode 100755
index 0000000..1170348
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/CaptureActivity.java
@@ -0,0 +1,780 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.ActivityInfo;
+import android.content.res.Configuration;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.preference.PreferenceManager;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.Surface;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.alibaba.weex.R;
+import com.alibaba.weex.WXPageActivity;
+import com.alibaba.weex.WXPreLoadManager;
+import com.alibaba.weex.constants.Constants;
+
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.DecodeHintType;
+import com.google.zxing.Result;
+import com.google.zxing.ResultMetadataType;
+import com.google.zxing.ResultPoint;
+import com.google.zxing.client.android.camera.CameraManager;
+import com.google.zxing.client.android.clipboard.ClipboardInterface;
+import com.google.zxing.client.android.history.HistoryActivity;
+import com.google.zxing.client.android.history.HistoryItem;
+import com.google.zxing.client.android.history.HistoryManager;
+import com.google.zxing.client.android.result.ResultHandler;
+import com.google.zxing.client.android.result.ResultHandlerFactory;
+import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKEngine;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.Map;
+
+
+/**
+ * This activity opens the camera and does the actual scanning on a background
+ * thread. It draws a viewfinder to help the user place the barcode correctly,
+ * shows feedback as the image processing is happening, and then overlays the
+ * results when a scan is successful.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ * @author Sean Owen
+ */
+public final class CaptureActivity extends Activity implements
+ SurfaceHolder.Callback {
+
+ private static final String TAG = CaptureActivity.class.getSimpleName();
+
+ private static final long DEFAULT_INTENT_RESULT_DURATION_MS = 1500L;
+ private static final long BULK_MODE_SCAN_DELAY_MS = 1000L;
+
+ private static final String[] ZXING_URLS = {
+ "http://zxing.appspot.com/scan", "zxing://scan/" };
+
+ public static final int HISTORY_REQUEST_CODE = 0x0000bacc;
+
+ private static final Collection<ResultMetadataType> DISPLAYABLE_METADATA_TYPES = EnumSet
+ .of(ResultMetadataType.ISSUE_NUMBER,
+ ResultMetadataType.SUGGESTED_PRICE,
+ ResultMetadataType.ERROR_CORRECTION_LEVEL,
+ ResultMetadataType.POSSIBLE_COUNTRY);
+
+ private CameraManager cameraManager;
+ private CaptureActivityHandler handler;
+ private Result savedResultToShow;
+ private ViewfinderView viewfinderView;
+ private TextView statusView;
+ private View resultView;
+ private Result lastResult;
+ private boolean hasSurface;
+ private boolean copyToClipboard;
+ private IntentSource source;
+ private String sourceUrl;
+ private ScanFromWebPageManager scanFromWebPageManager;
+ private Collection<BarcodeFormat> decodeFormats;
+ private Map<DecodeHintType, ?> decodeHints;
+ private String characterSet;
+ private HistoryManager historyManager;
+ private InactivityTimer inactivityTimer;
+ private BeepManager beepManager;
+ private AmbientLightManager ambientLightManager;
+
+ ViewfinderView getViewfinderView() {
+ return viewfinderView;
+ }
+
+ public Handler getHandler() {
+ return handler;
+ }
+
+ CameraManager getCameraManager() {
+ return cameraManager;
+ }
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ Window window = getWindow();
+ window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ setContentView(R.layout.capture);
+
+ hasSurface = false;
+ inactivityTimer = new InactivityTimer(this);
+ beepManager = new BeepManager(this);
+ ambientLightManager = new AmbientLightManager(this);
+
+ PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
+
+ if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
+ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+ } else {
+ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ // historyManager must be initialized here to update the history
+ // preference
+ historyManager = new HistoryManager(this);
+ historyManager.trimHistory();
+
+ // CameraManager must be initialized here, not in onCreate(). This is
+ // necessary because we don't
+ // want to open the camera driver and measure the screen size if we're
+ // going to show the help on
+ // first launch. That led to bugs where the scanning rectangle was the
+ // wrong size and partially
+ // off screen.
+ cameraManager = new CameraManager(getApplication());
+
+ viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view);
+ viewfinderView.setCameraManager(cameraManager);
+
+ resultView = findViewById(R.id.result_view);
+ statusView = (TextView) findViewById(R.id.status_view);
+
+ handler = null;
+ lastResult = null;
+
+ SharedPreferences prefs = PreferenceManager
+ .getDefaultSharedPreferences(this);
+
+// if (prefs.getBoolean(PreferencesActivity.KEY_DISABLE_AUTO_ORIENTATION,
+// true)) {
+// setRequestedOrientation(getCurrentOrientation());
+// } else {
+// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
+// }
+
+ resetStatusView();
+
+ beepManager.updatePrefs();
+ ambientLightManager.start(cameraManager);
+
+ inactivityTimer.onResume();
+
+ Intent intent = getIntent();
+
+ copyToClipboard = prefs.getBoolean(
+ PreferencesActivity.KEY_COPY_TO_CLIPBOARD, true)
+ && (intent == null || intent.getBooleanExtra(
+ Intents.Scan.SAVE_HISTORY, true));
+
+ source = IntentSource.NONE;
+ sourceUrl = null;
+ scanFromWebPageManager = null;
+ decodeFormats = null;
+ characterSet = null;
+
+ if (intent != null) {
+
+ String action = intent.getAction();
+ String dataString = intent.getDataString();
+
+ if (Intents.Scan.ACTION.equals(action)) {
+
+ // Scan the formats the intent requested, and return the result
+ // to the calling activity.
+ source = IntentSource.NATIVE_APP_INTENT;
+ decodeFormats = DecodeFormatManager.parseDecodeFormats(intent);
+ decodeHints = DecodeHintManager.parseDecodeHints(intent);
+
+ if (intent.hasExtra(Intents.Scan.WIDTH)
+ && intent.hasExtra(Intents.Scan.HEIGHT)) {
+ int width = intent.getIntExtra(Intents.Scan.WIDTH, 0);
+ int height = intent.getIntExtra(Intents.Scan.HEIGHT, 0);
+ if (width > 0 && height > 0) {
+ cameraManager.setManualFramingRect(width, height);
+ }
+ }
+
+ if (intent.hasExtra(Intents.Scan.CAMERA_ID)) {
+ int cameraId = intent.getIntExtra(Intents.Scan.CAMERA_ID,
+ -1);
+ if (cameraId >= 0) {
+ cameraManager.setManualCameraId(cameraId);
+ }
+ }
+
+ String customPromptMessage = intent
+ .getStringExtra(Intents.Scan.PROMPT_MESSAGE);
+ if (customPromptMessage != null) {
+ statusView.setText(customPromptMessage);
+ }
+
+ } else if (dataString != null
+ && dataString.contains("http://www.google")
+ && dataString.contains("/m/products/scan")) {
+
+ // Scan only products and send the result to mobile Product
+ // Search.
+ source = IntentSource.PRODUCT_SEARCH_LINK;
+ sourceUrl = dataString;
+ decodeFormats = DecodeFormatManager.PRODUCT_FORMATS;
+
+ } else if (isZXingURL(dataString)) {
+
+ // Scan formats requested in query string (all formats if none
+ // specified).
+ // If a return URL is specified, send the results there.
+ // Otherwise, handle it ourselves.
+ source = IntentSource.ZXING_LINK;
+ sourceUrl = dataString;
+ Uri inputUri = Uri.parse(dataString);
+ scanFromWebPageManager = new ScanFromWebPageManager(inputUri);
+ decodeFormats = DecodeFormatManager
+ .parseDecodeFormats(inputUri);
+ // Allow a sub-set of the hints to be specified by the caller.
+ decodeHints = DecodeHintManager.parseDecodeHints(inputUri);
+
+ }
+
+ characterSet = intent.getStringExtra(Intents.Scan.CHARACTER_SET);
+
+ }
+
+ SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
+ SurfaceHolder surfaceHolder = surfaceView.getHolder();
+ if (hasSurface) {
+ // The activity was paused but not stopped, so the surface still
+ // exists. Therefore
+ // surfaceCreated() won't be called, so init the camera here.
+ initCamera(surfaceHolder);
+ } else {
+ // Install the callback and wait for surfaceCreated() to init the
+ // camera.
+ surfaceHolder.addCallback(this);
+ }
+ }
+
+ private int getCurrentOrientation() {
+ int rotation = getWindowManager().getDefaultDisplay().getRotation();
+ if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
+ switch (rotation) {
+ case Surface.ROTATION_0:
+ case Surface.ROTATION_90:
+ return ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
+ default:
+ return ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
+ }
+ } else {
+ switch (rotation) {
+ case Surface.ROTATION_0:
+ case Surface.ROTATION_270:
+ return ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
+ default:
+ return ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
+ }
+ }
+ }
+
+ private static boolean isZXingURL(String dataString) {
+ if (dataString == null) {
+ return false;
+ }
+ for (String url : ZXING_URLS) {
+ if (dataString.startsWith(url)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ protected void onPause() {
+ if (handler != null) {
+ handler.quitSynchronously();
+ handler = null;
+ }
+ inactivityTimer.onPause();
+ ambientLightManager.stop();
+ beepManager.close();
+ cameraManager.closeDriver();
+ // historyManager = null; // Keep for onActivityResult
+ if (!hasSurface) {
+ SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
+ SurfaceHolder surfaceHolder = surfaceView.getHolder();
+ surfaceHolder.removeCallback(this);
+ }
+ super.onPause();
+ }
+
+ @Override
+ protected void onDestroy() {
+ inactivityTimer.shutdown();
+ super.onDestroy();
+ }
+
+ @Override
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_BACK:
+ if (source == IntentSource.NATIVE_APP_INTENT) {
+ setResult(RESULT_CANCELED);
+ finish();
+ return true;
+ }
+ if ((source == IntentSource.NONE || source == IntentSource.ZXING_LINK)
+ && lastResult != null) {
+ restartPreviewAfterDelay(0L);
+ return true;
+ }
+ break;
+ case KeyEvent.KEYCODE_FOCUS:
+ case KeyEvent.KEYCODE_CAMERA:
+ // Handle these events so they don't launch the Camera app
+ return true;
+ // Use volume up/down to turn on light
+ case KeyEvent.KEYCODE_VOLUME_DOWN:
+ cameraManager.setTorch(false);
+ return true;
+ case KeyEvent.KEYCODE_VOLUME_UP:
+ cameraManager.setTorch(true);
+ return true;
+ }
+ return super.onKeyDown(keyCode, event);
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ MenuInflater menuInflater = getMenuInflater();
+ menuInflater.inflate(R.menu.capture, menu);
+ return super.onCreateOptionsMenu(menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+ int i = item.getItemId();
+ if (i == R.id.menu_history) {
+ intent.setClassName(this, HistoryActivity.class.getName());
+ startActivityForResult(intent, HISTORY_REQUEST_CODE);
+
+ // case R.id.menu_settings:
+ // intent.setClassName(this, PreferencesActivity.class.getName());
+ // startActivity(intent);
+ // break;
+ // case R.id.menu_help:
+ // intent.setClassName(this, HelpActivity.class.getName());
+ // startActivity(intent);
+ // break;
+ } else {
+ return super.onOptionsItemSelected(item);
+ }
+ return true;
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent intent) {
+ if (resultCode == RESULT_OK && requestCode == HISTORY_REQUEST_CODE
+ && historyManager != null) {
+ int itemNumber = intent
+ .getIntExtra(Intents.History.ITEM_NUMBER, -1);
+ if (itemNumber >= 0) {
+ HistoryItem historyItem = historyManager
+ .buildHistoryItem(itemNumber);
+ decodeOrStoreSavedBitmap(null, historyItem.getResult());
+ }
+ }
+ }
+
+ private void decodeOrStoreSavedBitmap(Bitmap bitmap, Result result) {
+ // Bitmap isn't used yet -- will be used soon
+ if (handler == null) {
+ savedResultToShow = result;
+ } else {
+ if (result != null) {
+ savedResultToShow = result;
+ }
+ if (savedResultToShow != null) {
+ Message message = Message.obtain(handler,
+ R.id.decode_succeeded, savedResultToShow);
+ handler.sendMessage(message);
+ }
+ savedResultToShow = null;
+ }
+ }
+
+ @Override
+ public void surfaceCreated(SurfaceHolder holder) {
+ if (holder == null) {
+ Log.e(TAG,
+ "*** WARNING *** surfaceCreated() gave us a null surface!");
+ }
+ if (!hasSurface) {
+ hasSurface = true;
+ initCamera(holder);
+ }
+ }
+
+ @Override
+ public void surfaceDestroyed(SurfaceHolder holder) {
+ hasSurface = false;
+ }
+
+ @Override
+ public void surfaceChanged(SurfaceHolder holder, int format, int width,
+ int height) {
+
+ }
+
+ /**
+ * A valid barcode has been found, so give an indication of success and show
+ * the results.
+ *
+ * @param rawResult
+ * The contents of the barcode.
+ * @param scaleFactor
+ * amount by which thumbnail was scaled
+ * @param barcode
+ * A greyscale bitmap of the camera data which was decoded.
+ */
+ public void handleDecode(Result rawResult, Bitmap barcode, float scaleFactor) {
+ inactivityTimer.onActivity();
+ lastResult = rawResult;
+ ResultHandler resultHandler = ResultHandlerFactory.makeResultHandler(
+ this, rawResult);
+
+ boolean fromLiveScan = barcode != null;
+ if (fromLiveScan) {
+ historyManager.addHistoryItem(rawResult, resultHandler);
+ // Then not from history, so beep/vibrate and we have an image to
+ // draw on
+ beepManager.playBeepSoundAndVibrate();
+ drawResultPoints(barcode, scaleFactor, rawResult);
+ }
+
+ switch (source) {
+ case NATIVE_APP_INTENT:
+ case PRODUCT_SEARCH_LINK:
+ handleDecodeExternally(rawResult, resultHandler, barcode);
+ break;
+ case ZXING_LINK:
+ if (scanFromWebPageManager == null
+ || !scanFromWebPageManager.isScanFromWebPage()) {
+ handleDecodeInternally(rawResult, resultHandler, barcode);
+ } else {
+ handleDecodeExternally(rawResult, resultHandler, barcode);
+ }
+ break;
+ case NONE:
+ SharedPreferences prefs = PreferenceManager
+ .getDefaultSharedPreferences(this);
+ if (fromLiveScan
+ && prefs.getBoolean(PreferencesActivity.KEY_BULK_MODE,
+ false)) {
+ Toast.makeText(
+ getApplicationContext(),
+ getResources()
+ .getString(R.string.msg_bulk_mode_scanned)
+ + " (" + rawResult.getText() + ')',
+ Toast.LENGTH_SHORT).show();
+ // Wait a moment or else it will scan the same barcode
+ // continuously about 3 times
+ restartPreviewAfterDelay(BULK_MODE_SCAN_DELAY_MS);
+ } else {
+ handleDecodeInternally(rawResult, resultHandler, barcode);
+ }
+ break;
+ }
+ }
+
+ /**
+ * Superimpose a line for 1D or dots for 2D to highlight the key features of
+ * the barcode.
+ *
+ * @param barcode
+ * A bitmap of the captured image.
+ * @param scaleFactor
+ * amount by which thumbnail was scaled
+ * @param rawResult
+ * The decoded results which contains the points to draw.
+ */
+ private void drawResultPoints(Bitmap barcode, float scaleFactor,
+ Result rawResult) {
+ ResultPoint[] points = rawResult.getResultPoints();
+ if (points != null && points.length > 0) {
+ Canvas canvas = new Canvas(barcode);
+ Paint paint = new Paint();
+ paint.setColor(getResources().getColor(R.color.result_points));
+ if (points.length == 2) {
+ paint.setStrokeWidth(4.0f);
+ drawLine(canvas, paint, points[0], points[1], scaleFactor);
+ } else if (points.length == 4
+ && (rawResult.getBarcodeFormat() == BarcodeFormat.UPC_A || rawResult
+ .getBarcodeFormat() == BarcodeFormat.EAN_13)) {
+ // Hacky special case -- draw two lines, for the barcode and
+ // metadata
+ drawLine(canvas, paint, points[0], points[1], scaleFactor);
+ drawLine(canvas, paint, points[2], points[3], scaleFactor);
+ } else {
+ paint.setStrokeWidth(10.0f);
+ for (ResultPoint point : points) {
+ if (point != null) {
+ canvas.drawPoint(scaleFactor * point.getX(),
+ scaleFactor * point.getY(), paint);
+ }
+ }
+ }
+ }
+ }
+
+ private static void drawLine(Canvas canvas, Paint paint, ResultPoint a,
+ ResultPoint b, float scaleFactor) {
+ if (a != null && b != null) {
+ canvas.drawLine(scaleFactor * a.getX(), scaleFactor * a.getY(),
+ scaleFactor * b.getX(), scaleFactor * b.getY(), paint);
+ }
+ }
+
+ // Put up our own UI for how to handle the decoded contents.
+ private void handleDecodeInternally(Result rawResult, ResultHandler resultHandler, Bitmap barcode) {
+ String code = rawResult.getText();
+ if (!TextUtils.isEmpty(code)) {
+ Uri uri = Uri.parse(code);
+ if (uri.getPath().contains("dynamic/replace")) {
+ Intent intent = new Intent("weex.intent.action.dynamic", uri);
+ intent.addCategory("weex.intent.category.dynamic");
+ startActivity(intent);
+ finish();
+ } else if (uri.getQueryParameterNames().contains("_wx_devtool")) {
+ WXEnvironment.sRemoteDebugProxyUrl = uri.getQueryParameter("_wx_devtool");
+ WXEnvironment.sDebugServerConnectable = true;
+ WXSDKEngine.reload();
+ Toast.makeText(this, "devtool", Toast.LENGTH_SHORT).show();
+ finish();
+ return;
+ } else {
+ String urlData = uri.getQueryParameter(Constants.WEEX_TPL_KEY);
+ if (TextUtils.isEmpty(urlData)){
+ urlData = code;
+ }
+ Log.d("test->", "before nav activity ");
+
+ WXPreLoadManager.getInstance().preLoad(urlData);
+ Toast.makeText(this, rawResult.getText(), Toast.LENGTH_SHORT).show();
+ Intent intent = new Intent(CaptureActivity.this, WXPageActivity.class);
+ intent.setData(Uri.parse(code));
+ startActivity(intent);
+ }
+ }
+ }
+
+ // Briefly show the contents of the barcode, then handle the result outside
+ // Barcode Scanner.
+ private void handleDecodeExternally(Result rawResult,
+ ResultHandler resultHandler, Bitmap barcode) {
+
+ if (barcode != null) {
+ viewfinderView.drawResultBitmap(barcode);
+ }
+
+ long resultDurationMS;
+ if (getIntent() == null) {
+ resultDurationMS = DEFAULT_INTENT_RESULT_DURATION_MS;
+ } else {
+ resultDurationMS = getIntent().getLongExtra(
+ Intents.Scan.RESULT_DISPLAY_DURATION_MS,
+ DEFAULT_INTENT_RESULT_DURATION_MS);
+ }
+
+ if (resultDurationMS > 0) {
+ String rawResultString = String.valueOf(rawResult);
+ if (rawResultString.length() > 32) {
+ rawResultString = rawResultString.substring(0, 32) + " ...";
+ }
+ statusView.setText(getString(resultHandler.getDisplayTitle())
+ + " : " + rawResultString);
+ }
+
+ if (copyToClipboard && !resultHandler.areContentsSecure()) {
+ CharSequence text = resultHandler.getDisplayContents();
+ ClipboardInterface.setText(text, this);
+ }
+
+ if (source == IntentSource.NATIVE_APP_INTENT) {
+
+ // Hand back whatever action they requested - this can be changed to
+ // Intents.Scan.ACTION when
+ // the deprecated intent is retired.
+ Intent intent = new Intent(getIntent().getAction());
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+ intent.putExtra(Intents.Scan.RESULT, rawResult.toString());
+ intent.putExtra(Intents.Scan.RESULT_FORMAT, rawResult
+ .getBarcodeFormat().toString());
+ byte[] rawBytes = rawResult.getRawBytes();
+ if (rawBytes != null && rawBytes.length > 0) {
+ intent.putExtra(Intents.Scan.RESULT_BYTES, rawBytes);
+ }
+ Map<ResultMetadataType, ?> metadata = rawResult.getResultMetadata();
+ if (metadata != null) {
+ if (metadata.containsKey(ResultMetadataType.UPC_EAN_EXTENSION)) {
+ intent.putExtra(Intents.Scan.RESULT_UPC_EAN_EXTENSION,
+ metadata.get(ResultMetadataType.UPC_EAN_EXTENSION)
+ .toString());
+ }
+ Number orientation = (Number) metadata
+ .get(ResultMetadataType.ORIENTATION);
+ if (orientation != null) {
+ intent.putExtra(Intents.Scan.RESULT_ORIENTATION,
+ orientation.intValue());
+ }
+ String ecLevel = (String) metadata
+ .get(ResultMetadataType.ERROR_CORRECTION_LEVEL);
+ if (ecLevel != null) {
+ intent.putExtra(Intents.Scan.RESULT_ERROR_CORRECTION_LEVEL,
+ ecLevel);
+ }
+ @SuppressWarnings("unchecked")
+ Iterable<byte[]> byteSegments = (Iterable<byte[]>) metadata
+ .get(ResultMetadataType.BYTE_SEGMENTS);
+ if (byteSegments != null) {
+ int i = 0;
+ for (byte[] byteSegment : byteSegments) {
+ intent.putExtra(
+ Intents.Scan.RESULT_BYTE_SEGMENTS_PREFIX + i,
+ byteSegment);
+ i++;
+ }
+ }
+ }
+ sendReplyMessage(R.id.return_scan_result, intent, resultDurationMS);
+
+ } else if (source == IntentSource.PRODUCT_SEARCH_LINK) {
+
+ // Reformulate the URL which triggered us into a query, so that the
+ // request goes to the same
+ // TLD as the scan URL.
+ int end = sourceUrl.lastIndexOf("/scan");
+ String replyURL = sourceUrl.substring(0, end) + "?q="
+ + resultHandler.getDisplayContents() + "&source=zxing";
+ sendReplyMessage(R.id.launch_product_query, replyURL,
+ resultDurationMS);
+
+ } else if (source == IntentSource.ZXING_LINK) {
+
+ if (scanFromWebPageManager != null
+ && scanFromWebPageManager.isScanFromWebPage()) {
+ String replyURL = scanFromWebPageManager.buildReplyURL(
+ rawResult, resultHandler);
+ scanFromWebPageManager = null;
+ sendReplyMessage(R.id.launch_product_query, replyURL,
+ resultDurationMS);
+ }
+
+ }
+ }
+
+ private void sendReplyMessage(int id, Object arg, long delayMS) {
+ if (handler != null) {
+ Message message = Message.obtain(handler, id, arg);
+ if (delayMS > 0L) {
+ handler.sendMessageDelayed(message, delayMS);
+ } else {
+ handler.sendMessage(message);
+ }
+ }
+ }
+
+ private void initCamera(SurfaceHolder surfaceHolder) {
+ if (surfaceHolder == null) {
+ throw new IllegalStateException("No SurfaceHolder provided");
+ }
+ if (cameraManager.isOpen()) {
+ Log.w(TAG,
+ "initCamera() while already open -- late SurfaceView callback?");
+ return;
+ }
+ try {
+ cameraManager.openDriver(surfaceHolder);
+ // Creating the handler starts the preview, which can also throw a
+ // RuntimeException.
+ if (handler == null) {
+ handler = new CaptureActivityHandler(this, decodeFormats,
+ decodeHints, characterSet, cameraManager);
+ }
+ decodeOrStoreSavedBitmap(null, null);
+ } catch (IOException ioe) {
+ Log.w(TAG, ioe);
+ displayFrameworkBugMessageAndExit();
+ } catch (RuntimeException e) {
+ // Barcode Scanner has seen crashes in the wild of this variety:
+ // java.?lang.?RuntimeException: Fail to connect to camera service
+ Log.w(TAG, "Unexpected error initializing camera", e);
+ displayFrameworkBugMessageAndExit();
+ }
+ }
+
+ private void displayFrameworkBugMessageAndExit() {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setTitle(getString(R.string.app_name));
+ builder.setMessage(getString(R.string.msg_camera_framework_bug));
+ builder.setPositiveButton(R.string.button_ok, new FinishListener(this));
+ builder.setOnCancelListener(new FinishListener(this));
+ builder.show();
+ }
+
+ public void restartPreviewAfterDelay(long delayMS) {
+ if (handler != null) {
+ handler.sendEmptyMessageDelayed(R.id.restart_preview, delayMS);
+ }
+ resetStatusView();
+ }
+
+ private void resetStatusView() {
+ resultView.setVisibility(View.GONE);
+ statusView.setText(R.string.msg_default_status);
+ statusView.setVisibility(View.VISIBLE);
+ viewfinderView.setVisibility(View.VISIBLE);
+ lastResult = null;
+ }
+
+ public void drawViewfinder() {
+ viewfinderView.drawViewfinder();
+ }
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/CaptureActivityHandler.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/CaptureActivityHandler.java
new file mode 100755
index 0000000..3ff78ee
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/CaptureActivityHandler.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android;
+
+import android.app.Activity;
+import android.content.ActivityNotFoundException;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.provider.Browser;
+import android.util.Log;
+
+import com.alibaba.weex.R;
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.DecodeHintType;
+import com.google.zxing.Result;
+import com.google.zxing.client.android.camera.CameraManager;
+
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * This class handles all the messaging which comprises the state machine for capture.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+public final class CaptureActivityHandler extends Handler {
+
+ private static final String TAG = CaptureActivityHandler.class.getSimpleName();
+
+ private final CaptureActivity activity;
+ private final DecodeThread decodeThread;
+ private State state;
+ private final CameraManager cameraManager;
+
+ private enum State {
+ PREVIEW,
+ SUCCESS,
+ DONE
+ }
+
+ CaptureActivityHandler(CaptureActivity activity,
+ Collection<BarcodeFormat> decodeFormats,
+ Map<DecodeHintType,?> baseHints,
+ String characterSet,
+ CameraManager cameraManager) {
+ this.activity = activity;
+ decodeThread = new DecodeThread(activity, decodeFormats, baseHints, characterSet,
+ new ViewfinderResultPointCallback(activity.getViewfinderView()));
+ decodeThread.start();
+ state = State.SUCCESS;
+
+ // Start ourselves capturing previews and decoding.
+ this.cameraManager = cameraManager;
+ cameraManager.startPreview();
+ restartPreviewAndDecode();
+ }
+
+ @Override
+ public void handleMessage(Message message) {
+ if (message.what == R.id.restart_preview) {
+ restartPreviewAndDecode();
+
+ } else if (message.what == R.id.decode_succeeded) {
+ state = State.SUCCESS;
+ Bundle bundle = message.getData();
+ Bitmap barcode = null;
+ float scaleFactor = 1.0f;
+ if (bundle != null) {
+ byte[] compressedBitmap = bundle.getByteArray(DecodeThread.BARCODE_BITMAP);
+ if (compressedBitmap != null) {
+ barcode = BitmapFactory.decodeByteArray(compressedBitmap, 0, compressedBitmap.length, null);
+ // Mutable copy:
+ barcode = barcode.copy(Bitmap.Config.ARGB_8888, true);
+ }
+ scaleFactor = bundle.getFloat(DecodeThread.BARCODE_SCALED_FACTOR);
+ }
+ activity.handleDecode((Result) message.obj, barcode, scaleFactor);
+
+ } else if (message.what == R.id.decode_failed) {// We're decoding as fast as possible, so when one decode fails, start another.
+ state = State.PREVIEW;
+ cameraManager.requestPreviewFrame(decodeThread.getHandler(), R.id.decode);
+
+ } else if (message.what == R.id.return_scan_result) {
+ activity.setResult(Activity.RESULT_OK, (Intent) message.obj);
+ activity.finish();
+
+ } else if (message.what == R.id.launch_product_query) {
+ String url = (String) message.obj;
+
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+ intent.setData(Uri.parse(url));
+
+ ResolveInfo resolveInfo =
+ activity.getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
+ String browserPackageName = null;
+ if (resolveInfo != null && resolveInfo.activityInfo != null) {
+ browserPackageName = resolveInfo.activityInfo.packageName;
+ Log.d(TAG, "Using browser in package " + browserPackageName);
+ }
+
+ // Needed for default Android browser / Chrome only apparently
+ if ("com.android.browser".equals(browserPackageName) || "com.android.chrome".equals(browserPackageName)) {
+ intent.setPackage(browserPackageName);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.putExtra(Browser.EXTRA_APPLICATION_ID, browserPackageName);
+ }
+
+ try {
+ activity.startActivity(intent);
+ } catch (ActivityNotFoundException ignored) {
+ Log.w(TAG, "Can't find anything to handle VIEW of URI " + url);
+ }
+
+ }
+ }
+
+ public void quitSynchronously() {
+ state = State.DONE;
+ cameraManager.stopPreview();
+ Message quit = Message.obtain(decodeThread.getHandler(), R.id.quit);
+ quit.sendToTarget();
+ try {
+ // Wait at most half a second; should be enough time, and onPause() will timeout quickly
+ decodeThread.join(500L);
+ } catch (InterruptedException e) {
+ // continue
+ }
+
+ // Be absolutely sure we don't send any queued up messages
+ removeMessages(R.id.decode_succeeded);
+ removeMessages(R.id.decode_failed);
+ }
+
+ private void restartPreviewAndDecode() {
+ if (state == State.SUCCESS) {
+ state = State.PREVIEW;
+ cameraManager.requestPreviewFrame(decodeThread.getHandler(), R.id.decode);
+ activity.drawViewfinder();
+ }
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/Contents.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/Contents.java
new file mode 100755
index 0000000..1cfff17
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/Contents.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android;
+
+import android.provider.ContactsContract;
+
+/**
+ * The set of constants to use when sending Barcode Scanner an Intent which requests a barcode
+ * to be encoded.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+public final class Contents {
+ private Contents() {
+ }
+
+ public static final class Type {
+ /**
+ * Plain text. Use Intent.putExtra(DATA, string). This can be used for URLs too, but string
+ * must include "http://" or "https://".
+ */
+ public static final String TEXT = "TEXT_TYPE";
+
+ /**
+ * An email type. Use Intent.putExtra(DATA, string) where string is the email address.
+ */
+ public static final String EMAIL = "EMAIL_TYPE";
+
+ /**
+ * Use Intent.putExtra(DATA, string) where string is the phone number to call.
+ */
+ public static final String PHONE = "PHONE_TYPE";
+
+ /**
+ * An SMS type. Use Intent.putExtra(DATA, string) where string is the number to SMS.
+ */
+ public static final String SMS = "SMS_TYPE";
+
+ /**
+ * A contact. Send a request to encode it as follows:
+ * {@code
+ * import android.provider.Contacts;
+ *
+ * Intent intent = new Intent(Intents.Encode.ACTION);
+ * intent.putExtra(Intents.Encode.TYPE, CONTACT);
+ * Bundle bundle = new Bundle();
+ * bundle.putString(ContactsContract.Intents.Insert.NAME, "Jenny");
+ * bundle.putString(ContactsContract.Intents.Insert.PHONE, "8675309");
+ * bundle.putString(ContactsContract.Intents.Insert.EMAIL, "jenny@the80s.com");
+ * bundle.putString(ContactsContract.Intents.Insert.POSTAL, "123 Fake St. San Francisco, CA 94102");
+ * intent.putExtra(Intents.Encode.DATA, bundle);
+ * }
+ */
+ public static final String CONTACT = "CONTACT_TYPE";
+
+ /**
+ * A geographic location. Use as follows:
+ * Bundle bundle = new Bundle();
+ * bundle.putFloat("LAT", latitude);
+ * bundle.putFloat("LONG", longitude);
+ * intent.putExtra(Intents.Encode.DATA, bundle);
+ */
+ public static final String LOCATION = "LOCATION_TYPE";
+
+ private Type() {
+ }
+ }
+
+ public static final String URL_KEY = "URL_KEY";
+
+ public static final String NOTE_KEY = "NOTE_KEY";
+
+ /**
+ * When using Type.CONTACT, these arrays provide the keys for adding or retrieving multiple
+ * phone numbers and addresses.
+ */
+ public static final String[] PHONE_KEYS = {
+ ContactsContract.Intents.Insert.PHONE,
+ ContactsContract.Intents.Insert.SECONDARY_PHONE,
+ ContactsContract.Intents.Insert.TERTIARY_PHONE
+ };
+
+ public static final String[] PHONE_TYPE_KEYS = {
+ ContactsContract.Intents.Insert.PHONE_TYPE,
+ ContactsContract.Intents.Insert.SECONDARY_PHONE_TYPE,
+ ContactsContract.Intents.Insert.TERTIARY_PHONE_TYPE
+ };
+
+ public static final String[] EMAIL_KEYS = {
+ ContactsContract.Intents.Insert.EMAIL,
+ ContactsContract.Intents.Insert.SECONDARY_EMAIL,
+ ContactsContract.Intents.Insert.TERTIARY_EMAIL
+ };
+
+ public static final String[] EMAIL_TYPE_KEYS = {
+ ContactsContract.Intents.Insert.EMAIL_TYPE,
+ ContactsContract.Intents.Insert.SECONDARY_EMAIL_TYPE,
+ ContactsContract.Intents.Insert.TERTIARY_EMAIL_TYPE
+ };
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/DecodeFormatManager.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/DecodeFormatManager.java
new file mode 100755
index 0000000..8c5194b
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/DecodeFormatManager.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2010 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android;
+
+import java.util.Arrays;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import android.content.Intent;
+import android.net.Uri;
+
+import com.google.zxing.BarcodeFormat;
+
+final class DecodeFormatManager {
+
+ private static final Pattern COMMA_PATTERN = Pattern.compile(",");
+
+ static final Set<BarcodeFormat> PRODUCT_FORMATS;
+ static final Set<BarcodeFormat> INDUSTRIAL_FORMATS;
+ private static final Set<BarcodeFormat> ONE_D_FORMATS;
+ static final Set<BarcodeFormat> QR_CODE_FORMATS = EnumSet.of(BarcodeFormat.QR_CODE);
+ static final Set<BarcodeFormat> DATA_MATRIX_FORMATS = EnumSet.of(BarcodeFormat.DATA_MATRIX);
+ static final Set<BarcodeFormat> AZTEC_FORMATS = EnumSet.of(BarcodeFormat.AZTEC);
+ static final Set<BarcodeFormat> PDF417_FORMATS = EnumSet.of(BarcodeFormat.PDF_417);
+ static {
+ PRODUCT_FORMATS = EnumSet.of(BarcodeFormat.UPC_A,
+ BarcodeFormat.UPC_E,
+ BarcodeFormat.EAN_13,
+ BarcodeFormat.EAN_8,
+ BarcodeFormat.RSS_14,
+ BarcodeFormat.RSS_EXPANDED);
+ INDUSTRIAL_FORMATS = EnumSet.of(BarcodeFormat.CODE_39,
+ BarcodeFormat.CODE_93,
+ BarcodeFormat.CODE_128,
+ BarcodeFormat.ITF,
+ BarcodeFormat.CODABAR);
+ ONE_D_FORMATS = EnumSet.copyOf(PRODUCT_FORMATS);
+ ONE_D_FORMATS.addAll(INDUSTRIAL_FORMATS);
+ }
+ private static final Map<String,Set<BarcodeFormat>> FORMATS_FOR_MODE;
+ static {
+ FORMATS_FOR_MODE = new HashMap<>();
+ FORMATS_FOR_MODE.put(Intents.Scan.ONE_D_MODE, ONE_D_FORMATS);
+ FORMATS_FOR_MODE.put(Intents.Scan.PRODUCT_MODE, PRODUCT_FORMATS);
+ FORMATS_FOR_MODE.put(Intents.Scan.QR_CODE_MODE, QR_CODE_FORMATS);
+ FORMATS_FOR_MODE.put(Intents.Scan.DATA_MATRIX_MODE, DATA_MATRIX_FORMATS);
+ FORMATS_FOR_MODE.put(Intents.Scan.AZTEC_MODE, AZTEC_FORMATS);
+ FORMATS_FOR_MODE.put(Intents.Scan.PDF417_MODE, PDF417_FORMATS);
+ }
+
+ private DecodeFormatManager() {}
+
+ static Set<BarcodeFormat> parseDecodeFormats(Intent intent) {
+ Iterable<String> scanFormats = null;
+ CharSequence scanFormatsString = intent.getStringExtra(Intents.Scan.FORMATS);
+ if (scanFormatsString != null) {
+ scanFormats = Arrays.asList(COMMA_PATTERN.split(scanFormatsString));
+ }
+ return parseDecodeFormats(scanFormats, intent.getStringExtra(Intents.Scan.MODE));
+ }
+
+ static Set<BarcodeFormat> parseDecodeFormats(Uri inputUri) {
+ List<String> formats = inputUri.getQueryParameters(Intents.Scan.FORMATS);
+ if (formats != null && formats.size() == 1 && formats.get(0) != null){
+ formats = Arrays.asList(COMMA_PATTERN.split(formats.get(0)));
+ }
+ return parseDecodeFormats(formats, inputUri.getQueryParameter(Intents.Scan.MODE));
+ }
+
+ private static Set<BarcodeFormat> parseDecodeFormats(Iterable<String> scanFormats, String decodeMode) {
+ if (scanFormats != null) {
+ Set<BarcodeFormat> formats = EnumSet.noneOf(BarcodeFormat.class);
+ try {
+ for (String format : scanFormats) {
+ formats.add(BarcodeFormat.valueOf(format));
+ }
+ return formats;
+ } catch (IllegalArgumentException iae) {
+ // ignore it then
+ }
+ }
+ if (decodeMode != null) {
+ return FORMATS_FOR_MODE.get(decodeMode);
+ }
+ return null;
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/DecodeHandler.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/DecodeHandler.java
new file mode 100755
index 0000000..9a8770a
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/DecodeHandler.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2010 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android;
+
+import android.graphics.Bitmap;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.util.Log;
+
+import com.alibaba.weex.R;
+import com.google.zxing.BinaryBitmap;
+import com.google.zxing.DecodeHintType;
+import com.google.zxing.MultiFormatReader;
+import com.google.zxing.PlanarYUVLuminanceSource;
+import com.google.zxing.ReaderException;
+import com.google.zxing.Result;
+import com.google.zxing.common.HybridBinarizer;
+
+import java.io.ByteArrayOutputStream;
+import java.util.Map;
+
+final class DecodeHandler extends Handler {
+
+ private static final String TAG = DecodeHandler.class.getSimpleName();
+
+ private final CaptureActivity activity;
+ private final MultiFormatReader multiFormatReader;
+ private boolean running = true;
+
+ DecodeHandler(CaptureActivity activity, Map<DecodeHintType,Object> hints) {
+ multiFormatReader = new MultiFormatReader();
+ multiFormatReader.setHints(hints);
+ this.activity = activity;
+ }
+
+ @Override
+ public void handleMessage(Message message) {
+ if (!running) {
+ return;
+ }
+ if (message.what == R.id.decode) {
+ decode((byte[]) message.obj, message.arg1, message.arg2);
+
+ } else if (message.what == R.id.quit) {
+ running = false;
+ Looper.myLooper().quit();
+
+ }
+ }
+
+ /**
+ * Decode the data within the viewfinder rectangle, and time how long it took. For efficiency,
+ * reuse the same reader objects from one decode to the next.
+ *
+ * @param data The YUV preview frame.
+ * @param width The width of the preview frame.
+ * @param height The height of the preview frame.
+ */
+ private void decode(byte[] data, int width, int height) {
+ long start = System.currentTimeMillis();
+ Result rawResult = null;
+// PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(data, width, height);
+
+ byte[] rotatedData = new byte[data.length];
+ for (int y = 0; y < height; y++) {
+ for (int x = 0; x < width; x++)
+ rotatedData[x * height + height - y - 1] = data[x + y * width];
+ }
+ int tmp = width;
+ width = height;
+ height = tmp;
+ PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(rotatedData, width, height);
+
+ if (source != null) {
+ BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
+ try {
+ rawResult = multiFormatReader.decodeWithState(bitmap);
+ } catch (ReaderException re) {
+ // continue
+ } finally {
+ multiFormatReader.reset();
+ }
+ }
+
+ Handler handler = activity.getHandler();
+ if (rawResult != null) {
+ // Don't log the barcode contents for security.
+ long end = System.currentTimeMillis();
+ Log.d(TAG, "Found barcode in " + (end - start) + " ms");
+ if (handler != null) {
+ Message message = Message.obtain(handler, R.id.decode_succeeded, rawResult);
+ Bundle bundle = new Bundle();
+ bundleThumbnail(source, bundle);
+ message.setData(bundle);
+ message.sendToTarget();
+ }
+ } else {
+ if (handler != null) {
+ Message message = Message.obtain(handler, R.id.decode_failed);
+ message.sendToTarget();
+ }
+ }
+ }
+
+ private static void bundleThumbnail(PlanarYUVLuminanceSource source, Bundle bundle) {
+ int[] pixels = source.renderThumbnail();
+ int width = source.getThumbnailWidth();
+ int height = source.getThumbnailHeight();
+ Bitmap bitmap = Bitmap.createBitmap(pixels, 0, width, width, height, Bitmap.Config.ARGB_8888);
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ bitmap.compress(Bitmap.CompressFormat.JPEG, 50, out);
+ bundle.putByteArray(DecodeThread.BARCODE_BITMAP, out.toByteArray());
+ bundle.putFloat(DecodeThread.BARCODE_SCALED_FACTOR, (float) width / source.getWidth());
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/DecodeHintManager.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/DecodeHintManager.java
new file mode 100755
index 0000000..39305fe
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/DecodeHintManager.java
@@ -0,0 +1,236 @@
+/*
+ * Copyright (C) 2013 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android;
+
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.util.Log;
+
+import com.google.zxing.DecodeHintType;
+
+/**
+ * @author Lachezar Dobrev
+ */
+final class DecodeHintManager {
+
+ private static final String TAG = DecodeHintManager.class.getSimpleName();
+
+ // This pattern is used in decoding integer arrays.
+ private static final Pattern COMMA = Pattern.compile(",");
+
+ private DecodeHintManager() {}
+
+ /**
+ * <p>Split a query string into a list of name-value pairs.</p>
+ *
+ * <p>This is an alternative to the {@link Uri#getQueryParameterNames()} and
+ * {@link Uri#getQueryParameters(String)}, which are quirky and not suitable
+ * for exist-only Uri parameters.</p>
+ *
+ * <p>This method ignores multiple parameters with the same name and returns the
+ * first one only. This is technically incorrect, but should be acceptable due
+ * to the method of processing Hints: no multiple values for a hint.</p>
+ *
+ * @param query query to split
+ * @return name-value pairs
+ */
+ private static Map<String,String> splitQuery(String query) {
+ Map<String,String> map = new HashMap<>();
+ int pos = 0;
+ while (pos < query.length()) {
+ if (query.charAt(pos) == '&') {
+ // Skip consecutive ampersand separators.
+ pos ++;
+ continue;
+ }
+ int amp = query.indexOf('&', pos);
+ int equ = query.indexOf('=', pos);
+ if (amp < 0) {
+ // This is the last element in the query, no more ampersand elements.
+ String name;
+ String text;
+ if (equ < 0) {
+ // No equal sign
+ name = query.substring(pos);
+ name = name.replace('+', ' '); // Preemptively decode +
+ name = Uri.decode(name);
+ text = "";
+ } else {
+ // Split name and text.
+ name = query.substring(pos, equ);
+ name = name.replace('+', ' '); // Preemptively decode +
+ name = Uri.decode(name);
+ text = query.substring(equ + 1);
+ text = text.replace('+', ' '); // Preemptively decode +
+ text = Uri.decode(text);
+ }
+ if (!map.containsKey(name)) {
+ map.put(name, text);
+ }
+ break;
+ }
+ if (equ < 0 || equ > amp) {
+ // No equal sign until the &: this is a simple parameter with no value.
+ String name = query.substring(pos, amp);
+ name = name.replace('+', ' '); // Preemptively decode +
+ name = Uri.decode(name);
+ if (!map.containsKey(name)) {
+ map.put(name, "");
+ }
+ pos = amp + 1;
+ continue;
+ }
+ String name = query.substring(pos, equ);
+ name = name.replace('+', ' '); // Preemptively decode +
+ name = Uri.decode(name);
+ String text = query.substring(equ+1, amp);
+ text = text.replace('+', ' '); // Preemptively decode +
+ text = Uri.decode(text);
+ if (!map.containsKey(name)) {
+ map.put(name, text);
+ }
+ pos = amp + 1;
+ }
+ return map;
+ }
+
+ static Map<DecodeHintType,?> parseDecodeHints(Uri inputUri) {
+ String query = inputUri.getEncodedQuery();
+ if (query == null || query.isEmpty()) {
+ return null;
+ }
+
+ // Extract parameters
+ Map<String, String> parameters = splitQuery(query);
+
+ Map<DecodeHintType, Object> hints = new EnumMap<>(DecodeHintType.class);
+
+ for (DecodeHintType hintType: DecodeHintType.values()) {
+
+ if (hintType == DecodeHintType.CHARACTER_SET ||
+ hintType == DecodeHintType.NEED_RESULT_POINT_CALLBACK ||
+ hintType == DecodeHintType.POSSIBLE_FORMATS) {
+ continue; // This hint is specified in another way
+ }
+
+ String parameterName = hintType.name();
+ String parameterText = parameters.get(parameterName);
+ if (parameterText == null) {
+ continue;
+ }
+ if (hintType.getValueType().equals(Object.class)) {
+ // This is an unspecified type of hint content. Use the value as is.
+ // TODO: Can we make a different assumption on this?
+ hints.put(hintType, parameterText);
+ continue;
+ }
+ if (hintType.getValueType().equals(Void.class)) {
+ // Void hints are just flags: use the constant specified by DecodeHintType
+ hints.put(hintType, Boolean.TRUE);
+ continue;
+ }
+ if (hintType.getValueType().equals(String.class)) {
+ // A string hint: use the decoded value.
+ hints.put(hintType, parameterText);
+ continue;
+ }
+ if (hintType.getValueType().equals(Boolean.class)) {
+ // A boolean hint: a few values for false, everything else is true.
+ // An empty parameter is simply a flag-style parameter, assuming true
+ if (parameterText.isEmpty()) {
+ hints.put(hintType, Boolean.TRUE);
+ } else if ("0".equals(parameterText) ||
+ "false".equalsIgnoreCase(parameterText) ||
+ "no".equalsIgnoreCase(parameterText)) {
+ hints.put(hintType, Boolean.FALSE);
+ } else {
+ hints.put(hintType, Boolean.TRUE);
+ }
+
+ continue;
+ }
+ if (hintType.getValueType().equals(int[].class)) {
+ // An integer array. Used to specify valid lengths.
+ // Strip a trailing comma as in Java style array initialisers.
+ if (!parameterText.isEmpty() && parameterText.charAt(parameterText.length() - 1) == ',') {
+ parameterText = parameterText.substring(0, parameterText.length() - 1);
+ }
+ String[] values = COMMA.split(parameterText);
+ int[] array = new int[values.length];
+ for (int i = 0; i < values.length; i++) {
+ try {
+ array[i] = Integer.parseInt(values[i]);
+ } catch (NumberFormatException ignored) {
+ Log.w(TAG, "Skipping array of integers hint " + hintType + " due to invalid numeric value: '" + values[i] + '\'');
+ array = null;
+ break;
+ }
+ }
+ if (array != null) {
+ hints.put(hintType, array);
+ }
+ continue;
+ }
+ Log.w(TAG, "Unsupported hint type '" + hintType + "' of type " + hintType.getValueType());
+ }
+
+ Log.i(TAG, "Hints from the URI: " + hints);
+ return hints;
+ }
+
+ static Map<DecodeHintType, Object> parseDecodeHints(Intent intent) {
+ Bundle extras = intent.getExtras();
+ if (extras == null || extras.isEmpty()) {
+ return null;
+ }
+ Map<DecodeHintType,Object> hints = new EnumMap<>(DecodeHintType.class);
+
+ for (DecodeHintType hintType: DecodeHintType.values()) {
+
+ if (hintType == DecodeHintType.CHARACTER_SET ||
+ hintType == DecodeHintType.NEED_RESULT_POINT_CALLBACK ||
+ hintType == DecodeHintType.POSSIBLE_FORMATS) {
+ continue; // This hint is specified in another way
+ }
+
+ String hintName = hintType.name();
+ if (extras.containsKey(hintName)) {
+ if (hintType.getValueType().equals(Void.class)) {
+ // Void hints are just flags: use the constant specified by the DecodeHintType
+ hints.put(hintType, Boolean.TRUE);
+ } else {
+ Object hintData = extras.get(hintName);
+ if (hintType.getValueType().isInstance(hintData)) {
+ hints.put(hintType, hintData);
+ } else {
+ Log.w(TAG, "Ignoring hint " + hintType + " because it is not assignable from " + hintData);
+ }
+ }
+ }
+ }
+
+ Log.i(TAG, "Hints from the Intent: " + hints);
+ return hints;
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/DecodeThread.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/DecodeThread.java
new file mode 100755
index 0000000..a2a0e81
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/DecodeThread.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android;
+
+import java.util.Collection;
+import java.util.EnumMap;
+import java.util.EnumSet;
+import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+
+import android.content.SharedPreferences;
+import android.os.Handler;
+import android.os.Looper;
+import android.preference.PreferenceManager;
+import android.util.Log;
+
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.DecodeHintType;
+import com.google.zxing.ResultPointCallback;
+
+/**
+ * This thread does all the heavy lifting of decoding the images.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+final class DecodeThread extends Thread {
+
+ public static final String BARCODE_BITMAP = "barcode_bitmap";
+ public static final String BARCODE_SCALED_FACTOR = "barcode_scaled_factor";
+
+ private final CaptureActivity activity;
+ private final Map<DecodeHintType,Object> hints;
+ private Handler handler;
+ private final CountDownLatch handlerInitLatch;
+
+ DecodeThread(CaptureActivity activity,
+ Collection<BarcodeFormat> decodeFormats,
+ Map<DecodeHintType,?> baseHints,
+ String characterSet,
+ ResultPointCallback resultPointCallback) {
+
+ this.activity = activity;
+ handlerInitLatch = new CountDownLatch(1);
+
+ hints = new EnumMap<>(DecodeHintType.class);
+ if (baseHints != null) {
+ hints.putAll(baseHints);
+ }
+
+ // The prefs can't change while the thread is running, so pick them up once here.
+ if (decodeFormats == null || decodeFormats.isEmpty()) {
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
+ decodeFormats = EnumSet.noneOf(BarcodeFormat.class);
+ if (prefs.getBoolean(PreferencesActivity.KEY_DECODE_1D_PRODUCT, true)) {
+ decodeFormats.addAll(DecodeFormatManager.PRODUCT_FORMATS);
+ }
+ if (prefs.getBoolean(PreferencesActivity.KEY_DECODE_1D_INDUSTRIAL, true)) {
+ decodeFormats.addAll(DecodeFormatManager.INDUSTRIAL_FORMATS);
+ }
+ if (prefs.getBoolean(PreferencesActivity.KEY_DECODE_QR, true)) {
+ decodeFormats.addAll(DecodeFormatManager.QR_CODE_FORMATS);
+ }
+ if (prefs.getBoolean(PreferencesActivity.KEY_DECODE_DATA_MATRIX, true)) {
+ decodeFormats.addAll(DecodeFormatManager.DATA_MATRIX_FORMATS);
+ }
+ if (prefs.getBoolean(PreferencesActivity.KEY_DECODE_AZTEC, false)) {
+ decodeFormats.addAll(DecodeFormatManager.AZTEC_FORMATS);
+ }
+ if (prefs.getBoolean(PreferencesActivity.KEY_DECODE_PDF417, false)) {
+ decodeFormats.addAll(DecodeFormatManager.PDF417_FORMATS);
+ }
+ }
+ hints.put(DecodeHintType.POSSIBLE_FORMATS, decodeFormats);
+
+ if (characterSet != null) {
+ hints.put(DecodeHintType.CHARACTER_SET, characterSet);
+ }
+ hints.put(DecodeHintType.NEED_RESULT_POINT_CALLBACK, resultPointCallback);
+ Log.i("DecodeThread", "Hints: " + hints);
+ }
+
+ Handler getHandler() {
+ try {
+ handlerInitLatch.await();
+ } catch (InterruptedException ie) {
+ // continue?
+ }
+ return handler;
+ }
+
+ @Override
+ public void run() {
+ Looper.prepare();
+ handler = new DecodeHandler(activity, hints);
+ handlerInitLatch.countDown();
+ Looper.loop();
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/FinishListener.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/FinishListener.java
new file mode 100755
index 0000000..5d59886
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/FinishListener.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2010 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android;
+
+import android.app.Activity;
+import android.content.DialogInterface;
+
+/**
+ * Simple listener used to exit the app in a few cases.
+ *
+ * @author Sean Owen
+ */
+public final class FinishListener implements DialogInterface.OnClickListener, DialogInterface.OnCancelListener {
+
+ private final Activity activityToFinish;
+
+ public FinishListener(Activity activityToFinish) {
+ this.activityToFinish = activityToFinish;
+ }
+
+ @Override
+ public void onCancel(DialogInterface dialogInterface) {
+ run();
+ }
+
+ @Override
+ public void onClick(DialogInterface dialogInterface, int i) {
+ run();
+ }
+
+ private void run() {
+ activityToFinish.finish();
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/HelpActivity.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/HelpActivity.java
new file mode 100755
index 0000000..f7d3973
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/HelpActivity.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android;
+
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.KeyEvent;
+import android.webkit.WebView;
+
+import com.alibaba.weex.R;
+
+
+/**
+ * An HTML-based help screen.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+public final class HelpActivity extends Activity {
+
+ private static final String BASE_URL =
+ "file:///android_asset/html-" + LocaleManager.getTranslatedAssetLanguage() + '/';
+
+ private WebView webView;
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ setContentView(R.layout.help);
+
+ webView = (WebView) findViewById(R.id.help_contents);
+
+ if (icicle == null) {
+ webView.loadUrl(BASE_URL + "index.html");
+ } else {
+ webView.restoreState(icicle);
+ }
+ }
+
+ @Override
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+ if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
+ webView.goBack();
+ return true;
+ }
+ return super.onKeyDown(keyCode, event);
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle icicle) {
+ super.onSaveInstanceState(icicle);
+ webView.saveState(icicle);
+ }
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/HttpHelper.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/HttpHelper.java
new file mode 100755
index 0000000..6e3de99
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/HttpHelper.java
@@ -0,0 +1,228 @@
+/*
+ * Copyright 2011 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.HttpURLConnection;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+
+import android.util.Log;
+
+/**
+ * Utility methods for retrieving content over HTTP using the more-supported {@code java.net} classes
+ * in Android.
+ */
+public final class HttpHelper {
+
+ private static final String TAG = HttpHelper.class.getSimpleName();
+
+ private static final Collection<String> REDIRECTOR_DOMAINS = new HashSet<>(Arrays.asList(
+ "amzn.to", "bit.ly", "bitly.com", "fb.me", "goo.gl", "is.gd", "j.mp", "lnkd.in", "ow.ly",
+ "R.BEETAGG.COM", "r.beetagg.com", "SCN.BY", "su.pr", "t.co", "tinyurl.com", "tr.im"
+ ));
+
+ private HttpHelper() {
+ }
+
+ public enum ContentType {
+ /** HTML-like content type, including HTML, XHTML, etc. */
+ HTML,
+ /** JSON content */
+ JSON,
+ /** XML */
+ XML,
+ /** Plain text content */
+ TEXT,
+ }
+
+ /**
+ * Downloads the entire resource instead of part.
+ *
+ * @param uri URI to retrieve
+ * @param type expected text-like MIME type of that content
+ * @return content as a {@code String}
+ * @throws IOException if the content can't be retrieved because of a bad URI, network problem, etc.
+ * @see #downloadViaHttp(String, ContentType, int)
+ */
+ public static CharSequence downloadViaHttp(String uri, ContentType type) throws IOException {
+ return downloadViaHttp(uri, type, Integer.MAX_VALUE);
+ }
+
+ /**
+ * @param uri URI to retrieve
+ * @param type expected text-like MIME type of that content
+ * @param maxChars approximate maximum characters to read from the source
+ * @return content as a {@code String}
+ * @throws IOException if the content can't be retrieved because of a bad URI, network problem, etc.
+ */
+ public static CharSequence downloadViaHttp(String uri, ContentType type, int maxChars) throws IOException {
+ String contentTypes;
+ switch (type) {
+ case HTML:
+ contentTypes = "application/xhtml+xml,text/html,text/*,*/*";
+ break;
+ case JSON:
+ contentTypes = "application/json,text/*,*/*";
+ break;
+ case XML:
+ contentTypes = "application/xml,text/*,*/*";
+ break;
+ case TEXT:
+ default:
+ contentTypes = "text/*,*/*";
+ }
+ return downloadViaHttp(uri, contentTypes, maxChars);
+ }
+
+ private static CharSequence downloadViaHttp(String uri, String contentTypes, int maxChars) throws IOException {
+ int redirects = 0;
+ while (redirects < 5) {
+ URL url = new URL(uri);
+ HttpURLConnection connection = safelyOpenConnection(url);
+ connection.setInstanceFollowRedirects(true); // Won't work HTTP -> HTTPS or vice versa
+ connection.setRequestProperty("Accept", contentTypes);
+ connection.setRequestProperty("Accept-Charset", "utf-8,*");
+ connection.setRequestProperty("User-Agent", "ZXing (Android)");
+ try {
+ int responseCode = safelyConnect(connection);
+ switch (responseCode) {
+ case HttpURLConnection.HTTP_OK:
+ return consume(connection, maxChars);
+ case HttpURLConnection.HTTP_MOVED_TEMP:
+ String location = connection.getHeaderField("Location");
+ if (location != null) {
+ uri = location;
+ redirects++;
+ continue;
+ }
+ throw new IOException("No Location");
+ default:
+ throw new IOException("Bad HTTP response: " + responseCode);
+ }
+ } finally {
+ connection.disconnect();
+ }
+ }
+ throw new IOException("Too many redirects");
+ }
+
+ private static String getEncoding(URLConnection connection) {
+ String contentTypeHeader = connection.getHeaderField("Content-Type");
+ if (contentTypeHeader != null) {
+ int charsetStart = contentTypeHeader.indexOf("charset=");
+ if (charsetStart >= 0) {
+ return contentTypeHeader.substring(charsetStart + "charset=".length());
+ }
+ }
+ return "UTF-8";
+ }
+
+ private static CharSequence consume(URLConnection connection, int maxChars) throws IOException {
+ String encoding = getEncoding(connection);
+ StringBuilder out = new StringBuilder();
+ Reader in = null;
+ try {
+ in = new InputStreamReader(connection.getInputStream(), encoding);
+ char[] buffer = new char[1024];
+ int charsRead;
+ while (out.length() < maxChars && (charsRead = in.read(buffer)) > 0) {
+ out.append(buffer, 0, charsRead);
+ }
+ } finally {
+ if (in != null) {
+ try {
+ in.close();
+ } catch (IOException | NullPointerException ioe) {
+ // continue
+ }
+ }
+ }
+ return out;
+ }
+
+ public static URI unredirect(URI uri) throws IOException {
+ if (!REDIRECTOR_DOMAINS.contains(uri.getHost())) {
+ return uri;
+ }
+ URL url = uri.toURL();
+ HttpURLConnection connection = safelyOpenConnection(url);
+ connection.setInstanceFollowRedirects(false);
+ connection.setDoInput(false);
+ connection.setRequestMethod("HEAD");
+ connection.setRequestProperty("User-Agent", "ZXing (Android)");
+ try {
+ int responseCode = safelyConnect(connection);
+ switch (responseCode) {
+ case HttpURLConnection.HTTP_MULT_CHOICE:
+ case HttpURLConnection.HTTP_MOVED_PERM:
+ case HttpURLConnection.HTTP_MOVED_TEMP:
+ case HttpURLConnection.HTTP_SEE_OTHER:
+ case 307: // No constant for 307 Temporary Redirect ?
+ String location = connection.getHeaderField("Location");
+ if (location != null) {
+ try {
+ return new URI(location);
+ } catch (URISyntaxException e) {
+ // nevermind
+ }
+ }
+ }
+ return uri;
+ } finally {
+ connection.disconnect();
+ }
+ }
+
+ private static HttpURLConnection safelyOpenConnection(URL url) throws IOException {
+ URLConnection conn;
+ try {
+ conn = url.openConnection();
+ } catch (NullPointerException npe) {
+ // Another strange bug in Android?
+ Log.w(TAG, "Bad URI? " + url);
+ throw new IOException(npe);
+ }
+ if (!(conn instanceof HttpURLConnection)) {
+ throw new IOException();
+ }
+ return (HttpURLConnection) conn;
+ }
+
+ private static int safelyConnect(HttpURLConnection connection) throws IOException {
+ try {
+ connection.connect();
+ } catch (NullPointerException | IllegalArgumentException | IndexOutOfBoundsException | SecurityException e) {
+ // this is an Android bug: http://code.google.com/p/android/issues/detail?id=16895
+ throw new IOException(e);
+ }
+ try {
+ return connection.getResponseCode();
+ } catch (NullPointerException | StringIndexOutOfBoundsException | IllegalArgumentException e) {
+ // this is maybe this Android bug: http://code.google.com/p/android/issues/detail?id=15554
+ throw new IOException(e);
+ }
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/InactivityTimer.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/InactivityTimer.java
new file mode 100755
index 0000000..5e33d90
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/InactivityTimer.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2010 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android;
+
+import android.app.Activity;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.AsyncTask;
+import android.os.BatteryManager;
+import android.util.Log;
+
+/**
+ * Finishes an activity after a period of inactivity if the device is on battery power.
+ */
+final class InactivityTimer {
+
+ private static final String TAG = InactivityTimer.class.getSimpleName();
+
+ private static final long INACTIVITY_DELAY_MS = 5 * 60 * 1000L;
+
+ private final Activity activity;
+ private final BroadcastReceiver powerStatusReceiver;
+ private boolean registered;
+ private AsyncTask<Object,Object,Object> inactivityTask;
+
+ InactivityTimer(Activity activity) {
+ this.activity = activity;
+ powerStatusReceiver = new PowerStatusReceiver();
+ registered = false;
+ onActivity();
+ }
+
+ synchronized void onActivity() {
+ cancel();
+ inactivityTask = new InactivityAsyncTask();
+ inactivityTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ }
+
+ public synchronized void onPause() {
+ cancel();
+ if (registered) {
+ activity.unregisterReceiver(powerStatusReceiver);
+ registered = false;
+ } else {
+ Log.w(TAG, "PowerStatusReceiver was never registered?");
+ }
+ }
+
+ public synchronized void onResume() {
+ if (registered) {
+ Log.w(TAG, "PowerStatusReceiver was already registered?");
+ } else {
+ activity.registerReceiver(powerStatusReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
+ registered = true;
+ }
+ onActivity();
+ }
+
+ private synchronized void cancel() {
+ AsyncTask<?,?,?> task = inactivityTask;
+ if (task != null) {
+ task.cancel(true);
+ inactivityTask = null;
+ }
+ }
+
+ void shutdown() {
+ cancel();
+ }
+
+ private final class PowerStatusReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent){
+ if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) {
+ // 0 indicates that we're on battery
+ boolean onBatteryNow = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) <= 0;
+ if (onBatteryNow) {
+ InactivityTimer.this.onActivity();
+ } else {
+ InactivityTimer.this.cancel();
+ }
+ }
+ }
+ }
+
+ private final class InactivityAsyncTask extends AsyncTask<Object,Object,Object> {
+ @Override
+ protected Object doInBackground(Object... objects) {
+ try {
+ Thread.sleep(INACTIVITY_DELAY_MS);
+ Log.i(TAG, "Finishing activity due to inactivity");
+ activity.finish();
+ } catch (InterruptedException e) {
+ // continue without killing
+ }
+ return null;
+ }
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/IntentSource.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/IntentSource.java
new file mode 100755
index 0000000..3222db6
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/IntentSource.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2011 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android;
+
+enum IntentSource {
+
+ NATIVE_APP_INTENT,
+ PRODUCT_SEARCH_LINK,
+ ZXING_LINK,
+ NONE
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/Intents.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/Intents.java
new file mode 100755
index 0000000..6e59e80
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/Intents.java
@@ -0,0 +1,278 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android;
+
+/**
+ * This class provides the constants to use when sending an Intent to Barcode Scanner.
+ * These strings are effectively API and cannot be changed.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+public final class Intents {
+ private Intents() {
+ }
+
+ public static final class Scan {
+ /**
+ * Send this intent to open the Barcodes app in scanning mode, find a barcode, and return
+ * the results.
+ */
+ public static final String ACTION = "com.google.zxing.client.android.SCAN";
+
+ /**
+ * By default, sending this will decode all barcodes that we understand. However it
+ * may be useful to limit scanning to certain formats. Use
+ * {@link android.content.Intent#putExtra(String, String)} with one of the values below.
+ *
+ * Setting this is effectively shorthand for setting explicit formats with {@link #FORMATS}.
+ * It is overridden by that setting.
+ */
+ public static final String MODE = "SCAN_MODE";
+
+ /**
+ * Decode only UPC and EAN barcodes. This is the right choice for shopping apps which get
+ * prices, reviews, etc. for products.
+ */
+ public static final String PRODUCT_MODE = "PRODUCT_MODE";
+
+ /**
+ * Decode only 1D barcodes.
+ */
+ public static final String ONE_D_MODE = "ONE_D_MODE";
+
+ /**
+ * Decode only QR codes.
+ */
+ public static final String QR_CODE_MODE = "QR_CODE_MODE";
+
+ /**
+ * Decode only Data Matrix codes.
+ */
+ public static final String DATA_MATRIX_MODE = "DATA_MATRIX_MODE";
+
+ /**
+ * Decode only Aztec.
+ */
+ public static final String AZTEC_MODE = "AZTEC_MODE";
+
+ /**
+ * Decode only PDF417.
+ */
+ public static final String PDF417_MODE = "PDF417_MODE";
+
+ /**
+ * Comma-separated list of formats to scan for. The values must match the names of
+ * {@link com.google.zxing.BarcodeFormat}s, e.g. {@link com.google.zxing.BarcodeFormat#EAN_13}.
+ * Example: "EAN_13,EAN_8,QR_CODE". This overrides {@link #MODE}.
+ */
+ public static final String FORMATS = "SCAN_FORMATS";
+
+ /**
+ * Optional parameter to specify the id of the camera from which to recognize barcodes.
+ * Overrides the default camera that would otherwise would have been selected.
+ * If provided, should be an int.
+ */
+ public static final String CAMERA_ID = "SCAN_CAMERA_ID";
+
+ /**
+ * @see com.google.zxing.DecodeHintType#CHARACTER_SET
+ */
+ public static final String CHARACTER_SET = "CHARACTER_SET";
+
+ /**
+ * Optional parameters to specify the width and height of the scanning rectangle in pixels.
+ * The app will try to honor these, but will clamp them to the size of the preview frame.
+ * You should specify both or neither, and pass the size as an int.
+ */
+ public static final String WIDTH = "SCAN_WIDTH";
+ public static final String HEIGHT = "SCAN_HEIGHT";
+
+ /**
+ * Desired duration in milliseconds for which to pause after a successful scan before
+ * returning to the calling intent. Specified as a long, not an integer!
+ * For example: 1000L, not 1000.
+ */
+ public static final String RESULT_DISPLAY_DURATION_MS = "RESULT_DISPLAY_DURATION_MS";
+
+ /**
+ * Prompt to show on-screen when scanning by intent. Specified as a {@link String}.
+ */
+ public static final String PROMPT_MESSAGE = "PROMPT_MESSAGE";
+
+ /**
+ * If a barcode is found, Barcodes returns {@link android.app.Activity#RESULT_OK} to
+ * {@link android.app.Activity#onActivityResult(int, int, android.content.Intent)}
+ * of the app which requested the scan via
+ * {@link android.app.Activity#startActivityForResult(android.content.Intent, int)}
+ * The barcodes contents can be retrieved with
+ * {@link android.content.Intent#getStringExtra(String)}.
+ * If the user presses Back, the result code will be {@link android.app.Activity#RESULT_CANCELED}.
+ */
+ public static final String RESULT = "SCAN_RESULT";
+
+ /**
+ * Call {@link android.content.Intent#getStringExtra(String)} with {@link #RESULT_FORMAT}
+ * to determine which barcode format was found.
+ * See {@link com.google.zxing.BarcodeFormat} for possible values.
+ */
+ public static final String RESULT_FORMAT = "SCAN_RESULT_FORMAT";
+
+ /**
+ * Call {@link android.content.Intent#getStringExtra(String)} with {@link #RESULT_UPC_EAN_EXTENSION}
+ * to return the content of any UPC extension barcode that was also found. Only applicable
+ * to {@link com.google.zxing.BarcodeFormat#UPC_A} and {@link com.google.zxing.BarcodeFormat#EAN_13}
+ * formats.
+ */
+ public static final String RESULT_UPC_EAN_EXTENSION = "SCAN_RESULT_UPC_EAN_EXTENSION";
+
+ /**
+ * Call {@link android.content.Intent#getByteArrayExtra(String)} with {@link #RESULT_BYTES}
+ * to get a {@code byte[]} of raw bytes in the barcode, if available.
+ */
+ public static final String RESULT_BYTES = "SCAN_RESULT_BYTES";
+
+ /**
+ * Key for the value of {@link com.google.zxing.ResultMetadataType#ORIENTATION}, if available.
+ * Call {@link android.content.Intent#getIntArrayExtra(String)} with {@link #RESULT_ORIENTATION}.
+ */
+ public static final String RESULT_ORIENTATION = "SCAN_RESULT_ORIENTATION";
+
+ /**
+ * Key for the value of {@link com.google.zxing.ResultMetadataType#ERROR_CORRECTION_LEVEL}, if available.
+ * Call {@link android.content.Intent#getStringExtra(String)} with {@link #RESULT_ERROR_CORRECTION_LEVEL}.
+ */
+ public static final String RESULT_ERROR_CORRECTION_LEVEL = "SCAN_RESULT_ERROR_CORRECTION_LEVEL";
+
+ /**
+ * Prefix for keys that map to the values of {@link com.google.zxing.ResultMetadataType#BYTE_SEGMENTS},
+ * if available. The actual values will be set under a series of keys formed by adding 0, 1, 2, ...
+ * to this prefix. So the first byte segment is under key "SCAN_RESULT_BYTE_SEGMENTS_0" for example.
+ * Call {@link android.content.Intent#getByteArrayExtra(String)} with these keys.
+ */
+ public static final String RESULT_BYTE_SEGMENTS_PREFIX = "SCAN_RESULT_BYTE_SEGMENTS_";
+
+ /**
+ * Setting this to false will not save scanned codes in the history. Specified as a {@code boolean}.
+ */
+ public static final String SAVE_HISTORY = "SAVE_HISTORY";
+
+ private Scan() {
+ }
+ }
+
+ public static final class History {
+
+ public static final String ITEM_NUMBER = "ITEM_NUMBER";
+
+ private History() {
+ }
+ }
+
+ public static final class Encode {
+ /**
+ * Send this intent to encode a piece of data as a QR code and display it full screen, so
+ * that another person can scan the barcode from your screen.
+ */
+ public static final String ACTION = "com.google.zxing.client.android.ENCODE";
+
+ /**
+ * The data to encode. Use {@link android.content.Intent#putExtra(String, String)} or
+ * {@link android.content.Intent#putExtra(String, android.os.Bundle)},
+ * depending on the type and format specified. Non-QR Code formats should
+ * just use a String here. For QR Code, see Contents for details.
+ */
+ public static final String DATA = "ENCODE_DATA";
+
+ /**
+ * The type of data being supplied if the format is QR Code. Use
+ * {@link android.content.Intent#putExtra(String, String)} with one of {@link Contents.Type}.
+ */
+ public static final String TYPE = "ENCODE_TYPE";
+
+ /**
+ * The barcode format to be displayed. If this isn't specified or is blank,
+ * it defaults to QR Code. Use {@link android.content.Intent#putExtra(String, String)}, where
+ * format is one of {@link com.google.zxing.BarcodeFormat}.
+ */
+ public static final String FORMAT = "ENCODE_FORMAT";
+
+ /**
+ * Normally the contents of the barcode are displayed to the user in a TextView. Setting this
+ * boolean to false will hide that TextView, showing only the encode barcode.
+ */
+ public static final String SHOW_CONTENTS = "ENCODE_SHOW_CONTENTS";
+
+ private Encode() {
+ }
+ }
+
+ public static final class SearchBookContents {
+ /**
+ * Use Google Book Search to search the contents of the book provided.
+ */
+ public static final String ACTION = "com.google.zxing.client.android.SEARCH_BOOK_CONTENTS";
+
+ /**
+ * The book to search, identified by ISBN number.
+ */
+ public static final String ISBN = "ISBN";
+
+ /**
+ * An optional field which is the text to search for.
+ */
+ public static final String QUERY = "QUERY";
+
+ private SearchBookContents() {
+ }
+ }
+
+ public static final class WifiConnect {
+ /**
+ * Internal intent used to trigger connection to a wi-fi network.
+ */
+ public static final String ACTION = "com.google.zxing.client.android.WIFI_CONNECT";
+
+ /**
+ * The network to connect to, all the configuration provided here.
+ */
+ public static final String SSID = "SSID";
+
+ /**
+ * The network to connect to, all the configuration provided here.
+ */
+ public static final String TYPE = "TYPE";
+
+ /**
+ * The network to connect to, all the configuration provided here.
+ */
+ public static final String PASSWORD = "PASSWORD";
+
+ private WifiConnect() {
+ }
+ }
+
+ public static final class Share {
+ /**
+ * Give the user a choice of items to encode as a barcode, then render it as a QR Code and
+ * display onscreen for a friend to scan with their phone.
+ */
+ public static final String ACTION = "com.google.zxing.client.android.SHARE";
+
+ private Share() {
+ }
+ }
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/LocaleManager.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/LocaleManager.java
new file mode 100755
index 0000000..5d74c5d
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/LocaleManager.java
@@ -0,0 +1,188 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.preference.PreferenceManager;
+
+/**
+ * Handles any locale-specific logic for the client.
+ *
+ * @author Sean Owen
+ */
+public final class LocaleManager {
+
+ private static final String DEFAULT_TLD = "com";
+ private static final String DEFAULT_COUNTRY = "US";
+ private static final String DEFAULT_LANGUAGE = "en";
+
+ /**
+ * Locales (well, countries) where Google web search is available.
+ * These should be kept in sync with our translations.
+ */
+ private static final Map<String,String> GOOGLE_COUNTRY_TLD;
+ static {
+ GOOGLE_COUNTRY_TLD = new HashMap<>();
+ GOOGLE_COUNTRY_TLD.put("AR", "com.ar"); // ARGENTINA
+ GOOGLE_COUNTRY_TLD.put("AU", "com.au"); // AUSTRALIA
+ GOOGLE_COUNTRY_TLD.put("BR", "com.br"); // BRAZIL
+ GOOGLE_COUNTRY_TLD.put("BG", "bg"); // BULGARIA
+ GOOGLE_COUNTRY_TLD.put(Locale.CANADA.getCountry(), "ca");
+ GOOGLE_COUNTRY_TLD.put(Locale.CHINA.getCountry(), "cn");
+ GOOGLE_COUNTRY_TLD.put("CZ", "cz"); // CZECH REPUBLIC
+ GOOGLE_COUNTRY_TLD.put("DK", "dk"); // DENMARK
+ GOOGLE_COUNTRY_TLD.put("FI", "fi"); // FINLAND
+ GOOGLE_COUNTRY_TLD.put(Locale.FRANCE.getCountry(), "fr");
+ GOOGLE_COUNTRY_TLD.put(Locale.GERMANY.getCountry(), "de");
+ GOOGLE_COUNTRY_TLD.put("GR", "gr"); // GREECE
+ GOOGLE_COUNTRY_TLD.put("HU", "hu"); // HUNGARY
+ GOOGLE_COUNTRY_TLD.put("ID", "co.id"); // INDONESIA
+ GOOGLE_COUNTRY_TLD.put("IL", "co.il"); // ISRAEL
+ GOOGLE_COUNTRY_TLD.put(Locale.ITALY.getCountry(), "it");
+ GOOGLE_COUNTRY_TLD.put(Locale.JAPAN.getCountry(), "co.jp");
+ GOOGLE_COUNTRY_TLD.put(Locale.KOREA.getCountry(), "co.kr");
+ GOOGLE_COUNTRY_TLD.put("NL", "nl"); // NETHERLANDS
+ GOOGLE_COUNTRY_TLD.put("PL", "pl"); // POLAND
+ GOOGLE_COUNTRY_TLD.put("PT", "pt"); // PORTUGAL
+ GOOGLE_COUNTRY_TLD.put("RO", "ro"); // ROMANIA
+ GOOGLE_COUNTRY_TLD.put("RU", "ru"); // RUSSIA
+ GOOGLE_COUNTRY_TLD.put("SK", "sk"); // SLOVAK REPUBLIC
+ GOOGLE_COUNTRY_TLD.put("SI", "si"); // SLOVENIA
+ GOOGLE_COUNTRY_TLD.put("ES", "es"); // SPAIN
+ GOOGLE_COUNTRY_TLD.put("SE", "se"); // SWEDEN
+ GOOGLE_COUNTRY_TLD.put("CH", "ch"); // SWITZERLAND
+ GOOGLE_COUNTRY_TLD.put(Locale.TAIWAN.getCountry(), "tw");
+ GOOGLE_COUNTRY_TLD.put("TR", "com.tr"); // TURKEY
+ GOOGLE_COUNTRY_TLD.put("UA", "com.ua"); // UKRAINE
+ GOOGLE_COUNTRY_TLD.put(Locale.UK.getCountry(), "co.uk");
+ GOOGLE_COUNTRY_TLD.put(Locale.US.getCountry(), "com");
+ }
+
+ /**
+ * Google Product Search for mobile is available in fewer countries than web search. See here:
+ * http://support.google.com/merchants/bin/answer.py?hl=en-GB&answer=160619
+ */
+ private static final Map<String,String> GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD;
+ static {
+ GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD = new HashMap<>();
+ GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put("AU", "com.au"); // AUSTRALIA
+ //GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put(Locale.CHINA.getCountry(), "cn");
+ GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put(Locale.FRANCE.getCountry(), "fr");
+ GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put(Locale.GERMANY.getCountry(), "de");
+ GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put(Locale.ITALY.getCountry(), "it");
+ GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put(Locale.JAPAN.getCountry(), "co.jp");
+ GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put("NL", "nl"); // NETHERLANDS
+ GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put("ES", "es"); // SPAIN
+ GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put("CH", "ch"); // SWITZERLAND
+ GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put(Locale.UK.getCountry(), "co.uk");
+ GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put(Locale.US.getCountry(), "com");
+ }
+
+ /**
+ * Book search is offered everywhere that web search is available.
+ */
+ private static final Map<String,String> GOOGLE_BOOK_SEARCH_COUNTRY_TLD = GOOGLE_COUNTRY_TLD;
+
+ private static final Collection<String> TRANSLATED_HELP_ASSET_LANGUAGES =
+ Arrays.asList("de", "en", "es", "fr", "it", "ja", "ko", "nl", "pt", "ru", "uk", "zh-rCN", "zh-rTW", "zh-rHK");
+
+ private LocaleManager() {}
+
+ /**
+ * @param context application's {@link Context}
+ * @return country-specific TLD suffix appropriate for the current default locale
+ * (e.g. "co.uk" for the United Kingdom)
+ */
+ public static String getCountryTLD(Context context) {
+ return doGetTLD(GOOGLE_COUNTRY_TLD, context);
+ }
+
+ /**
+ * The same as above, but specifically for Google Product Search.
+ *
+ * @param context application's {@link Context}
+ * @return The top-level domain to use.
+ */
+ public static String getProductSearchCountryTLD(Context context) {
+ return doGetTLD(GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD, context);
+ }
+
+ /**
+ * The same as above, but specifically for Google Book Search.
+ *
+ * @param context application's {@link Context}
+ * @return The top-level domain to use.
+ */
+ public static String getBookSearchCountryTLD(Context context) {
+ return doGetTLD(GOOGLE_BOOK_SEARCH_COUNTRY_TLD, context);
+ }
+
+ /**
+ * Does a given URL point to Google Book Search, regardless of domain.
+ *
+ * @param url The address to check.
+ * @return True if this is a Book Search URL.
+ */
+ public static boolean isBookSearchUrl(String url) {
+ return url.startsWith("http://google.com/books") || url.startsWith("http://books.google.");
+ }
+
+ private static String getSystemCountry() {
+ Locale locale = Locale.getDefault();
+ return locale == null ? DEFAULT_COUNTRY : locale.getCountry();
+ }
+
+ private static String getSystemLanguage() {
+ Locale locale = Locale.getDefault();
+ if (locale == null) {
+ return DEFAULT_LANGUAGE;
+ }
+ String language = locale.getLanguage();
+ // Special case Chinese
+ if (Locale.SIMPLIFIED_CHINESE.getLanguage().equals(language)) {
+ return language + "-r" + getSystemCountry();
+ }
+ return language;
+ }
+
+ public static String getTranslatedAssetLanguage() {
+ String language = getSystemLanguage();
+ return TRANSLATED_HELP_ASSET_LANGUAGES.contains(language) ? language : DEFAULT_LANGUAGE;
+ }
+
+ private static String doGetTLD(Map<String,String> map, Context context) {
+ String tld = map.get(getCountry(context));
+ return tld == null ? DEFAULT_TLD : tld;
+ }
+
+ public static String getCountry(Context context) {
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ String countryOverride = prefs.getString(PreferencesActivity.KEY_SEARCH_COUNTRY, "-");
+ if (countryOverride != null && !countryOverride.isEmpty() && !"-".equals(countryOverride)) {
+ return countryOverride;
+ }
+ return getSystemCountry();
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/PreferencesActivity.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/PreferencesActivity.java
new file mode 100755
index 0000000..8d0dc64
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/PreferencesActivity.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * The main settings activity.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ * @author Sean Owen
+ */
+public final class PreferencesActivity extends Activity {
+
+ public static final String KEY_DECODE_1D_PRODUCT = "preferences_decode_1D_product";
+ public static final String KEY_DECODE_1D_INDUSTRIAL = "preferences_decode_1D_industrial";
+ public static final String KEY_DECODE_QR = "preferences_decode_QR";
+ public static final String KEY_DECODE_DATA_MATRIX = "preferences_decode_Data_Matrix";
+ public static final String KEY_DECODE_AZTEC = "preferences_decode_Aztec";
+ public static final String KEY_DECODE_PDF417 = "preferences_decode_PDF417";
+
+ public static final String KEY_CUSTOM_PRODUCT_SEARCH = "preferences_custom_product_search";
+
+ public static final String KEY_PLAY_BEEP = "preferences_play_beep";
+ public static final String KEY_VIBRATE = "preferences_vibrate";
+ public static final String KEY_COPY_TO_CLIPBOARD = "preferences_copy_to_clipboard";
+ public static final String KEY_FRONT_LIGHT_MODE = "preferences_front_light_mode";
+ public static final String KEY_BULK_MODE = "preferences_bulk_mode";
+ public static final String KEY_REMEMBER_DUPLICATES = "preferences_remember_duplicates";
+ public static final String KEY_ENABLE_HISTORY = "preferences_history";
+ public static final String KEY_SUPPLEMENTAL = "preferences_supplemental";
+ public static final String KEY_AUTO_FOCUS = "preferences_auto_focus";
+ public static final String KEY_INVERT_SCAN = "preferences_invert_scan";
+ public static final String KEY_SEARCH_COUNTRY = "preferences_search_country";
+ public static final String KEY_DISABLE_AUTO_ORIENTATION = "preferences_orientation";
+
+ public static final String KEY_DISABLE_CONTINUOUS_FOCUS = "preferences_disable_continuous_focus";
+ public static final String KEY_DISABLE_EXPOSURE = "preferences_disable_exposure";
+ public static final String KEY_DISABLE_METERING = "preferences_disable_metering";
+ public static final String KEY_DISABLE_BARCODE_SCENE_MODE = "preferences_disable_barcode_scene_mode";
+ public static final String KEY_AUTO_OPEN_WEB = "preferences_auto_open_web";
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ getFragmentManager().beginTransaction().replace(android.R.id.content, new PreferencesFragment()).commit();
+ }
+
+ // Apparently this will be necessary when targeting API 19+:
+ /*
+ @Override
+ protected boolean isValidFragment(String fragmentName) {
+ return true;
+ }
+ */
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/PreferencesFragment.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/PreferencesFragment.java
new file mode 100755
index 0000000..8fecd8a
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/PreferencesFragment.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2013 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android;
+
+import android.app.AlertDialog;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.preference.CheckBoxPreference;
+import android.preference.EditTextPreference;
+import android.preference.Preference;
+import android.preference.PreferenceFragment;
+import android.preference.PreferenceScreen;
+
+import com.alibaba.weex.R;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Collection;
+
+
+public final class PreferencesFragment
+ extends PreferenceFragment
+ implements SharedPreferences.OnSharedPreferenceChangeListener {
+
+ private CheckBoxPreference[] checkBoxPrefs;
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ addPreferencesFromResource(R.xml.preferences);
+
+ PreferenceScreen preferences = getPreferenceScreen();
+ preferences.getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
+ checkBoxPrefs = findDecodePrefs(preferences,
+ PreferencesActivity.KEY_DECODE_1D_PRODUCT,
+ PreferencesActivity.KEY_DECODE_1D_INDUSTRIAL,
+ PreferencesActivity.KEY_DECODE_QR,
+ PreferencesActivity.KEY_DECODE_DATA_MATRIX,
+ PreferencesActivity.KEY_DECODE_AZTEC,
+ PreferencesActivity.KEY_DECODE_PDF417);
+ disableLastCheckedPref();
+
+ EditTextPreference customProductSearch = (EditTextPreference)
+ preferences.findPreference(PreferencesActivity.KEY_CUSTOM_PRODUCT_SEARCH);
+ customProductSearch.setOnPreferenceChangeListener(new CustomSearchURLValidator());
+ }
+
+ private static CheckBoxPreference[] findDecodePrefs(PreferenceScreen preferences, String... keys) {
+ CheckBoxPreference[] prefs = new CheckBoxPreference[keys.length];
+ for (int i = 0; i < keys.length; i++) {
+ prefs[i] = (CheckBoxPreference) preferences.findPreference(keys[i]);
+ }
+ return prefs;
+ }
+
+ @Override
+ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
+ disableLastCheckedPref();
+ }
+
+ private void disableLastCheckedPref() {
+ Collection<CheckBoxPreference> checked = new ArrayList<>(checkBoxPrefs.length);
+ for (CheckBoxPreference pref : checkBoxPrefs) {
+ if (pref.isChecked()) {
+ checked.add(pref);
+ }
+ }
+ boolean disable = checked.size() <= 1;
+ for (CheckBoxPreference pref : checkBoxPrefs) {
+ pref.setEnabled(!(disable && checked.contains(pref)));
+ }
+ }
+
+ private class CustomSearchURLValidator implements Preference.OnPreferenceChangeListener {
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ if (!isValid(newValue)) {
+ AlertDialog.Builder builder =
+ new AlertDialog.Builder(PreferencesFragment.this.getActivity());
+ builder.setTitle(R.string.msg_error);
+ builder.setMessage(R.string.msg_invalid_value);
+ builder.setCancelable(true);
+ builder.show();
+ return false;
+ }
+ return true;
+ }
+
+ private boolean isValid(Object newValue) {
+ // Allow empty/null value
+ if (newValue == null) {
+ return true;
+ }
+ String valueString = newValue.toString();
+ if (valueString.isEmpty()) {
+ return true;
+ }
+ // Before validating, remove custom placeholders, which will not
+ // be considered valid parts of the URL in some locations:
+ // Blank %t and %s:
+ valueString = valueString.replaceAll("%[st]", "");
+ // Blank %f but not if followed by digit or a-f as it may be a hex sequence
+ valueString = valueString.replaceAll("%f(?![0-9a-f])", "");
+ // Require a scheme otherwise:
+ try {
+ URI uri = new URI(valueString);
+ return uri.getScheme() != null;
+ } catch (URISyntaxException use) {
+ return false;
+ }
+ }
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/ScanFromWebPageManager.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/ScanFromWebPageManager.java
new file mode 100755
index 0000000..c8d1396
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/ScanFromWebPageManager.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2012 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
+import android.net.Uri;
+
+import com.google.zxing.Result;
+import com.google.zxing.client.android.result.ResultHandler;
+
+/**
+ * Manages functionality related to responding to requests to scan from an HTTP link in a web page.
+ * See <a href="http://github.com/zxing/zxing/wiki/ScanningFromWebPages">ScanningFromWebPages</a>.
+ *
+ * @author Sean Owen
+ */
+final class ScanFromWebPageManager {
+
+ private static final CharSequence CODE_PLACEHOLDER = "{CODE}";
+ private static final CharSequence RAW_CODE_PLACEHOLDER = "{RAWCODE}";
+ private static final CharSequence META_PLACEHOLDER = "{META}";
+ private static final CharSequence FORMAT_PLACEHOLDER = "{FORMAT}";
+ private static final CharSequence TYPE_PLACEHOLDER = "{TYPE}";
+
+ private static final String RETURN_URL_PARAM = "ret";
+ private static final String RAW_PARAM = "raw";
+
+ private final String returnUrlTemplate;
+ private final boolean returnRaw;
+
+ ScanFromWebPageManager(Uri inputUri) {
+ returnUrlTemplate = inputUri.getQueryParameter(RETURN_URL_PARAM);
+ returnRaw = inputUri.getQueryParameter(RAW_PARAM) != null;
+ }
+
+ boolean isScanFromWebPage() {
+ return returnUrlTemplate != null;
+ }
+
+ String buildReplyURL(Result rawResult, ResultHandler resultHandler) {
+ String result = returnUrlTemplate;
+ result = replace(CODE_PLACEHOLDER,
+ returnRaw ? rawResult.getText() : resultHandler.getDisplayContents(), result);
+ result = replace(RAW_CODE_PLACEHOLDER, rawResult.getText(), result);
+ result = replace(FORMAT_PLACEHOLDER, rawResult.getBarcodeFormat().toString(), result);
+ result = replace(TYPE_PLACEHOLDER, resultHandler.getType().toString(), result);
+ result = replace(META_PLACEHOLDER, String.valueOf(rawResult.getResultMetadata()), result);
+ return result;
+ }
+
+ private static String replace(CharSequence placeholder, CharSequence with, String pattern) {
+ CharSequence escapedWith = with == null ? "" : with;
+ try {
+ escapedWith = URLEncoder.encode(escapedWith.toString(), "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ // can't happen; UTF-8 is always supported. Continue, I guess, without encoding
+ }
+ return pattern.replace(placeholder, escapedWith);
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/ViewfinderResultPointCallback.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/ViewfinderResultPointCallback.java
new file mode 100755
index 0000000..48009a9
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/ViewfinderResultPointCallback.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2009 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android;
+
+import com.google.zxing.ResultPoint;
+import com.google.zxing.ResultPointCallback;
+
+final class ViewfinderResultPointCallback implements ResultPointCallback {
+
+ private final ViewfinderView viewfinderView;
+
+ ViewfinderResultPointCallback(ViewfinderView viewfinderView) {
+ this.viewfinderView = viewfinderView;
+ }
+
+ @Override
+ public void foundPossibleResultPoint(ResultPoint point) {
+ viewfinderView.addPossibleResultPoint(point);
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/ViewfinderView.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/ViewfinderView.java
new file mode 100755
index 0000000..84a0e06
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/ViewfinderView.java
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.util.AttributeSet;
+import android.view.View;
+
+import com.alibaba.weex.R;
+import com.google.zxing.ResultPoint;
+import com.google.zxing.client.android.camera.CameraManager;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This view is overlaid on top of the camera preview. It adds the viewfinder rectangle and partial
+ * transparency outside it, as well as the laser scanner animation and result points.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+public final class ViewfinderView extends View {
+
+ private static final int[] SCANNER_ALPHA = {0, 64, 128, 192, 255, 192, 128, 64};
+ private static final long ANIMATION_DELAY = 80L;
+ private static final int CURRENT_POINT_OPACITY = 0xA0;
+ private static final int MAX_RESULT_POINTS = 20;
+ private static final int POINT_SIZE = 6;
+
+ private CameraManager cameraManager;
+ private final Paint paint;
+ private Bitmap resultBitmap;
+ private final int maskColor;
+ private final int resultColor;
+ private final int laserColor;
+ private final int resultPointColor;
+ private int scannerAlpha;
+ private List<ResultPoint> possibleResultPoints;
+ private List<ResultPoint> lastPossibleResultPoints;
+
+ // This constructor is used when the class is built from an XML resource.
+ public ViewfinderView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ // Initialize these once for performance rather than calling them every time in onDraw().
+ paint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ Resources resources = getResources();
+ maskColor = resources.getColor(R.color.viewfinder_mask);
+ resultColor = resources.getColor(R.color.result_view);
+ laserColor = resources.getColor(R.color.viewfinder_laser);
+ resultPointColor = resources.getColor(R.color.possible_result_points);
+ scannerAlpha = 0;
+ possibleResultPoints = new ArrayList<>(5);
+ lastPossibleResultPoints = null;
+ }
+
+ public void setCameraManager(CameraManager cameraManager) {
+ this.cameraManager = cameraManager;
+ }
+
+ @SuppressLint("DrawAllocation")
+ @Override
+ public void onDraw(Canvas canvas) {
+ if (cameraManager == null) {
+ return; // not ready yet, early draw before done configuring
+ }
+ Rect frame = cameraManager.getFramingRect();
+ Rect previewFrame = cameraManager.getFramingRectInPreview();
+ if (frame == null || previewFrame == null) {
+ return;
+ }
+ int width = canvas.getWidth();
+ int height = canvas.getHeight();
+
+ // Draw the exterior (i.e. outside the framing rect) darkened
+ paint.setColor(resultBitmap != null ? resultColor : maskColor);
+ canvas.drawRect(0, 0, width, frame.top, paint);
+ canvas.drawRect(0, frame.top, frame.left, frame.bottom + 1, paint);
+ canvas.drawRect(frame.right + 1, frame.top, width, frame.bottom + 1, paint);
+ canvas.drawRect(0, frame.bottom + 1, width, height, paint);
+
+ if (resultBitmap != null) {
+ // Draw the opaque result bitmap over the scanning rectangle
+ paint.setAlpha(CURRENT_POINT_OPACITY);
+ canvas.drawBitmap(resultBitmap, null, frame, paint);
+ } else {
+
+ // Draw a red "laser scanner" line through the middle to show decoding is active
+ paint.setColor(laserColor);
+ paint.setAlpha(SCANNER_ALPHA[scannerAlpha]);
+ scannerAlpha = (scannerAlpha + 1) % SCANNER_ALPHA.length;
+ int middle = frame.height() / 2 + frame.top;
+ canvas.drawRect(frame.left + 2, middle - 1, frame.right - 1, middle + 2, paint);
+
+ float scaleX = frame.width() / (float) previewFrame.width();
+ float scaleY = frame.height() / (float) previewFrame.height();
+
+ List<ResultPoint> currentPossible = possibleResultPoints;
+ List<ResultPoint> currentLast = lastPossibleResultPoints;
+ int frameLeft = frame.left;
+ int frameTop = frame.top;
+ if (currentPossible.isEmpty()) {
+ lastPossibleResultPoints = null;
+ } else {
+ possibleResultPoints = new ArrayList<>(5);
+ lastPossibleResultPoints = currentPossible;
+ paint.setAlpha(CURRENT_POINT_OPACITY);
+ paint.setColor(resultPointColor);
+ synchronized (currentPossible) {
+ for (ResultPoint point : currentPossible) {
+ canvas.drawCircle(frameLeft + (int) (point.getX() * scaleX),
+ frameTop + (int) (point.getY() * scaleY),
+ POINT_SIZE, paint);
+ }
+ }
+ }
+ if (currentLast != null) {
+ paint.setAlpha(CURRENT_POINT_OPACITY / 2);
+ paint.setColor(resultPointColor);
+ synchronized (currentLast) {
+ float radius = POINT_SIZE / 2.0f;
+ for (ResultPoint point : currentLast) {
+ canvas.drawCircle(frameLeft + (int) (point.getX() * scaleX),
+ frameTop + (int) (point.getY() * scaleY),
+ radius, paint);
+ }
+ }
+ }
+
+ // Request another update at the animation interval, but only repaint the laser line,
+ // not the entire viewfinder mask.
+ postInvalidateDelayed(ANIMATION_DELAY,
+ frame.left - POINT_SIZE,
+ frame.top - POINT_SIZE,
+ frame.right + POINT_SIZE,
+ frame.bottom + POINT_SIZE);
+ }
+ }
+
+ public void drawViewfinder() {
+ Bitmap resultBitmap = this.resultBitmap;
+ this.resultBitmap = null;
+ if (resultBitmap != null) {
+ resultBitmap.recycle();
+ }
+ invalidate();
+ }
+
+ /**
+ * Draw a bitmap with the result points highlighted instead of the live scanning display.
+ *
+ * @param barcode An image of the decoded barcode.
+ */
+ public void drawResultBitmap(Bitmap barcode) {
+ resultBitmap = barcode;
+ invalidate();
+ }
+
+ public void addPossibleResultPoint(ResultPoint point) {
+ List<ResultPoint> points = possibleResultPoints;
+ synchronized (points) {
+ points.add(point);
+ int size = points.size();
+ if (size > MAX_RESULT_POINTS) {
+ // trim it
+ points.subList(0, size - MAX_RESULT_POINTS / 2).clear();
+ }
+ }
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/book/BrowseBookListener.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/book/BrowseBookListener.java
new file mode 100755
index 0000000..7d8a7c8
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/book/BrowseBookListener.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2009 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.book;
+
+import java.util.List;
+
+import android.content.Intent;
+import android.net.Uri;
+import android.view.View;
+import android.widget.AdapterView;
+
+import com.google.zxing.client.android.LocaleManager;
+
+final class BrowseBookListener implements AdapterView.OnItemClickListener {
+
+ private final SearchBookContentsActivity activity;
+ private final List<SearchBookContentsResult> items;
+
+ BrowseBookListener(SearchBookContentsActivity activity, List<SearchBookContentsResult> items) {
+ this.activity = activity;
+ this.items = items;
+ }
+
+ @Override
+ public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
+ if (position < 1) {
+ // Clicked header, ignore it
+ return;
+ }
+ int itemOffset = position - 1;
+ if (itemOffset >= items.size()) {
+ return;
+ }
+ String pageId = items.get(itemOffset).getPageId();
+ String query = SearchBookContentsResult.getQuery();
+ if (LocaleManager.isBookSearchUrl(activity.getISBN()) && !pageId.isEmpty()) {
+ String uri = activity.getISBN();
+ int equals = uri.indexOf('=');
+ String volumeId = uri.substring(equals + 1);
+ String readBookURI = "http://books.google." +
+ LocaleManager.getBookSearchCountryTLD(activity) +
+ "/books?id=" + volumeId + "&pg=" + pageId + "&vq=" + query;
+ Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(readBookURI));
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+ activity.startActivity(intent);
+ }
+ }
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/book/SearchBookContentsActivity.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/book/SearchBookContentsActivity.java
new file mode 100755
index 0000000..c33dbac
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/book/SearchBookContentsActivity.java
@@ -0,0 +1,274 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.book;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.webkit.CookieManager;
+import android.webkit.CookieSyncManager;
+import android.widget.EditText;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import com.alibaba.weex.R;
+import com.google.zxing.client.android.HttpHelper;
+import com.google.zxing.client.android.Intents;
+import com.google.zxing.client.android.LocaleManager;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ * Uses Google Book Search to find a word or phrase in the requested book.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+public final class SearchBookContentsActivity extends Activity {
+
+ private static final String TAG = SearchBookContentsActivity.class.getSimpleName();
+
+ private static final Pattern TAG_PATTERN = Pattern.compile("\\<.*?\\>");
+ private static final Pattern LT_ENTITY_PATTERN = Pattern.compile("<");
+ private static final Pattern GT_ENTITY_PATTERN = Pattern.compile(">");
+ private static final Pattern QUOTE_ENTITY_PATTERN = Pattern.compile("'");
+ private static final Pattern QUOT_ENTITY_PATTERN = Pattern.compile(""");
+
+ private String isbn;
+ private EditText queryTextView;
+ private View queryButton;
+ private ListView resultListView;
+ private TextView headerView;
+ private AsyncTask<String,?,?> networkTask;
+
+ private final View.OnClickListener buttonListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ launchSearch();
+ }
+ };
+
+ private final View.OnKeyListener keyListener = new View.OnKeyListener() {
+ @Override
+ public boolean onKey(View view, int keyCode, KeyEvent event) {
+ if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
+ launchSearch();
+ return true;
+ }
+ return false;
+ }
+ };
+
+ String getISBN() {
+ return isbn;
+ }
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ // Make sure that expired cookies are removed on launch.
+ CookieSyncManager.createInstance(this);
+ CookieManager.getInstance().removeExpiredCookie();
+
+ Intent intent = getIntent();
+ if (intent == null || !intent.getAction().equals(Intents.SearchBookContents.ACTION)) {
+ finish();
+ return;
+ }
+
+ isbn = intent.getStringExtra(Intents.SearchBookContents.ISBN);
+ if (LocaleManager.isBookSearchUrl(isbn)) {
+ setTitle(getString(R.string.sbc_name));
+ } else {
+ setTitle(getString(R.string.sbc_name) + ": ISBN " + isbn);
+ }
+
+ setContentView(R.layout.search_book_contents);
+ queryTextView = (EditText) findViewById(R.id.query_text_view);
+
+ String initialQuery = intent.getStringExtra(Intents.SearchBookContents.QUERY);
+ if (initialQuery != null && !initialQuery.isEmpty()) {
+ // Populate the search box but don't trigger the search
+ queryTextView.setText(initialQuery);
+ }
+ queryTextView.setOnKeyListener(keyListener);
+
+ queryButton = findViewById(R.id.query_button);
+ queryButton.setOnClickListener(buttonListener);
+
+ resultListView = (ListView) findViewById(R.id.result_list_view);
+ LayoutInflater factory = LayoutInflater.from(this);
+ headerView = (TextView) factory.inflate(R.layout.search_book_contents_header,
+ resultListView, false);
+ resultListView.addHeaderView(headerView);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ queryTextView.selectAll();
+ }
+
+ @Override
+ protected void onPause() {
+ AsyncTask<?,?,?> oldTask = networkTask;
+ if (oldTask != null) {
+ oldTask.cancel(true);
+ networkTask = null;
+ }
+ super.onPause();
+ }
+
+ private void launchSearch() {
+ String query = queryTextView.getText().toString();
+ if (query != null && !query.isEmpty()) {
+ AsyncTask<?,?,?> oldTask = networkTask;
+ if (oldTask != null) {
+ oldTask.cancel(true);
+ }
+ networkTask = new NetworkTask();
+ networkTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, query, isbn);
+ headerView.setText(R.string.msg_sbc_searching_book);
+ resultListView.setAdapter(null);
+ queryTextView.setEnabled(false);
+ queryButton.setEnabled(false);
+ }
+ }
+
+ private final class NetworkTask extends AsyncTask<String,Object,JSONObject> {
+
+ @Override
+ protected JSONObject doInBackground(String... args) {
+ try {
+ // These return a JSON result which describes if and where the query was found. This API may
+ // break or disappear at any time in the future. Since this is an API call rather than a
+ // website, we don't use LocaleManager to change the TLD.
+ String theQuery = args[0];
+ String theIsbn = args[1];
+ String uri;
+ if (LocaleManager.isBookSearchUrl(theIsbn)) {
+ int equals = theIsbn.indexOf('=');
+ String volumeId = theIsbn.substring(equals + 1);
+ uri = "http://www.google.com/books?id=" + volumeId + "&jscmd=SearchWithinVolume2&q=" + theQuery;
+ } else {
+ uri = "http://www.google.com/books?vid=isbn" + theIsbn + "&jscmd=SearchWithinVolume2&q=" + theQuery;
+ }
+ CharSequence content = HttpHelper.downloadViaHttp(uri, HttpHelper.ContentType.JSON);
+ return new JSONObject(content.toString());
+ } catch (IOException ioe) {
+ Log.w(TAG, "Error accessing book search", ioe);
+ return null;
+ } catch (JSONException je) {
+ Log.w(TAG, "Error accessing book search", je);
+ return null;
+ }
+ }
+
+ @Override
+ protected void onPostExecute(JSONObject result) {
+ if (result == null) {
+ headerView.setText(R.string.msg_sbc_failed);
+ } else {
+ handleSearchResults(result);
+ }
+ queryTextView.setEnabled(true);
+ queryTextView.selectAll();
+ queryButton.setEnabled(true);
+ }
+
+ // Currently there is no way to distinguish between a query which had no results and a book
+ // which is not searchable - both return zero results.
+ private void handleSearchResults(JSONObject json) {
+ try {
+ int count = json.getInt("number_of_results");
+ headerView.setText(getString(R.string.msg_sbc_results) + " : " + count);
+ if (count > 0) {
+ JSONArray results = json.getJSONArray("search_results");
+ SearchBookContentsResult.setQuery(queryTextView.getText().toString());
+ List<SearchBookContentsResult> items = new ArrayList<>(count);
+ for (int x = 0; x < count; x++) {
+ items.add(parseResult(results.getJSONObject(x)));
+ }
+ resultListView.setOnItemClickListener(new BrowseBookListener(SearchBookContentsActivity.this, items));
+ resultListView.setAdapter(new SearchBookContentsAdapter(SearchBookContentsActivity.this, items));
+ } else {
+ String searchable = json.optString("searchable");
+ if ("false".equals(searchable)) {
+ headerView.setText(R.string.msg_sbc_book_not_searchable);
+ }
+ resultListView.setAdapter(null);
+ }
+ } catch (JSONException e) {
+ Log.w(TAG, "Bad JSON from book search", e);
+ resultListView.setAdapter(null);
+ headerView.setText(R.string.msg_sbc_failed);
+ }
+ }
+
+ // Available fields: page_id, page_number, snippet_text
+ private SearchBookContentsResult parseResult(JSONObject json) {
+
+ String pageId;
+ String pageNumber;
+ String snippet;
+ try {
+ pageId = json.getString("page_id");
+ pageNumber = json.optString("page_number");
+ snippet = json.optString("snippet_text");
+ } catch (JSONException e) {
+ Log.w(TAG, e);
+ // Never seen in the wild, just being complete.
+ return new SearchBookContentsResult(getString(R.string.msg_sbc_no_page_returned), "", "", false);
+ }
+
+ if (pageNumber == null || pageNumber.isEmpty()) {
+ // This can happen for text on the jacket, and possibly other reasons.
+ pageNumber = "";
+ } else {
+ pageNumber = getString(R.string.msg_sbc_page) + ' ' + pageNumber;
+ }
+
+ boolean valid = snippet != null && !snippet.isEmpty();
+ if (valid) {
+ // Remove all HTML tags and encoded characters.
+ snippet = TAG_PATTERN.matcher(snippet).replaceAll("");
+ snippet = LT_ENTITY_PATTERN.matcher(snippet).replaceAll("<");
+ snippet = GT_ENTITY_PATTERN.matcher(snippet).replaceAll(">");
+ snippet = QUOTE_ENTITY_PATTERN.matcher(snippet).replaceAll("'");
+ snippet = QUOT_ENTITY_PATTERN.matcher(snippet).replaceAll("\"");
+ } else {
+ snippet = '(' + getString(R.string.msg_sbc_snippet_unavailable) + ')';
+ }
+
+ return new SearchBookContentsResult(pageId, pageNumber, snippet, valid);
+ }
+
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/book/SearchBookContentsAdapter.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/book/SearchBookContentsAdapter.java
new file mode 100755
index 0000000..49eaba7
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/book/SearchBookContentsAdapter.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.book;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+
+import com.alibaba.weex.R;
+
+import java.util.List;
+
+
+/**
+ * Manufactures list items which represent SBC results.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+final class SearchBookContentsAdapter extends ArrayAdapter<SearchBookContentsResult> {
+
+ SearchBookContentsAdapter(Context context, List<SearchBookContentsResult> items) {
+ super(context, R.layout.search_book_contents_list_item, 0, items);
+ }
+
+ @Override
+ public View getView(int position, View view, ViewGroup viewGroup) {
+ SearchBookContentsListItem listItem;
+
+ if (view == null) {
+ LayoutInflater factory = LayoutInflater.from(getContext());
+ listItem = (SearchBookContentsListItem) factory.inflate(
+ R.layout.search_book_contents_list_item, viewGroup, false);
+ } else {
+ if (view instanceof SearchBookContentsListItem) {
+ listItem = (SearchBookContentsListItem) view;
+ } else {
+ return view;
+ }
+ }
+
+ SearchBookContentsResult result = getItem(position);
+ listItem.set(result);
+ return listItem;
+ }
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/book/SearchBookContentsListItem.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/book/SearchBookContentsListItem.java
new file mode 100755
index 0000000..357d7ef
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/book/SearchBookContentsListItem.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.book;
+
+import android.content.Context;
+import android.graphics.Typeface;
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.style.StyleSpan;
+import android.util.AttributeSet;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.alibaba.weex.R;
+
+import java.util.Locale;
+
+
+/**
+ * A list item which displays the page number and snippet of this search result.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+public final class SearchBookContentsListItem extends LinearLayout {
+ private TextView pageNumberView;
+ private TextView snippetView;
+
+ SearchBookContentsListItem(Context context) {
+ super(context);
+ }
+
+ public SearchBookContentsListItem(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ pageNumberView = (TextView) findViewById(R.id.page_number_view);
+ snippetView = (TextView) findViewById(R.id.snippet_view);
+ }
+
+ public void set(SearchBookContentsResult result) {
+ pageNumberView.setText(result.getPageNumber());
+ String snippet = result.getSnippet();
+ if (snippet.isEmpty()) {
+ snippetView.setText("");
+ } else {
+ if (result.getValidSnippet()) {
+ String lowerQuery = SearchBookContentsResult.getQuery().toLowerCase(Locale.getDefault());
+ String lowerSnippet = snippet.toLowerCase(Locale.getDefault());
+ Spannable styledSnippet = new SpannableString(snippet);
+ StyleSpan boldSpan = new StyleSpan(Typeface.BOLD);
+ int queryLength = lowerQuery.length();
+ int offset = 0;
+ while (true) {
+ int pos = lowerSnippet.indexOf(lowerQuery, offset);
+ if (pos < 0) {
+ break;
+ }
+ styledSnippet.setSpan(boldSpan, pos, pos + queryLength, 0);
+ offset = pos + queryLength;
+ }
+ snippetView.setText(styledSnippet);
+ } else {
+ // This may be an error message, so don't try to bold the query terms within it
+ snippetView.setText(snippet);
+ }
+ }
+ }
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/book/SearchBookContentsResult.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/book/SearchBookContentsResult.java
new file mode 100755
index 0000000..ffaafb3
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/book/SearchBookContentsResult.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.book;
+
+/**
+ * The underlying data for a SBC result.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+final class SearchBookContentsResult {
+
+ private static String query = null;
+
+ private final String pageId;
+ private final String pageNumber;
+ private final String snippet;
+ private final boolean validSnippet;
+
+ SearchBookContentsResult(String pageId,
+ String pageNumber,
+ String snippet,
+ boolean validSnippet) {
+ this.pageId = pageId;
+ this.pageNumber = pageNumber;
+ this.snippet = snippet;
+ this.validSnippet = validSnippet;
+ }
+
+ public static void setQuery(String query) {
+ SearchBookContentsResult.query = query;
+ }
+
+ public String getPageId() {
+ return pageId;
+ }
+
+ public String getPageNumber() {
+ return pageNumber;
+ }
+
+ public String getSnippet() {
+ return snippet;
+ }
+
+ public boolean getValidSnippet() {
+ return validSnippet;
+ }
+
+ public static String getQuery() {
+ return query;
+ }
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/AutoFocusManager.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/AutoFocusManager.java
new file mode 100755
index 0000000..b83e7ca
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/AutoFocusManager.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2012 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.camera;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.concurrent.RejectedExecutionException;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.hardware.Camera;
+import android.os.AsyncTask;
+import android.preference.PreferenceManager;
+import android.util.Log;
+
+import com.google.zxing.client.android.PreferencesActivity;
+
+final class AutoFocusManager implements Camera.AutoFocusCallback {
+
+ private static final String TAG = AutoFocusManager.class.getSimpleName();
+
+ private static final long AUTO_FOCUS_INTERVAL_MS = 2000L;
+ private static final Collection<String> FOCUS_MODES_CALLING_AF;
+ static {
+ FOCUS_MODES_CALLING_AF = new ArrayList<>(2);
+ FOCUS_MODES_CALLING_AF.add(Camera.Parameters.FOCUS_MODE_AUTO);
+ FOCUS_MODES_CALLING_AF.add(Camera.Parameters.FOCUS_MODE_MACRO);
+ }
+
+ private boolean stopped;
+ private boolean focusing;
+ private final boolean useAutoFocus;
+ private final Camera camera;
+ private AsyncTask<?,?,?> outstandingTask;
+
+ AutoFocusManager(Context context, Camera camera) {
+ this.camera = camera;
+ SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
+ String currentFocusMode = camera.getParameters().getFocusMode();
+ useAutoFocus =
+ sharedPrefs.getBoolean(PreferencesActivity.KEY_AUTO_FOCUS, true) &&
+ FOCUS_MODES_CALLING_AF.contains(currentFocusMode);
+ Log.i(TAG, "Current focus mode '" + currentFocusMode + "'; use auto focus? " + useAutoFocus);
+ start();
+ }
+
+ @Override
+ public synchronized void onAutoFocus(boolean success, Camera theCamera) {
+ focusing = false;
+ autoFocusAgainLater();
+ }
+
+ private synchronized void autoFocusAgainLater() {
+ if (!stopped && outstandingTask == null) {
+ AutoFocusTask newTask = new AutoFocusTask();
+ try {
+ newTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ outstandingTask = newTask;
+ } catch (RejectedExecutionException ree) {
+ Log.w(TAG, "Could not request auto focus", ree);
+ }
+ }
+ }
+
+ synchronized void start() {
+ if (useAutoFocus) {
+ outstandingTask = null;
+ if (!stopped && !focusing) {
+ try {
+ camera.autoFocus(this);
+ focusing = true;
+ } catch (RuntimeException re) {
+ // Have heard RuntimeException reported in Android 4.0.x+; continue?
+ Log.w(TAG, "Unexpected exception while focusing", re);
+ // Try again later to keep cycle going
+ autoFocusAgainLater();
+ }
+ }
+ }
+ }
+
+ private synchronized void cancelOutstandingTask() {
+ if (outstandingTask != null) {
+ if (outstandingTask.getStatus() != AsyncTask.Status.FINISHED) {
+ outstandingTask.cancel(true);
+ }
+ outstandingTask = null;
+ }
+ }
+
+ synchronized void stop() {
+ stopped = true;
+ if (useAutoFocus) {
+ cancelOutstandingTask();
+ // Doesn't hurt to call this even if not focusing
+ try {
+ camera.cancelAutoFocus();
+ } catch (RuntimeException re) {
+ // Have heard RuntimeException reported in Android 4.0.x+; continue?
+ Log.w(TAG, "Unexpected exception while cancelling focusing", re);
+ }
+ }
+ }
+
+ private final class AutoFocusTask extends AsyncTask<Object,Object,Object> {
+ @Override
+ protected Object doInBackground(Object... voids) {
+ try {
+ Thread.sleep(AUTO_FOCUS_INTERVAL_MS);
+ } catch (InterruptedException e) {
+ // continue
+ }
+ start();
+ return null;
+ }
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/CameraConfigurationManager.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/CameraConfigurationManager.java
new file mode 100755
index 0000000..45af1a0
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/CameraConfigurationManager.java
@@ -0,0 +1,252 @@
+/*
+ * Copyright (C) 2010 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.camera;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.graphics.Point;
+import android.hardware.Camera;
+import android.preference.PreferenceManager;
+import android.util.Log;
+import android.view.Display;
+import android.view.Surface;
+import android.view.WindowManager;
+
+import com.google.zxing.client.android.PreferencesActivity;
+import com.google.zxing.client.android.camera.open.CameraFacing;
+import com.google.zxing.client.android.camera.open.OpenCamera;
+
+/**
+ * A class which deals with reading, parsing, and setting the camera parameters which are used to
+ * configure the camera hardware.
+ */
+final class CameraConfigurationManager {
+
+ private static final String TAG = "CameraConfiguration";
+
+ private final Context context;
+ private int cwNeededRotation;
+ private int cwRotationFromDisplayToCamera;
+ private Point screenResolution;
+ private Point cameraResolution;
+ private Point bestPreviewSize;
+ private Point previewSizeOnScreen;
+
+ CameraConfigurationManager(Context context) {
+ this.context = context;
+ }
+
+ /**
+ * Reads, one time, values from the camera that are needed by the app.
+ */
+ void initFromCameraParameters(OpenCamera camera) {
+ Camera.Parameters parameters = camera.getCamera().getParameters();
+ WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
+ Display display = manager.getDefaultDisplay();
+
+ int displayRotation = display.getRotation();
+ int cwRotationFromNaturalToDisplay;
+ switch (displayRotation) {
+ case Surface.ROTATION_0:
+ cwRotationFromNaturalToDisplay = 0;
+ break;
+ case Surface.ROTATION_90:
+ cwRotationFromNaturalToDisplay = 90;
+ break;
+ case Surface.ROTATION_180:
+ cwRotationFromNaturalToDisplay = 180;
+ break;
+ case Surface.ROTATION_270:
+ cwRotationFromNaturalToDisplay = 270;
+ break;
+ default:
+ // Have seen this return incorrect values like -90
+ if (displayRotation % 90 == 0) {
+ cwRotationFromNaturalToDisplay = (360 + displayRotation) % 360;
+ } else {
+ throw new IllegalArgumentException("Bad rotation: " + displayRotation);
+ }
+ }
+ Log.i(TAG, "Display at: " + cwRotationFromNaturalToDisplay);
+
+ int cwRotationFromNaturalToCamera = camera.getOrientation();
+ Log.i(TAG, "Camera at: " + cwRotationFromNaturalToCamera);
+
+ // Still not 100% sure about this. But acts like we need to flip this:
+ if (camera.getFacing() == CameraFacing.FRONT) {
+ cwRotationFromNaturalToCamera = (360 - cwRotationFromNaturalToCamera) % 360;
+ Log.i(TAG, "Front camera overriden to: " + cwRotationFromNaturalToCamera);
+ }
+
+ /*
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ String overrideRotationString;
+ if (camera.getFacing() == CameraFacing.FRONT) {
+ overrideRotationString = prefs.getString(PreferencesActivity.KEY_FORCE_CAMERA_ORIENTATION_FRONT, null);
+ } else {
+ overrideRotationString = prefs.getString(PreferencesActivity.KEY_FORCE_CAMERA_ORIENTATION, null);
+ }
+ if (overrideRotationString != null && !"-".equals(overrideRotationString)) {
+ Log.i(TAG, "Overriding camera manually to " + overrideRotationString);
+ cwRotationFromNaturalToCamera = Integer.parseInt(overrideRotationString);
+ }
+ */
+
+ cwRotationFromDisplayToCamera =
+ (360 + cwRotationFromNaturalToCamera - cwRotationFromNaturalToDisplay) % 360;
+ Log.i(TAG, "Final display orientation: " + cwRotationFromDisplayToCamera);
+ if (camera.getFacing() == CameraFacing.FRONT) {
+ Log.i(TAG, "Compensating rotation for front camera");
+ cwNeededRotation = (360 - cwRotationFromDisplayToCamera) % 360;
+ } else {
+ cwNeededRotation = cwRotationFromDisplayToCamera;
+ }
+ Log.i(TAG, "Clockwise rotation from display to camera: " + cwNeededRotation);
+
+ Point theScreenResolution = new Point();
+ display.getSize(theScreenResolution);
+ screenResolution = theScreenResolution;
+ Log.i(TAG, "Screen resolution in current orientation: " + screenResolution);
+ cameraResolution = CameraConfigurationUtils.findBestPreviewSizeValue(parameters, screenResolution);
+ Log.i(TAG, "Camera resolution: " + cameraResolution);
+ bestPreviewSize = CameraConfigurationUtils.findBestPreviewSizeValue(parameters, screenResolution);
+ Log.i(TAG, "Best available preview size: " + bestPreviewSize);
+
+ boolean isScreenPortrait = screenResolution.x < screenResolution.y;
+ boolean isPreviewSizePortrait = bestPreviewSize.x < bestPreviewSize.y;
+
+ if (isScreenPortrait == isPreviewSizePortrait) {
+ previewSizeOnScreen = bestPreviewSize;
+ } else {
+ previewSizeOnScreen = new Point(bestPreviewSize.y, bestPreviewSize.x);
+ }
+ Log.i(TAG, "Preview size on screen: " + previewSizeOnScreen);
+ }
+
+ void setDesiredCameraParameters(OpenCamera camera, boolean safeMode) {
+
+ Camera theCamera = camera.getCamera();
+ Camera.Parameters parameters = theCamera.getParameters();
+
+ if (parameters == null) {
+ Log.w(TAG, "Device error: no camera parameters are available. Proceeding without configuration.");
+ return;
+ }
+
+ Log.i(TAG, "Initial camera parameters: " + parameters.flatten());
+
+ if (safeMode) {
+ Log.w(TAG, "In camera config safe mode -- most settings will not be honored");
+ }
+
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+
+ initializeTorch(parameters, prefs, safeMode);
+
+ CameraConfigurationUtils.setFocus(
+ parameters,
+ prefs.getBoolean(PreferencesActivity.KEY_AUTO_FOCUS, true),
+ prefs.getBoolean(PreferencesActivity.KEY_DISABLE_CONTINUOUS_FOCUS, true),
+ safeMode);
+
+ if (!safeMode) {
+ if (prefs.getBoolean(PreferencesActivity.KEY_INVERT_SCAN, false)) {
+ CameraConfigurationUtils.setInvertColor(parameters);
+ }
+
+ if (!prefs.getBoolean(PreferencesActivity.KEY_DISABLE_BARCODE_SCENE_MODE, true)) {
+ CameraConfigurationUtils.setBarcodeSceneMode(parameters);
+ }
+
+ if (!prefs.getBoolean(PreferencesActivity.KEY_DISABLE_METERING, true)) {
+ CameraConfigurationUtils.setVideoStabilization(parameters);
+ CameraConfigurationUtils.setFocusArea(parameters);
+ CameraConfigurationUtils.setMetering(parameters);
+ }
+
+ }
+
+ parameters.setPreviewSize(bestPreviewSize.x, bestPreviewSize.y);
+
+ theCamera.setDisplayOrientation(90);
+ theCamera.setParameters(parameters);
+
+ theCamera.setDisplayOrientation(cwRotationFromDisplayToCamera);
+
+ Camera.Parameters afterParameters = theCamera.getParameters();
+ Camera.Size afterSize = afterParameters.getPreviewSize();
+ if (afterSize != null && (bestPreviewSize.x != afterSize.width || bestPreviewSize.y != afterSize.height)) {
+ Log.w(TAG, "Camera said it supported preview size " + bestPreviewSize.x + 'x' + bestPreviewSize.y +
+ ", but after setting it, preview size is " + afterSize.width + 'x' + afterSize.height);
+ bestPreviewSize.x = afterSize.width;
+ bestPreviewSize.y = afterSize.height;
+ }
+ }
+
+ Point getBestPreviewSize() {
+ return bestPreviewSize;
+ }
+
+ Point getPreviewSizeOnScreen() {
+ return previewSizeOnScreen;
+ }
+
+ Point getCameraResolution() {
+ return cameraResolution;
+ }
+
+ Point getScreenResolution() {
+ return screenResolution;
+ }
+
+ int getCWNeededRotation() {
+ return cwNeededRotation;
+ }
+
+ boolean getTorchState(Camera camera) {
+ if (camera != null) {
+ Camera.Parameters parameters = camera.getParameters();
+ if (parameters != null) {
+ String flashMode = camera.getParameters().getFlashMode();
+ return flashMode != null &&
+ (Camera.Parameters.FLASH_MODE_ON.equals(flashMode) ||
+ Camera.Parameters.FLASH_MODE_TORCH.equals(flashMode));
+ }
+ }
+ return false;
+ }
+
+ void setTorch(Camera camera, boolean newSetting) {
+ Camera.Parameters parameters = camera.getParameters();
+ doSetTorch(parameters, newSetting, false);
+ camera.setParameters(parameters);
+ }
+
+ private void initializeTorch(Camera.Parameters parameters, SharedPreferences prefs, boolean safeMode) {
+ boolean currentSetting = FrontLightMode.readPref(prefs) == FrontLightMode.ON;
+ doSetTorch(parameters, currentSetting, safeMode);
+ }
+
+ private void doSetTorch(Camera.Parameters parameters, boolean newSetting, boolean safeMode) {
+ CameraConfigurationUtils.setTorch(parameters, newSetting);
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ if (!safeMode && !prefs.getBoolean(PreferencesActivity.KEY_DISABLE_EXPOSURE, true)) {
+ CameraConfigurationUtils.setBestExposure(parameters, newSetting);
+ }
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/CameraConfigurationUtils.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/CameraConfigurationUtils.java
new file mode 100755
index 0000000..32260a1
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/CameraConfigurationUtils.java
@@ -0,0 +1,447 @@
+/*
+ * Copyright (C) 2014 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.camera;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.regex.Pattern;
+
+import android.annotation.TargetApi;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.hardware.Camera;
+import android.os.Build;
+import android.util.Log;
+
+/**
+ * Utility methods for configuring the Android camera.
+ *
+ * @author Sean Owen
+ */
+@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
+public final class CameraConfigurationUtils {
+
+ private static final String TAG = "CameraConfiguration";
+
+ private static final Pattern SEMICOLON = Pattern.compile(";");
+
+ private static final int MIN_PREVIEW_PIXELS = 480 * 320; // normal screen
+ private static final float MAX_EXPOSURE_COMPENSATION = 1.5f;
+ private static final float MIN_EXPOSURE_COMPENSATION = 0.0f;
+ private static final double MAX_ASPECT_DISTORTION = 0.15;
+ private static final int MIN_FPS = 10;
+ private static final int MAX_FPS = 20;
+ private static final int AREA_PER_1000 = 400;
+
+ private CameraConfigurationUtils() {
+ }
+
+ public static void setFocus(Camera.Parameters parameters,
+ boolean autoFocus,
+ boolean disableContinuous,
+ boolean safeMode) {
+ List<String> supportedFocusModes = parameters.getSupportedFocusModes();
+ String focusMode = null;
+ if (autoFocus) {
+ if (safeMode || disableContinuous) {
+ focusMode = findSettableValue("focus mode",
+ supportedFocusModes,
+ Camera.Parameters.FOCUS_MODE_AUTO);
+ } else {
+ focusMode = findSettableValue("focus mode",
+ supportedFocusModes,
+ Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE,
+ Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO,
+ Camera.Parameters.FOCUS_MODE_AUTO);
+ }
+ }
+ // Maybe selected auto-focus but not available, so fall through here:
+ if (!safeMode && focusMode == null) {
+ focusMode = findSettableValue("focus mode",
+ supportedFocusModes,
+ Camera.Parameters.FOCUS_MODE_MACRO,
+ Camera.Parameters.FOCUS_MODE_EDOF);
+ }
+ if (focusMode != null) {
+ if (focusMode.equals(parameters.getFocusMode())) {
+ Log.i(TAG, "Focus mode already set to " + focusMode);
+ } else {
+ parameters.setFocusMode(focusMode);
+ }
+ }
+ }
+
+ public static void setTorch(Camera.Parameters parameters, boolean on) {
+ List<String> supportedFlashModes = parameters.getSupportedFlashModes();
+ String flashMode;
+ if (on) {
+ flashMode = findSettableValue("flash mode",
+ supportedFlashModes,
+ Camera.Parameters.FLASH_MODE_TORCH,
+ Camera.Parameters.FLASH_MODE_ON);
+ } else {
+ flashMode = findSettableValue("flash mode",
+ supportedFlashModes,
+ Camera.Parameters.FLASH_MODE_OFF);
+ }
+ if (flashMode != null) {
+ if (flashMode.equals(parameters.getFlashMode())) {
+ Log.i(TAG, "Flash mode already set to " + flashMode);
+ } else {
+ Log.i(TAG, "Setting flash mode to " + flashMode);
+ parameters.setFlashMode(flashMode);
+ }
+ }
+ }
+
+ public static void setBestExposure(Camera.Parameters parameters, boolean lightOn) {
+ int minExposure = parameters.getMinExposureCompensation();
+ int maxExposure = parameters.getMaxExposureCompensation();
+ float step = parameters.getExposureCompensationStep();
+ if ((minExposure != 0 || maxExposure != 0) && step > 0.0f) {
+ // Set low when light is on
+ float targetCompensation = lightOn ? MIN_EXPOSURE_COMPENSATION : MAX_EXPOSURE_COMPENSATION;
+ int compensationSteps = Math.round(targetCompensation / step);
+ float actualCompensation = step * compensationSteps;
+ // Clamp value:
+ compensationSteps = Math.max(Math.min(compensationSteps, maxExposure), minExposure);
+ if (parameters.getExposureCompensation() == compensationSteps) {
+ Log.i(TAG, "Exposure compensation already set to " + compensationSteps + " / " + actualCompensation);
+ } else {
+ Log.i(TAG, "Setting exposure compensation to " + compensationSteps + " / " + actualCompensation);
+ parameters.setExposureCompensation(compensationSteps);
+ }
+ } else {
+ Log.i(TAG, "Camera does not support exposure compensation");
+ }
+ }
+
+ public static void setBestPreviewFPS(Camera.Parameters parameters) {
+ setBestPreviewFPS(parameters, MIN_FPS, MAX_FPS);
+ }
+
+ public static void setBestPreviewFPS(Camera.Parameters parameters, int minFPS, int maxFPS) {
+ List<int[]> supportedPreviewFpsRanges = parameters.getSupportedPreviewFpsRange();
+ Log.i(TAG, "Supported FPS ranges: " + toString(supportedPreviewFpsRanges));
+ if (supportedPreviewFpsRanges != null && !supportedPreviewFpsRanges.isEmpty()) {
+ int[] suitableFPSRange = null;
+ for (int[] fpsRange : supportedPreviewFpsRanges) {
+ int thisMin = fpsRange[Camera.Parameters.PREVIEW_FPS_MIN_INDEX];
+ int thisMax = fpsRange[Camera.Parameters.PREVIEW_FPS_MAX_INDEX];
+ if (thisMin >= minFPS * 1000 && thisMax <= maxFPS * 1000) {
+ suitableFPSRange = fpsRange;
+ break;
+ }
+ }
+ if (suitableFPSRange == null) {
+ Log.i(TAG, "No suitable FPS range?");
+ } else {
+ int[] currentFpsRange = new int[2];
+ parameters.getPreviewFpsRange(currentFpsRange);
+ if (Arrays.equals(currentFpsRange, suitableFPSRange)) {
+ Log.i(TAG, "FPS range already set to " + Arrays.toString(suitableFPSRange));
+ } else {
+ Log.i(TAG, "Setting FPS range to " + Arrays.toString(suitableFPSRange));
+ parameters.setPreviewFpsRange(suitableFPSRange[Camera.Parameters.PREVIEW_FPS_MIN_INDEX],
+ suitableFPSRange[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]);
+ }
+ }
+ }
+ }
+
+ public static void setFocusArea(Camera.Parameters parameters) {
+ if (parameters.getMaxNumFocusAreas() > 0) {
+ Log.i(TAG, "Old focus areas: " + toString(parameters.getFocusAreas()));
+ List<Camera.Area> middleArea = buildMiddleArea(AREA_PER_1000);
+ Log.i(TAG, "Setting focus area to : " + toString(middleArea));
+ parameters.setFocusAreas(middleArea);
+ } else {
+ Log.i(TAG, "Device does not support focus areas");
+ }
+ }
+
+ public static void setMetering(Camera.Parameters parameters) {
+ if (parameters.getMaxNumMeteringAreas() > 0) {
+ Log.i(TAG, "Old metering areas: " + parameters.getMeteringAreas());
+ List<Camera.Area> middleArea = buildMiddleArea(AREA_PER_1000);
+ Log.i(TAG, "Setting metering area to : " + toString(middleArea));
+ parameters.setMeteringAreas(middleArea);
+ } else {
+ Log.i(TAG, "Device does not support metering areas");
+ }
+ }
+
+ private static List<Camera.Area> buildMiddleArea(int areaPer1000) {
+ return Collections.singletonList(
+ new Camera.Area(new Rect(-areaPer1000, -areaPer1000, areaPer1000, areaPer1000), 1));
+ }
+
+ public static void setVideoStabilization(Camera.Parameters parameters) {
+ if (parameters.isVideoStabilizationSupported()) {
+ if (parameters.getVideoStabilization()) {
+ Log.i(TAG, "Video stabilization already enabled");
+ } else {
+ Log.i(TAG, "Enabling video stabilization...");
+ parameters.setVideoStabilization(true);
+ }
+ } else {
+ Log.i(TAG, "This device does not support video stabilization");
+ }
+ }
+
+ public static void setBarcodeSceneMode(Camera.Parameters parameters) {
+ if (Camera.Parameters.SCENE_MODE_BARCODE.equals(parameters.getSceneMode())) {
+ Log.i(TAG, "Barcode scene mode already set");
+ return;
+ }
+ String sceneMode = findSettableValue("scene mode",
+ parameters.getSupportedSceneModes(),
+ Camera.Parameters.SCENE_MODE_BARCODE);
+ if (sceneMode != null) {
+ parameters.setSceneMode(sceneMode);
+ }
+ }
+
+ public static void setZoom(Camera.Parameters parameters, double targetZoomRatio) {
+ if (parameters.isZoomSupported()) {
+ Integer zoom = indexOfClosestZoom(parameters, targetZoomRatio);
+ if (zoom == null) {
+ return;
+ }
+ if (parameters.getZoom() == zoom) {
+ Log.i(TAG, "Zoom is already set to " + zoom);
+ } else {
+ Log.i(TAG, "Setting zoom to " + zoom);
+ parameters.setZoom(zoom);
+ }
+ } else {
+ Log.i(TAG, "Zoom is not supported");
+ }
+ }
+
+ private static Integer indexOfClosestZoom(Camera.Parameters parameters, double targetZoomRatio) {
+ List<Integer> ratios = parameters.getZoomRatios();
+ Log.i(TAG, "Zoom ratios: " + ratios);
+ int maxZoom = parameters.getMaxZoom();
+ if (ratios == null || ratios.isEmpty() || ratios.size() != maxZoom + 1) {
+ Log.w(TAG, "Invalid zoom ratios!");
+ return null;
+ }
+ double target100 = 100.0 * targetZoomRatio;
+ double smallestDiff = Double.POSITIVE_INFINITY;
+ int closestIndex = 0;
+ for (int i = 0; i < ratios.size(); i++) {
+ double diff = Math.abs(ratios.get(i) - target100);
+ if (diff < smallestDiff) {
+ smallestDiff = diff;
+ closestIndex = i;
+ }
+ }
+ Log.i(TAG, "Chose zoom ratio of " + (ratios.get(closestIndex) / 100.0));
+ return closestIndex;
+ }
+
+ public static void setInvertColor(Camera.Parameters parameters) {
+ if (Camera.Parameters.EFFECT_NEGATIVE.equals(parameters.getColorEffect())) {
+ Log.i(TAG, "Negative effect already set");
+ return;
+ }
+ String colorMode = findSettableValue("color effect",
+ parameters.getSupportedColorEffects(),
+ Camera.Parameters.EFFECT_NEGATIVE);
+ if (colorMode != null) {
+ parameters.setColorEffect(colorMode);
+ }
+ }
+
+ public static Point findBestPreviewSizeValue(Camera.Parameters parameters, Point screenResolution) {
+
+ List<Camera.Size> rawSupportedSizes = parameters.getSupportedPreviewSizes();
+ if (rawSupportedSizes == null) {
+ Log.w(TAG, "Device returned no supported preview sizes; using default");
+ Camera.Size defaultSize = parameters.getPreviewSize();
+ if (defaultSize == null) {
+ throw new IllegalStateException("Parameters contained no preview size!");
+ }
+ return new Point(defaultSize.width, defaultSize.height);
+ }
+
+ // Sort by size, descending
+ List<Camera.Size> supportedPreviewSizes = new ArrayList<Camera.Size>(rawSupportedSizes);
+ Collections.sort(supportedPreviewSizes, new Comparator<Camera.Size>() {
+ @Override
+ public int compare(Camera.Size a, Camera.Size b) {
+ int aPixels = a.height * a.width;
+ int bPixels = b.height * b.width;
+ if (bPixels < aPixels) {
+ return -1;
+ }
+ if (bPixels > aPixels) {
+ return 1;
+ }
+ return 0;
+ }
+ });
+
+ if (Log.isLoggable(TAG, Log.INFO)) {
+ StringBuilder previewSizesString = new StringBuilder();
+ for (Camera.Size supportedPreviewSize : supportedPreviewSizes) {
+ previewSizesString.append(supportedPreviewSize.width).append('x')
+ .append(supportedPreviewSize.height).append(' ');
+ }
+ Log.i(TAG, "Supported preview sizes: " + previewSizesString);
+ }
+
+ double screenAspectRatio = (double) screenResolution.x / (double) screenResolution.y;
+
+ // Remove sizes that are unsuitable
+ Iterator<Camera.Size> it = supportedPreviewSizes.iterator();
+ while (it.hasNext()) {
+ Camera.Size supportedPreviewSize = it.next();
+ int realWidth = supportedPreviewSize.width;
+ int realHeight = supportedPreviewSize.height;
+ if (realWidth * realHeight < MIN_PREVIEW_PIXELS) {
+ it.remove();
+ continue;
+ }
+
+ boolean isCandidatePortrait = realWidth < realHeight;
+ int maybeFlippedWidth = isCandidatePortrait ? realHeight : realWidth;
+ int maybeFlippedHeight = isCandidatePortrait ? realWidth : realHeight;
+ double aspectRatio = (double) maybeFlippedWidth / (double) maybeFlippedHeight;
+ double distortion = Math.abs(aspectRatio - screenAspectRatio);
+ if (distortion > MAX_ASPECT_DISTORTION) {
+ it.remove();
+ continue;
+ }
+
+ if (maybeFlippedWidth == screenResolution.x && maybeFlippedHeight == screenResolution.y) {
+ Point exactPoint = new Point(realWidth, realHeight);
+ Log.i(TAG, "Found preview size exactly matching screen size: " + exactPoint);
+ return exactPoint;
+ }
+ }
+
+ // If no exact match, use largest preview size. This was not a great idea on older devices because
+ // of the additional computation needed. We're likely to get here on newer Android 4+ devices, where
+ // the CPU is much more powerful.
+ if (!supportedPreviewSizes.isEmpty()) {
+ Camera.Size largestPreview = supportedPreviewSizes.get(0);
+ Point largestSize = new Point(largestPreview.width, largestPreview.height);
+ Log.i(TAG, "Using largest suitable preview size: " + largestSize);
+ return largestSize;
+ }
+
+ // If there is nothing at all suitable, return current preview size
+ Camera.Size defaultPreview = parameters.getPreviewSize();
+ if (defaultPreview == null) {
+ throw new IllegalStateException("Parameters contained no preview size!");
+ }
+ Point defaultSize = new Point(defaultPreview.width, defaultPreview.height);
+ Log.i(TAG, "No suitable preview sizes, using default: " + defaultSize);
+ return defaultSize;
+ }
+
+ private static String findSettableValue(String name,
+ Collection<String> supportedValues,
+ String... desiredValues) {
+ Log.i(TAG, "Requesting " + name + " value from among: " + Arrays.toString(desiredValues));
+ Log.i(TAG, "Supported " + name + " values: " + supportedValues);
+ if (supportedValues != null) {
+ for (String desiredValue : desiredValues) {
+ if (supportedValues.contains(desiredValue)) {
+ Log.i(TAG, "Can set " + name + " to: " + desiredValue);
+ return desiredValue;
+ }
+ }
+ }
+ Log.i(TAG, "No supported values match");
+ return null;
+ }
+
+ private static String toString(Collection<int[]> arrays) {
+ if (arrays == null || arrays.isEmpty()) {
+ return "[]";
+ }
+ StringBuilder buffer = new StringBuilder();
+ buffer.append('[');
+ Iterator<int[]> it = arrays.iterator();
+ while (it.hasNext()) {
+ buffer.append(Arrays.toString(it.next()));
+ if (it.hasNext()) {
+ buffer.append(", ");
+ }
+ }
+ buffer.append(']');
+ return buffer.toString();
+ }
+
+ private static String toString(Iterable<Camera.Area> areas) {
+ if (areas == null) {
+ return null;
+ }
+ StringBuilder result = new StringBuilder();
+ for (Camera.Area area : areas) {
+ result.append(area.rect).append(':').append(area.weight).append(' ');
+ }
+ return result.toString();
+ }
+
+ public static String collectStats(Camera.Parameters parameters) {
+ return collectStats(parameters.flatten());
+ }
+
+ public static String collectStats(CharSequence flattenedParams) {
+ StringBuilder result = new StringBuilder(1000);
+
+ result.append("BOARD=").append(Build.BOARD).append('\n');
+ result.append("BRAND=").append(Build.BRAND).append('\n');
+ result.append("CPU_ABI=").append(Build.CPU_ABI).append('\n');
+ result.append("DEVICE=").append(Build.DEVICE).append('\n');
+ result.append("DISPLAY=").append(Build.DISPLAY).append('\n');
+ result.append("FINGERPRINT=").append(Build.FINGERPRINT).append('\n');
+ result.append("HOST=").append(Build.HOST).append('\n');
+ result.append("ID=").append(Build.ID).append('\n');
+ result.append("MANUFACTURER=").append(Build.MANUFACTURER).append('\n');
+ result.append("MODEL=").append(Build.MODEL).append('\n');
+ result.append("PRODUCT=").append(Build.PRODUCT).append('\n');
+ result.append("TAGS=").append(Build.TAGS).append('\n');
+ result.append("TIME=").append(Build.TIME).append('\n');
+ result.append("TYPE=").append(Build.TYPE).append('\n');
+ result.append("USER=").append(Build.USER).append('\n');
+ result.append("VERSION.CODENAME=").append(Build.VERSION.CODENAME).append('\n');
+ result.append("VERSION.INCREMENTAL=").append(Build.VERSION.INCREMENTAL).append('\n');
+ result.append("VERSION.RELEASE=").append(Build.VERSION.RELEASE).append('\n');
+ result.append("VERSION.SDK_INT=").append(Build.VERSION.SDK_INT).append('\n');
+
+ if (flattenedParams != null) {
+ String[] params = SEMICOLON.split(flattenedParams);
+ Arrays.sort(params);
+ for (String param : params) {
+ result.append(param).append('\n');
+ }
+ }
+
+ return result.toString();
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/CameraManager.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/CameraManager.java
new file mode 100755
index 0000000..110f661
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/CameraManager.java
@@ -0,0 +1,338 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.camera;
+
+import java.io.IOException;
+
+import android.content.Context;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.hardware.Camera;
+import android.os.Handler;
+import android.util.Log;
+import android.view.SurfaceHolder;
+
+import com.google.zxing.PlanarYUVLuminanceSource;
+import com.google.zxing.client.android.camera.open.OpenCamera;
+import com.google.zxing.client.android.camera.open.OpenCameraInterface;
+
+/**
+ * This object wraps the Camera service object and expects to be the only one talking to it. The
+ * implementation encapsulates the steps needed to take preview-sized images, which are used for
+ * both preview and decoding.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+public final class CameraManager {
+
+ private static final String TAG = CameraManager.class.getSimpleName();
+
+ private static final int MIN_FRAME_WIDTH = 240;
+ private static final int MIN_FRAME_HEIGHT = 240;
+ private static final int MAX_FRAME_WIDTH = 1200; // = 5/8 * 1920
+ private static final int MAX_FRAME_HEIGHT = 675; // = 5/8 * 1080
+
+ private final Context context;
+ private final CameraConfigurationManager configManager;
+ private OpenCamera camera;
+ private AutoFocusManager autoFocusManager;
+ private Rect framingRect;
+ private Rect framingRectInPreview;
+ private boolean initialized;
+ private boolean previewing;
+ private int requestedCameraId = OpenCameraInterface.NO_REQUESTED_CAMERA;
+ private int requestedFramingRectWidth;
+ private int requestedFramingRectHeight;
+ /**
+ * Preview frames are delivered here, which we pass on to the registered handler. Make sure to
+ * clear the handler so it will only receive one message.
+ */
+ private final PreviewCallback previewCallback;
+
+ public CameraManager(Context context) {
+ this.context = context;
+ this.configManager = new CameraConfigurationManager(context);
+ previewCallback = new PreviewCallback(configManager);
+ }
+
+ /**
+ * Opens the camera driver and initializes the hardware parameters.
+ *
+ * @param holder The surface object which the camera will draw preview frames into.
+ * @throws IOException Indicates the camera driver failed to open.
+ */
+ public synchronized void openDriver(SurfaceHolder holder) throws IOException {
+ OpenCamera theCamera = camera;
+ if (theCamera == null) {
+ theCamera = OpenCameraInterface.open(requestedCameraId);
+ if (theCamera == null) {
+ throw new IOException("Camera.open() failed to return object from driver");
+ }
+ camera = theCamera;
+ }
+
+ if (!initialized) {
+ initialized = true;
+ configManager.initFromCameraParameters(theCamera);
+ if (requestedFramingRectWidth > 0 && requestedFramingRectHeight > 0) {
+ setManualFramingRect(requestedFramingRectWidth, requestedFramingRectHeight);
+ requestedFramingRectWidth = 0;
+ requestedFramingRectHeight = 0;
+ }
+ }
+
+ Camera cameraObject = theCamera.getCamera();
+ Camera.Parameters parameters = cameraObject.getParameters();
+ String parametersFlattened = parameters == null ? null : parameters.flatten(); // Save these, temporarily
+ try {
+ configManager.setDesiredCameraParameters(theCamera, false);
+ } catch (RuntimeException re) {
+ // Driver failed
+ Log.w(TAG, "Camera rejected parameters. Setting only minimal safe-mode parameters");
+ Log.i(TAG, "Resetting to saved camera params: " + parametersFlattened);
+ // Reset:
+ if (parametersFlattened != null) {
+ parameters = cameraObject.getParameters();
+ parameters.unflatten(parametersFlattened);
+ try {
+ cameraObject.setParameters(parameters);
+ configManager.setDesiredCameraParameters(theCamera, true);
+ } catch (RuntimeException re2) {
+ // Well, darn. Give up
+ Log.w(TAG, "Camera rejected even safe-mode parameters! No configuration");
+ }
+ }
+ }
+ cameraObject.setPreviewDisplay(holder);
+
+ }
+
+ public synchronized boolean isOpen() {
+ return camera != null;
+ }
+
+ /**
+ * Closes the camera driver if still in use.
+ */
+ public synchronized void closeDriver() {
+ if (camera != null) {
+ camera.getCamera().release();
+ camera = null;
+ // Make sure to clear these each time we close the camera, so that any scanning rect
+ // requested by intent is forgotten.
+ framingRect = null;
+ framingRectInPreview = null;
+ }
+ }
+
+ /**
+ * Asks the camera hardware to begin drawing preview frames to the screen.
+ */
+ public synchronized void startPreview() {
+ OpenCamera theCamera = camera;
+ if (theCamera != null && !previewing) {
+ theCamera.getCamera().startPreview();
+ previewing = true;
+ autoFocusManager = new AutoFocusManager(context, theCamera.getCamera());
+ }
+ }
+
+ /**
+ * Tells the camera to stop drawing preview frames.
+ */
+ public synchronized void stopPreview() {
+ if (autoFocusManager != null) {
+ autoFocusManager.stop();
+ autoFocusManager = null;
+ }
+ if (camera != null && previewing) {
+ camera.getCamera().stopPreview();
+ previewCallback.setHandler(null, 0);
+ previewing = false;
+ }
+ }
+
+ /**
+ * Convenience method for {@link com.google.zxing.client.android.CaptureActivity}
+ *
+ * @param newSetting if {@code true}, light should be turned on if currently off. And vice versa.
+ */
+ public synchronized void setTorch(boolean newSetting) {
+ OpenCamera theCamera = camera;
+ if (theCamera != null) {
+ if (newSetting != configManager.getTorchState(theCamera.getCamera())) {
+ boolean wasAutoFocusManager = autoFocusManager != null;
+ if (wasAutoFocusManager) {
+ autoFocusManager.stop();
+ autoFocusManager = null;
+ }
+ configManager.setTorch(theCamera.getCamera(), newSetting);
+ if (wasAutoFocusManager) {
+ autoFocusManager = new AutoFocusManager(context, theCamera.getCamera());
+ autoFocusManager.start();
+ }
+ }
+ }
+ }
+
+ /**
+ * A single preview frame will be returned to the handler supplied. The data will arrive as byte[]
+ * in the message.obj field, with width and height encoded as message.arg1 and message.arg2,
+ * respectively.
+ *
+ * @param handler The handler to send the message to.
+ * @param message The what field of the message to be sent.
+ */
+ public synchronized void requestPreviewFrame(Handler handler, int message) {
+ OpenCamera theCamera = camera;
+ if (theCamera != null && previewing) {
+ previewCallback.setHandler(handler, message);
+ theCamera.getCamera().setOneShotPreviewCallback(previewCallback);
+ }
+ }
+
+ /**
+ * Calculates the framing rect which the UI should draw to show the user where to place the
+ * barcode. This target helps with alignment as well as forces the user to hold the device
+ * far enough away to ensure the image will be in focus.
+ *
+ * @return The rectangle to draw on screen in window coordinates.
+ */
+ public synchronized Rect getFramingRect() {
+ if (framingRect == null) {
+ if (camera == null) {
+ return null;
+ }
+ Point screenResolution = configManager.getScreenResolution();
+ if (screenResolution == null) {
+ // Called early, before init even finished
+ return null;
+ }
+
+ int width = findDesiredDimensionInRange(screenResolution.x, MIN_FRAME_WIDTH, MAX_FRAME_WIDTH);
+ int height = findDesiredDimensionInRange(screenResolution.y, MIN_FRAME_HEIGHT, MAX_FRAME_HEIGHT);
+
+ int leftOffset = (screenResolution.x - width) / 2;
+ int topOffset = (screenResolution.y - height) / 2;
+ framingRect = new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height);
+ Log.d(TAG, "Calculated framing rect: " + framingRect);
+ }
+ return framingRect;
+ }
+
+ private static int findDesiredDimensionInRange(int resolution, int hardMin, int hardMax) {
+ int dim = 5 * resolution / 8; // Target 5/8 of each dimension
+ if (dim < hardMin) {
+ return hardMin;
+ }
+ if (dim > hardMax) {
+ return hardMax;
+ }
+ return dim;
+ }
+
+ /**
+ * Like {@link #getFramingRect} but coordinates are in terms of the preview frame,
+ * not UI / screen.
+ *
+ * @return {@link Rect} expressing barcode scan area in terms of the preview size
+ */
+ public synchronized Rect getFramingRectInPreview() {
+ if (framingRectInPreview == null) {
+ Rect framingRect = getFramingRect();
+ if (framingRect == null) {
+ return null;
+ }
+ Rect rect = new Rect(framingRect);
+ Point cameraResolution = configManager.getCameraResolution();
+ Point screenResolution = configManager.getScreenResolution();
+ if (cameraResolution == null || screenResolution == null) {
+ // Called early, before init even finished
+ return null;
+ }
+// rect.left = rect.left * cameraResolution.x / screenResolution.x;
+// rect.right = rect.right * cameraResolution.x / screenResolution.x;
+// rect.top = rect.top * cameraResolution.y / screenResolution.y;
+// rect.bottom = rect.bottom * cameraResolution.y / screenResolution.y;
+ rect.left = rect.left * cameraResolution.y / screenResolution.x;
+ rect.right = rect.right * cameraResolution.y / screenResolution.x;
+ rect.top = rect.top * cameraResolution.x / screenResolution.y;
+ rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;
+
+ framingRectInPreview = rect;
+ }
+ return framingRectInPreview;
+ }
+
+
+ /**
+ * Allows third party apps to specify the camera ID, rather than determine
+ * it automatically based on available cameras and their orientation.
+ *
+ * @param cameraId camera ID of the camera to use. A negative value means "no preference".
+ */
+ public synchronized void setManualCameraId(int cameraId) {
+ requestedCameraId = cameraId;
+ }
+
+ /**
+ * Allows third party apps to specify the scanning rectangle dimensions, rather than determine
+ * them automatically based on screen resolution.
+ *
+ * @param width The width in pixels to scan.
+ * @param height The height in pixels to scan.
+ */
+ public synchronized void setManualFramingRect(int width, int height) {
+ if (initialized) {
+ Point screenResolution = configManager.getScreenResolution();
+ if (width > screenResolution.x) {
+ width = screenResolution.x;
+ }
+ if (height > screenResolution.y) {
+ height = screenResolution.y;
+ }
+ int leftOffset = (screenResolution.x - width) / 2;
+ int topOffset = (screenResolution.y - height) / 2;
+ framingRect = new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height);
+ Log.d(TAG, "Calculated manual framing rect: " + framingRect);
+ framingRectInPreview = null;
+ } else {
+ requestedFramingRectWidth = width;
+ requestedFramingRectHeight = height;
+ }
+ }
+
+ /**
+ * A factory method to build the appropriate LuminanceSource object based on the format
+ * of the preview buffers, as described by Camera.Parameters.
+ *
+ * @param data A preview frame.
+ * @param width The width of the image.
+ * @param height The height of the image.
+ * @return A PlanarYUVLuminanceSource instance.
+ */
+ public PlanarYUVLuminanceSource buildLuminanceSource(byte[] data, int width, int height) {
+ Rect rect = getFramingRectInPreview();
+ if (rect == null) {
+ return null;
+ }
+ // Go ahead and assume it's YUV rather than die.
+ return new PlanarYUVLuminanceSource(data, width, height, rect.left, rect.top,
+ rect.width(), rect.height(), false);
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/FrontLightMode.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/FrontLightMode.java
new file mode 100755
index 0000000..013339a
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/FrontLightMode.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2012 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.camera;
+
+import android.content.SharedPreferences;
+
+import com.google.zxing.client.android.PreferencesActivity;
+
+/**
+ * Enumerates settings of the preference controlling the front light.
+ */
+public enum FrontLightMode {
+
+ /** Always on. */
+ ON,
+ /** On only when ambient light is low. */
+ AUTO,
+ /** Always off. */
+ OFF;
+
+ private static FrontLightMode parse(String modeString) {
+ return modeString == null ? OFF : valueOf(modeString);
+ }
+
+ public static FrontLightMode readPref(SharedPreferences sharedPrefs) {
+ return parse(sharedPrefs.getString(PreferencesActivity.KEY_FRONT_LIGHT_MODE, OFF.toString()));
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/PreviewCallback.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/PreviewCallback.java
new file mode 100755
index 0000000..7dc7035
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/PreviewCallback.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2010 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.camera;
+
+import android.graphics.Point;
+import android.hardware.Camera;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+
+final class PreviewCallback implements Camera.PreviewCallback {
+
+ private static final String TAG = PreviewCallback.class.getSimpleName();
+
+ private final CameraConfigurationManager configManager;
+ private Handler previewHandler;
+ private int previewMessage;
+
+ PreviewCallback(CameraConfigurationManager configManager) {
+ this.configManager = configManager;
+ }
+
+ void setHandler(Handler previewHandler, int previewMessage) {
+ this.previewHandler = previewHandler;
+ this.previewMessage = previewMessage;
+ }
+
+ @Override
+ public void onPreviewFrame(byte[] data, Camera camera) {
+ Point cameraResolution = configManager.getCameraResolution();
+ Handler thePreviewHandler = previewHandler;
+ if (cameraResolution != null && thePreviewHandler != null) {
+ Message message = thePreviewHandler.obtainMessage(previewMessage, cameraResolution.x,
+ cameraResolution.y, data);
+ message.sendToTarget();
+ previewHandler = null;
+ } else {
+ Log.d(TAG, "Got preview callback, but no handler or resolution available");
+ }
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/open/CameraFacing.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/open/CameraFacing.java
new file mode 100755
index 0000000..20fd4e3
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/open/CameraFacing.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2015 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.camera.open;
+
+public enum CameraFacing {
+
+ BACK, // must be value 0!
+ FRONT, // must be value 1!
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/open/OpenCamera.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/open/OpenCamera.java
new file mode 100755
index 0000000..ddac734
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/open/OpenCamera.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2015 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.camera.open;
+
+import android.hardware.Camera;
+
+public final class OpenCamera {
+
+ private final int index;
+ private final Camera camera;
+ private final CameraFacing facing;
+ private final int orientation;
+
+ public OpenCamera(int index, Camera camera, CameraFacing facing, int orientation) {
+ this.index = index;
+ this.camera = camera;
+ this.facing = facing;
+ this.orientation = orientation;
+ }
+
+ public Camera getCamera() {
+ return camera;
+ }
+
+ public CameraFacing getFacing() {
+ return facing;
+ }
+
+ public int getOrientation() {
+ return orientation;
+ }
+
+ @Override
+ public String toString() {
+ return "Camera #" + index + " : " + facing + ',' + orientation;
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/open/OpenCameraInterface.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/open/OpenCameraInterface.java
new file mode 100755
index 0000000..24e0f13
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/camera/open/OpenCameraInterface.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2012 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.camera.open;
+
+import android.hardware.Camera;
+import android.util.Log;
+
+public final class OpenCameraInterface {
+
+ private static final String TAG = OpenCameraInterface.class.getName();
+
+ private OpenCameraInterface() {
+ }
+
+ /** For {@link #open(int)}, means no preference for which camera to open. */
+ public static final int NO_REQUESTED_CAMERA = -1;
+
+ /**
+ * Opens the requested camera with {@link Camera#open(int)}, if one exists.
+ *
+ * @param cameraId camera ID of the camera to use. A negative value
+ * or {@link #NO_REQUESTED_CAMERA} means "no preference", in which case a rear-facing
+ * camera is returned if possible or else any camera
+ * @return handle to {@link OpenCamera} that was opened
+ */
+ public static OpenCamera open(int cameraId) {
+
+ int numCameras = Camera.getNumberOfCameras();
+ if (numCameras == 0) {
+ Log.w(TAG, "No cameras!");
+ return null;
+ }
+
+ boolean explicitRequest = cameraId >= 0;
+
+ Camera.CameraInfo selectedCameraInfo = null;
+ int index;
+ if (explicitRequest) {
+ index = cameraId;
+ selectedCameraInfo = new Camera.CameraInfo();
+ Camera.getCameraInfo(index, selectedCameraInfo);
+ } else {
+ index = 0;
+ while (index < numCameras) {
+ Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
+ Camera.getCameraInfo(index, cameraInfo);
+ CameraFacing reportedFacing = CameraFacing.values()[cameraInfo.facing];
+ if (reportedFacing == CameraFacing.BACK) {
+ selectedCameraInfo = cameraInfo;
+ break;
+ }
+ index++;
+ }
+ }
+
+ Camera camera;
+ if (index < numCameras) {
+ Log.i(TAG, "Opening camera #" + index);
+ camera = Camera.open(index);
+ } else {
+ if (explicitRequest) {
+ Log.w(TAG, "Requested camera does not exist: " + cameraId);
+ camera = null;
+ } else {
+ Log.i(TAG, "No camera facing " + CameraFacing.BACK + "; returning camera #0");
+ camera = Camera.open(0);
+ selectedCameraInfo = new Camera.CameraInfo();
+ Camera.getCameraInfo(0, selectedCameraInfo);
+ }
+ }
+
+ if (camera == null) {
+ return null;
+ }
+ return new OpenCamera(index,
+ camera,
+ CameraFacing.values()[selectedCameraInfo.facing],
+ selectedCameraInfo.orientation);
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/clipboard/ClipboardInterface.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/clipboard/ClipboardInterface.java
new file mode 100755
index 0000000..3ba0603
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/clipboard/ClipboardInterface.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2012 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.clipboard;
+
+import android.content.ClipData;
+import android.content.ClipboardManager;
+import android.content.Context;
+import android.util.Log;
+
+public final class ClipboardInterface {
+
+ private static final String TAG = ClipboardInterface.class.getSimpleName();
+
+ private ClipboardInterface() {
+ }
+
+ public static CharSequence getText(Context context) {
+ ClipboardManager clipboard = getManager(context);
+ ClipData clip = clipboard.getPrimaryClip();
+ return hasText(context) ? clip.getItemAt(0).coerceToText(context) : null;
+ }
+
+ public static void setText(CharSequence text, Context context) {
+ if (text != null) {
+ try {
+ getManager(context).setPrimaryClip(ClipData.newPlainText(null, text));
+ } catch (NullPointerException | IllegalStateException e) {
+ // Have seen this in the wild, bizarrely
+ Log.w(TAG, "Clipboard bug", e);
+ }
+ }
+ }
+
+ public static boolean hasText(Context context) {
+ ClipboardManager clipboard = getManager(context);
+ ClipData clip = clipboard.getPrimaryClip();
+ return clip != null && clip.getItemCount() > 0;
+ }
+
+ private static ClipboardManager getManager(Context context) {
+ return (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/encode/ContactEncoder.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/encode/ContactEncoder.java
new file mode 100755
index 0000000..41639a9
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/encode/ContactEncoder.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2011 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.encode;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+
+/**
+ * Implementations encode according to some scheme for encoding contact information, like VCard or
+ * MECARD.
+ *
+ * @author Sean Owen
+ */
+abstract class ContactEncoder {
+
+ /**
+ * @return first, the best effort encoding of all data in the appropriate format; second, a
+ * display-appropriate version of the contact information
+ */
+ abstract String[] encode(List<String> names,
+ String organization,
+ List<String> addresses,
+ List<String> phones,
+ List<String> phoneTypes,
+ List<String> emails,
+ List<String> urls,
+ String note);
+
+ /**
+ * @return null if s is null or empty, or result of s.trim() otherwise
+ */
+ static String trim(String s) {
+ if (s == null) {
+ return null;
+ }
+ String result = s.trim();
+ return result.isEmpty() ? null : result;
+ }
+
+ static void append(StringBuilder newContents,
+ StringBuilder newDisplayContents,
+ String prefix,
+ String value,
+ Formatter fieldFormatter,
+ char terminator) {
+ String trimmed = trim(value);
+ if (trimmed != null) {
+ newContents.append(prefix).append(fieldFormatter.format(trimmed, 0)).append(terminator);
+ newDisplayContents.append(trimmed).append('\n');
+ }
+ }
+
+ static void appendUpToUnique(StringBuilder newContents,
+ StringBuilder newDisplayContents,
+ String prefix,
+ List<String> values,
+ int max,
+ Formatter displayFormatter,
+ Formatter fieldFormatter,
+ char terminator) {
+ if (values == null) {
+ return;
+ }
+ int count = 0;
+ Collection<String> uniques = new HashSet<>(2);
+ for (int i = 0; i < values.size(); i++) {
+ String value = values.get(i);
+ String trimmed = trim(value);
+ if (trimmed != null && !trimmed.isEmpty() && !uniques.contains(trimmed)) {
+ newContents.append(prefix).append(fieldFormatter.format(trimmed, i)).append(terminator);
+ CharSequence display = displayFormatter == null ? trimmed : displayFormatter.format(trimmed, i);
+ newDisplayContents.append(display).append('\n');
+ if (++count == max) {
+ break;
+ }
+ uniques.add(trimmed);
+ }
+ }
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/encode/EncodeActivity.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/encode/EncodeActivity.java
new file mode 100755
index 0000000..28866aa
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/encode/EncodeActivity.java
@@ -0,0 +1,242 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.encode;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.Point;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Environment;
+import android.util.Log;
+import android.view.Display;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.WindowManager;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.alibaba.weex.R;
+import com.google.zxing.WriterException;
+import com.google.zxing.client.android.Contents;
+import com.google.zxing.client.android.FinishListener;
+import com.google.zxing.client.android.Intents;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.regex.Pattern;
+
+/**
+ * This class encodes data from an Intent into a QR code, and then displays it full screen so that
+ * another person can scan it with their device.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+public final class EncodeActivity extends Activity {
+
+ private static final String TAG = EncodeActivity.class.getSimpleName();
+
+ private static final int MAX_BARCODE_FILENAME_LENGTH = 24;
+ private static final Pattern NOT_ALPHANUMERIC = Pattern.compile("[^A-Za-z0-9]");
+ private static final String USE_VCARD_KEY = "USE_VCARD";
+
+ private QRCodeEncoder qrCodeEncoder;
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ Intent intent = getIntent();
+ if (intent == null) {
+ finish();
+ } else {
+ String action = intent.getAction();
+ if (Intents.Encode.ACTION.equals(action) || Intent.ACTION_SEND.equals(action)) {
+ setContentView(R.layout.encode);
+ } else {
+ finish();
+ }
+ }
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ MenuInflater menuInflater = getMenuInflater();
+ menuInflater.inflate(R.menu.encode, menu);
+ boolean useVcard = qrCodeEncoder != null && qrCodeEncoder.isUseVCard();
+ int encodeNameResource = useVcard ? R.string.menu_encode_mecard : R.string.menu_encode_vcard;
+ MenuItem encodeItem = menu.findItem(R.id.menu_encode);
+ encodeItem.setTitle(encodeNameResource);
+ Intent intent = getIntent();
+ if (intent != null) {
+ String type = intent.getStringExtra(Intents.Encode.TYPE);
+ encodeItem.setVisible(Contents.Type.CONTACT.equals(type));
+ }
+ return super.onCreateOptionsMenu(menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ int i = item.getItemId();
+ if (i == R.id.menu_share) {
+ share();
+ return true;
+ } else if (i == R.id.menu_encode) {
+ Intent intent = getIntent();
+ if (intent == null) {
+ return false;
+ }
+ intent.putExtra(USE_VCARD_KEY, !qrCodeEncoder.isUseVCard());
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ startActivity(intent);
+ finish();
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private void share() {
+ QRCodeEncoder encoder = qrCodeEncoder;
+ if (encoder == null) { // Odd
+ Log.w(TAG, "No existing barcode to send?");
+ return;
+ }
+
+ String contents = encoder.getContents();
+ if (contents == null) {
+ Log.w(TAG, "No existing barcode to send?");
+ return;
+ }
+
+ Bitmap bitmap;
+ try {
+ bitmap = encoder.encodeAsBitmap();
+ } catch (WriterException we) {
+ Log.w(TAG, we);
+ return;
+ }
+ if (bitmap == null) {
+ return;
+ }
+
+ File bsRoot = new File(Environment.getExternalStorageDirectory(), "BarcodeScanner");
+ File barcodesRoot = new File(bsRoot, "Barcodes");
+ if (!barcodesRoot.exists() && !barcodesRoot.mkdirs()) {
+ Log.w(TAG, "Couldn't make dir " + barcodesRoot);
+ showErrorMessage(R.string.msg_unmount_usb);
+ return;
+ }
+ File barcodeFile = new File(barcodesRoot, makeBarcodeFileName(contents) + ".png");
+ if (!barcodeFile.delete()) {
+ Log.w(TAG, "Could not delete " + barcodeFile);
+ // continue anyway
+ }
+ FileOutputStream fos = null;
+ try {
+ fos = new FileOutputStream(barcodeFile);
+ bitmap.compress(Bitmap.CompressFormat.PNG, 0, fos);
+ } catch (FileNotFoundException fnfe) {
+ Log.w(TAG, "Couldn't access file " + barcodeFile + " due to " + fnfe);
+ showErrorMessage(R.string.msg_unmount_usb);
+ return;
+ } finally {
+ if (fos != null) {
+ try {
+ fos.close();
+ } catch (IOException ioe) {
+ // do nothing
+ }
+ }
+ }
+
+ Intent intent = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
+ intent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.app_name) + " - " + encoder.getTitle());
+ intent.putExtra(Intent.EXTRA_TEXT, contents);
+ intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + barcodeFile.getAbsolutePath()));
+ intent.setType("image/png");
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+ startActivity(Intent.createChooser(intent, null));
+ }
+
+ private static CharSequence makeBarcodeFileName(CharSequence contents) {
+ String fileName = NOT_ALPHANUMERIC.matcher(contents).replaceAll("_");
+ if (fileName.length() > MAX_BARCODE_FILENAME_LENGTH) {
+ fileName = fileName.substring(0, MAX_BARCODE_FILENAME_LENGTH);
+ }
+ return fileName;
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ // This assumes the view is full screen, which is a good assumption
+ WindowManager manager = (WindowManager) getSystemService(WINDOW_SERVICE);
+ Display display = manager.getDefaultDisplay();
+ Point displaySize = new Point();
+ display.getSize(displaySize);
+ int width = displaySize.x;
+ int height = displaySize.y;
+ int smallerDimension = width < height ? width : height;
+ smallerDimension = smallerDimension * 7 / 8;
+
+ Intent intent = getIntent();
+ if (intent == null) {
+ return;
+ }
+
+ try {
+ boolean useVCard = intent.getBooleanExtra(USE_VCARD_KEY, false);
+ qrCodeEncoder = new QRCodeEncoder(this, intent, smallerDimension, useVCard);
+ Bitmap bitmap = qrCodeEncoder.encodeAsBitmap();
+ if (bitmap == null) {
+ Log.w(TAG, "Could not encode barcode");
+ showErrorMessage(R.string.msg_encode_contents_failed);
+ qrCodeEncoder = null;
+ return;
+ }
+
+ ImageView view = (ImageView) findViewById(R.id.image_view);
+ view.setImageBitmap(bitmap);
+
+ TextView contents = (TextView) findViewById(R.id.contents_text_view);
+ if (intent.getBooleanExtra(Intents.Encode.SHOW_CONTENTS, true)) {
+ contents.setText(qrCodeEncoder.getDisplayContents());
+ setTitle(qrCodeEncoder.getTitle());
+ } else {
+ contents.setText("");
+ setTitle("");
+ }
+ } catch (WriterException e) {
+ Log.w(TAG, "Could not encode barcode", e);
+ showErrorMessage(R.string.msg_encode_contents_failed);
+ qrCodeEncoder = null;
+ }
+ }
+
+ private void showErrorMessage(int message) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setMessage(message);
+ builder.setPositiveButton(R.string.button_ok, new FinishListener(this));
+ builder.setOnCancelListener(new FinishListener(this));
+ builder.show();
+ }
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/encode/Formatter.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/encode/Formatter.java
new file mode 100755
index 0000000..9e0ae85
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/encode/Formatter.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2011 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.encode;
+
+/**
+ * Encapsulates some simple formatting logic, to aid refactoring in {@link ContactEncoder}.
+ *
+ * @author Sean Owen
+ */
+interface Formatter {
+
+ /**
+ * @param value value to format
+ * @param index index of value in a list of values to be formatted
+ * @return formatted value
+ */
+ CharSequence format(CharSequence value, int index);
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/encode/MECARDContactEncoder.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/encode/MECARDContactEncoder.java
new file mode 100755
index 0000000..4facf77
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/encode/MECARDContactEncoder.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2011 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.encode;
+
+import java.util.List;
+import java.util.regex.Pattern;
+
+import android.telephony.PhoneNumberUtils;
+
+/**
+ * Encodes contact information according to the MECARD format.
+ *
+ * @author Sean Owen
+ */
+final class MECARDContactEncoder extends ContactEncoder {
+
+ private static final char TERMINATOR = ';';
+
+ @Override
+ public String[] encode(List<String> names,
+ String organization,
+ List<String> addresses,
+ List<String> phones,
+ List<String> phoneTypes,
+ List<String> emails,
+ List<String> urls,
+ String note) {
+ StringBuilder newContents = new StringBuilder(100);
+ newContents.append("MECARD:");
+
+ StringBuilder newDisplayContents = new StringBuilder(100);
+
+ Formatter fieldFormatter = new MECARDFieldFormatter();
+
+ appendUpToUnique(newContents, newDisplayContents, "N", names, 1, new
+ MECARDNameDisplayFormatter(), fieldFormatter, TERMINATOR);
+
+ append(newContents, newDisplayContents, "ORG", organization, fieldFormatter, TERMINATOR);
+
+ appendUpToUnique(newContents, newDisplayContents, "ADR", addresses, 1, null, fieldFormatter, TERMINATOR);
+
+ appendUpToUnique(newContents, newDisplayContents, "TEL", phones, Integer.MAX_VALUE,
+ new MECARDTelDisplayFormatter(), fieldFormatter, TERMINATOR);
+
+ appendUpToUnique(newContents, newDisplayContents, "EMAIL", emails, Integer.MAX_VALUE, null,
+ fieldFormatter, TERMINATOR);
+
+ appendUpToUnique(newContents, newDisplayContents, "URL", urls, Integer.MAX_VALUE, null,
+ fieldFormatter, TERMINATOR);
+
+ append(newContents, newDisplayContents, "NOTE", note, fieldFormatter, TERMINATOR);
+
+ newContents.append(';');
+
+ return new String[] { newContents.toString(), newDisplayContents.toString() };
+ }
+
+ private static class MECARDFieldFormatter implements Formatter {
+ private static final Pattern RESERVED_MECARD_CHARS = Pattern.compile("([\\\\:;])");
+ private static final Pattern NEWLINE = Pattern.compile("\\n");
+ @Override
+ public CharSequence format(CharSequence value, int index) {
+ return ':' + NEWLINE.matcher(RESERVED_MECARD_CHARS.matcher(value).replaceAll("\\\\$1")).replaceAll("");
+ }
+ }
+
+ private static class MECARDTelDisplayFormatter implements Formatter {
+ private static final Pattern NOT_DIGITS = Pattern.compile("[^0-9]+");
+ @Override
+ public CharSequence format(CharSequence value, int index) {
+ return NOT_DIGITS.matcher(PhoneNumberUtils.formatNumber(value.toString())).replaceAll("");
+ }
+ }
+
+ private static class MECARDNameDisplayFormatter implements Formatter {
+ private static final Pattern COMMA = Pattern.compile(",");
+ @Override
+ public CharSequence format(CharSequence value, int index) {
+ return COMMA.matcher(value).replaceAll("");
+ }
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/encode/QRCodeEncoder.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/encode/QRCodeEncoder.java
new file mode 100755
index 0000000..d4d8bd2
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/encode/QRCodeEncoder.java
@@ -0,0 +1,389 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.encode;
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.ContactsContract;
+import android.telephony.PhoneNumberUtils;
+import android.util.Log;
+
+import com.alibaba.weex.R;
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.MultiFormatWriter;
+import com.google.zxing.Result;
+import com.google.zxing.WriterException;
+import com.google.zxing.client.android.Contents;
+import com.google.zxing.client.android.Intents;
+import com.google.zxing.client.result.AddressBookParsedResult;
+import com.google.zxing.client.result.ParsedResult;
+import com.google.zxing.client.result.ResultParser;
+import com.google.zxing.common.BitMatrix;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * This class does the work of decoding the user's request and extracting all the data
+ * to be encoded in a barcode.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+final class QRCodeEncoder {
+
+ private static final String TAG = QRCodeEncoder.class.getSimpleName();
+
+ private static final int WHITE = 0xFFFFFFFF;
+ private static final int BLACK = 0xFF000000;
+
+ private final Context activity;
+ private String contents;
+ private String displayContents;
+ private String title;
+ private BarcodeFormat format;
+ private final int dimension;
+ private final boolean useVCard;
+
+ QRCodeEncoder(Context activity, Intent intent, int dimension, boolean useVCard) throws WriterException {
+ this.activity = activity;
+ this.dimension = dimension;
+ this.useVCard = useVCard;
+ String action = intent.getAction();
+ if (action.equals(Intents.Encode.ACTION)) {
+ encodeContentsFromZXingIntent(intent);
+ } else if (action.equals(Intent.ACTION_SEND)) {
+ encodeContentsFromShareIntent(intent);
+ }
+ }
+
+ String getContents() {
+ return contents;
+ }
+
+ String getDisplayContents() {
+ return displayContents;
+ }
+
+ String getTitle() {
+ return title;
+ }
+
+ boolean isUseVCard() {
+ return useVCard;
+ }
+
+ // It would be nice if the string encoding lived in the core ZXing library,
+ // but we use platform specific code like PhoneNumberUtils, so it can't.
+ private boolean encodeContentsFromZXingIntent(Intent intent) {
+ // Default to QR_CODE if no format given.
+ String formatString = intent.getStringExtra(Intents.Encode.FORMAT);
+ format = null;
+ if (formatString != null) {
+ try {
+ format = BarcodeFormat.valueOf(formatString);
+ } catch (IllegalArgumentException iae) {
+ // Ignore it then
+ }
+ }
+ if (format == null || format == BarcodeFormat.QR_CODE) {
+ String type = intent.getStringExtra(Intents.Encode.TYPE);
+ if (type == null || type.isEmpty()) {
+ return false;
+ }
+ this.format = BarcodeFormat.QR_CODE;
+ encodeQRCodeContents(intent, type);
+ } else {
+ String data = intent.getStringExtra(Intents.Encode.DATA);
+ if (data != null && !data.isEmpty()) {
+ contents = data;
+ displayContents = data;
+ title = activity.getString(R.string.contents_text);
+ }
+ }
+ return contents != null && !contents.isEmpty();
+ }
+
+ // Handles send intents from multitude of Android applications
+ private void encodeContentsFromShareIntent(Intent intent) throws WriterException {
+ // Check if this is a plain text encoding, or contact
+ if (intent.hasExtra(Intent.EXTRA_STREAM)) {
+ encodeFromStreamExtra(intent);
+ } else {
+ encodeFromTextExtras(intent);
+ }
+ }
+
+ private void encodeFromTextExtras(Intent intent) throws WriterException {
+ // Notice: Google Maps shares both URL and details in one text, bummer!
+ String theContents = ContactEncoder.trim(intent.getStringExtra(Intent.EXTRA_TEXT));
+ if (theContents == null) {
+ theContents = ContactEncoder.trim(intent.getStringExtra("android.intent.extra.HTML_TEXT"));
+ // Intent.EXTRA_HTML_TEXT
+ if (theContents == null) {
+ theContents = ContactEncoder.trim(intent.getStringExtra(Intent.EXTRA_SUBJECT));
+ if (theContents == null) {
+ String[] emails = intent.getStringArrayExtra(Intent.EXTRA_EMAIL);
+ if (emails != null) {
+ theContents = ContactEncoder.trim(emails[0]);
+ } else {
+ theContents = "?";
+ }
+ }
+ }
+ }
+
+ // Trim text to avoid URL breaking.
+ if (theContents == null || theContents.isEmpty()) {
+ throw new WriterException("Empty EXTRA_TEXT");
+ }
+ contents = theContents;
+ // We only do QR code.
+ format = BarcodeFormat.QR_CODE;
+ if (intent.hasExtra(Intent.EXTRA_SUBJECT)) {
+ displayContents = intent.getStringExtra(Intent.EXTRA_SUBJECT);
+ } else if (intent.hasExtra(Intent.EXTRA_TITLE)) {
+ displayContents = intent.getStringExtra(Intent.EXTRA_TITLE);
+ } else {
+ displayContents = contents;
+ }
+ title = activity.getString(R.string.contents_text);
+ }
+
+ // Handles send intents from the Contacts app, retrieving a contact as a VCARD.
+ private void encodeFromStreamExtra(Intent intent) throws WriterException {
+ format = BarcodeFormat.QR_CODE;
+ Bundle bundle = intent.getExtras();
+ if (bundle == null) {
+ throw new WriterException("No extras");
+ }
+ Uri uri = bundle.getParcelable(Intent.EXTRA_STREAM);
+ if (uri == null) {
+ throw new WriterException("No EXTRA_STREAM");
+ }
+ byte[] vcard;
+ String vcardString;
+ InputStream stream = null;
+ try {
+ stream = activity.getContentResolver().openInputStream(uri);
+ if (stream == null) {
+ throw new WriterException("Can't open stream for " + uri);
+ }
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ byte[] buffer = new byte[2048];
+ int bytesRead;
+ while ((bytesRead = stream.read(buffer)) > 0) {
+ baos.write(buffer, 0, bytesRead);
+ }
+ vcard = baos.toByteArray();
+ vcardString = new String(vcard, 0, vcard.length, "UTF-8");
+ } catch (IOException ioe) {
+ throw new WriterException(ioe);
+ } finally {
+ if (stream != null) {
+ try {
+ stream.close();
+ } catch (IOException e) {
+ // continue
+ }
+ }
+ }
+ Log.d(TAG, "Encoding share intent content:");
+ Log.d(TAG, vcardString);
+ Result result = new Result(vcardString, vcard, null, BarcodeFormat.QR_CODE);
+ ParsedResult parsedResult = ResultParser.parseResult(result);
+ if (!(parsedResult instanceof AddressBookParsedResult)) {
+ throw new WriterException("Result was not an address");
+ }
+ encodeQRCodeContents((AddressBookParsedResult) parsedResult);
+ if (contents == null || contents.isEmpty()) {
+ throw new WriterException("No content to encode");
+ }
+ }
+
+ private void encodeQRCodeContents(Intent intent, String type) {
+ switch (type) {
+ case Contents.Type.TEXT:
+ String textData = intent.getStringExtra(Intents.Encode.DATA);
+ if (textData != null && !textData.isEmpty()) {
+ contents = textData;
+ displayContents = textData;
+ title = activity.getString(R.string.contents_text);
+ }
+ break;
+
+ case Contents.Type.EMAIL:
+ String emailData = ContactEncoder.trim(intent.getStringExtra(Intents.Encode.DATA));
+ if (emailData != null) {
+ contents = "mailto:" + emailData;
+ displayContents = emailData;
+ title = activity.getString(R.string.contents_email);
+ }
+ break;
+
+ case Contents.Type.PHONE:
+ String phoneData = ContactEncoder.trim(intent.getStringExtra(Intents.Encode.DATA));
+ if (phoneData != null) {
+ contents = "tel:" + phoneData;
+ displayContents = PhoneNumberUtils.formatNumber(phoneData);
+ title = activity.getString(R.string.contents_phone);
+ }
+ break;
+
+ case Contents.Type.SMS:
+ String smsData = ContactEncoder.trim(intent.getStringExtra(Intents.Encode.DATA));
+ if (smsData != null) {
+ contents = "sms:" + smsData;
+ displayContents = PhoneNumberUtils.formatNumber(smsData);
+ title = activity.getString(R.string.contents_sms);
+ }
+ break;
+
+ case Contents.Type.CONTACT:
+ Bundle contactBundle = intent.getBundleExtra(Intents.Encode.DATA);
+ if (contactBundle != null) {
+
+ String name = contactBundle.getString(ContactsContract.Intents.Insert.NAME);
+ String organization = contactBundle.getString(ContactsContract.Intents.Insert.COMPANY);
+ String address = contactBundle.getString(ContactsContract.Intents.Insert.POSTAL);
+ List<String> phones = getAllBundleValues(contactBundle, Contents.PHONE_KEYS);
+ List<String> phoneTypes = getAllBundleValues(contactBundle, Contents.PHONE_TYPE_KEYS);
+ List<String> emails = getAllBundleValues(contactBundle, Contents.EMAIL_KEYS);
+ String url = contactBundle.getString(Contents.URL_KEY);
+ List<String> urls = url == null ? null : Collections.singletonList(url);
+ String note = contactBundle.getString(Contents.NOTE_KEY);
+
+ ContactEncoder encoder = useVCard ? new VCardContactEncoder() : new MECARDContactEncoder();
+ String[] encoded = encoder.encode(Collections.singletonList(name),
+ organization,
+ Collections.singletonList(address),
+ phones,
+ phoneTypes,
+ emails,
+ urls,
+ note);
+ // Make sure we've encoded at least one field.
+ if (!encoded[1].isEmpty()) {
+ contents = encoded[0];
+ displayContents = encoded[1];
+ title = activity.getString(R.string.contents_contact);
+ }
+
+ }
+ break;
+
+ case Contents.Type.LOCATION:
+ Bundle locationBundle = intent.getBundleExtra(Intents.Encode.DATA);
+ if (locationBundle != null) {
+ // These must use Bundle.getFloat(), not getDouble(), it's part of the API.
+ float latitude = locationBundle.getFloat("LAT", Float.MAX_VALUE);
+ float longitude = locationBundle.getFloat("LONG", Float.MAX_VALUE);
+ if (latitude != Float.MAX_VALUE && longitude != Float.MAX_VALUE) {
+ contents = "geo:" + latitude + ',' + longitude;
+ displayContents = latitude + "," + longitude;
+ title = activity.getString(R.string.contents_location);
+ }
+ }
+ break;
+ }
+ }
+
+ private static List<String> getAllBundleValues(Bundle bundle, String[] keys) {
+ List<String> values = new ArrayList<>(keys.length);
+ for (String key : keys) {
+ Object value = bundle.get(key);
+ values.add(value == null ? null : value.toString());
+ }
+ return values;
+ }
+
+ private void encodeQRCodeContents(AddressBookParsedResult contact) {
+ ContactEncoder encoder = useVCard ? new VCardContactEncoder() : new MECARDContactEncoder();
+ String[] encoded = encoder.encode(toList(contact.getNames()),
+ contact.getOrg(),
+ toList(contact.getAddresses()),
+ toList(contact.getPhoneNumbers()),
+ null,
+ toList(contact.getEmails()),
+ toList(contact.getURLs()),
+ null);
+ // Make sure we've encoded at least one field.
+ if (!encoded[1].isEmpty()) {
+ contents = encoded[0];
+ displayContents = encoded[1];
+ title = activity.getString(R.string.contents_contact);
+ }
+ }
+
+ private static List<String> toList(String[] values) {
+ return values == null ? null : Arrays.asList(values);
+ }
+
+ Bitmap encodeAsBitmap() throws WriterException {
+ String contentsToEncode = contents;
+ if (contentsToEncode == null) {
+ return null;
+ }
+ Map<EncodeHintType,Object> hints = null;
+ String encoding = guessAppropriateEncoding(contentsToEncode);
+ if (encoding != null) {
+ hints = new EnumMap<>(EncodeHintType.class);
+ hints.put(EncodeHintType.CHARACTER_SET, encoding);
+ }
+ BitMatrix result;
+ try {
+ result = new MultiFormatWriter().encode(contentsToEncode, format, dimension, dimension, hints);
+ } catch (IllegalArgumentException iae) {
+ // Unsupported format
+ return null;
+ }
+ int width = result.getWidth();
+ int height = result.getHeight();
+ int[] pixels = new int[width * height];
+ for (int y = 0; y < height; y++) {
+ int offset = y * width;
+ for (int x = 0; x < width; x++) {
+ pixels[offset + x] = result.get(x, y) ? BLACK : WHITE;
+ }
+ }
+
+ Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+ bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
+ return bitmap;
+ }
+
+ private static String guessAppropriateEncoding(CharSequence contents) {
+ // Very crude at the moment
+ for (int i = 0; i < contents.length(); i++) {
+ if (contents.charAt(i) > 0xFF) {
+ return "UTF-8";
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/encode/VCardContactEncoder.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/encode/VCardContactEncoder.java
new file mode 100755
index 0000000..00bd9e2
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/encode/VCardContactEncoder.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2011 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.encode;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import android.provider.ContactsContract;
+
+/**
+ * Encodes contact information according to the vCard format.
+ *
+ * @author Sean Owen
+ */
+final class VCardContactEncoder extends ContactEncoder {
+
+ private static final char TERMINATOR = '\n';
+
+ @Override
+ public String[] encode(List<String> names,
+ String organization,
+ List<String> addresses,
+ List<String> phones,
+ List<String> phoneTypes,
+ List<String> emails,
+ List<String> urls,
+ String note) {
+ StringBuilder newContents = new StringBuilder(100);
+ newContents.append("BEGIN:VCARD").append(TERMINATOR);
+ newContents.append("VERSION:3.0").append(TERMINATOR);
+
+ StringBuilder newDisplayContents = new StringBuilder(100);
+
+ Formatter fieldFormatter = new VCardFieldFormatter();
+
+ appendUpToUnique(newContents, newDisplayContents, "N", names, 1, null, fieldFormatter, TERMINATOR);
+
+ append(newContents, newDisplayContents, "ORG", organization, fieldFormatter, TERMINATOR);
+
+ appendUpToUnique(newContents, newDisplayContents, "ADR", addresses, 1, null, fieldFormatter, TERMINATOR);
+
+ List<Map<String,Set<String>>> phoneMetadata = buildPhoneMetadata(phones, phoneTypes);
+ appendUpToUnique(newContents, newDisplayContents, "TEL", phones, Integer.MAX_VALUE,
+ new VCardTelDisplayFormatter(phoneMetadata),
+ new VCardFieldFormatter(phoneMetadata), TERMINATOR);
+
+ appendUpToUnique(newContents, newDisplayContents, "EMAIL", emails, Integer.MAX_VALUE, null,
+ fieldFormatter, TERMINATOR);
+
+ appendUpToUnique(newContents, newDisplayContents, "URL", urls, Integer.MAX_VALUE, null,
+ fieldFormatter, TERMINATOR);
+
+ append(newContents, newDisplayContents, "NOTE", note, fieldFormatter, TERMINATOR);
+
+ newContents.append("END:VCARD").append(TERMINATOR);
+
+ return new String[] { newContents.toString(), newDisplayContents.toString() };
+ }
+
+ static List<Map<String,Set<String>>> buildPhoneMetadata(Collection<String> phones, List<String> phoneTypes) {
+ if (phoneTypes == null || phoneTypes.isEmpty()) {
+ return null;
+ }
+ List<Map<String,Set<String>>> metadataForIndex = new ArrayList<>();
+ for (int i = 0; i < phones.size(); i++) {
+ if (phoneTypes.size() <= i) {
+ metadataForIndex.add(null);
+ } else {
+ Map<String,Set<String>> metadata = new HashMap<>();
+ metadataForIndex.add(metadata);
+ Set<String> typeTokens = new HashSet<>();
+ metadata.put("TYPE", typeTokens);
+ String typeString = phoneTypes.get(i);
+ Integer androidType = maybeIntValue(typeString);
+ if (androidType == null) {
+ typeTokens.add(typeString);
+ } else {
+ String purpose = vCardPurposeLabelForAndroidType(androidType);
+ String context = vCardContextLabelForAndroidType(androidType);
+ if (purpose != null) {
+ typeTokens.add(purpose);
+ }
+ if (context != null) {
+ typeTokens.add(context);
+ }
+ }
+ }
+ }
+ return metadataForIndex;
+ }
+
+ private static Integer maybeIntValue(String value) {
+ try {
+ return Integer.valueOf(value);
+ } catch (NumberFormatException nfe) {
+ return null;
+ }
+ }
+
+ private static String vCardPurposeLabelForAndroidType(int androidType) {
+ switch (androidType) {
+ case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME:
+ case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK:
+ case ContactsContract.CommonDataKinds.Phone.TYPE_OTHER_FAX:
+ return "fax";
+ case ContactsContract.CommonDataKinds.Phone.TYPE_PAGER:
+ case ContactsContract.CommonDataKinds.Phone.TYPE_WORK_PAGER:
+ return "pager";
+ case ContactsContract.CommonDataKinds.Phone.TYPE_TTY_TDD:
+ return "textphone";
+ case ContactsContract.CommonDataKinds.Phone.TYPE_MMS:
+ return "text";
+ default:
+ return null;
+ }
+ }
+
+ private static String vCardContextLabelForAndroidType(int androidType) {
+ switch (androidType) {
+ case ContactsContract.CommonDataKinds.Phone.TYPE_HOME:
+ case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE:
+ case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME:
+ case ContactsContract.CommonDataKinds.Phone.TYPE_PAGER:
+ return "home";
+ case ContactsContract.CommonDataKinds.Phone.TYPE_COMPANY_MAIN:
+ case ContactsContract.CommonDataKinds.Phone.TYPE_WORK:
+ case ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE:
+ case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK:
+ case ContactsContract.CommonDataKinds.Phone.TYPE_WORK_PAGER:
+ return "work";
+ default:
+ return null;
+ }
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/encode/VCardFieldFormatter.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/encode/VCardFieldFormatter.java
new file mode 100755
index 0000000..070a4cd
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/encode/VCardFieldFormatter.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2014 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.encode;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+/**
+ * @author Sean Owen
+ */
+final class VCardFieldFormatter implements Formatter {
+
+ private static final Pattern RESERVED_VCARD_CHARS = Pattern.compile("([\\\\,;])");
+ private static final Pattern NEWLINE = Pattern.compile("\\n");
+
+ private final List<Map<String,Set<String>>> metadataForIndex;
+
+ VCardFieldFormatter() {
+ this(null);
+ }
+
+ VCardFieldFormatter(List<Map<String,Set<String>>> metadataForIndex) {
+ this.metadataForIndex = metadataForIndex;
+ }
+
+ @Override
+ public CharSequence format(CharSequence value, int index) {
+ value = RESERVED_VCARD_CHARS.matcher(value).replaceAll("\\\\$1");
+ value = NEWLINE.matcher(value).replaceAll("");
+ Map<String,Set<String>> metadata =
+ metadataForIndex == null || metadataForIndex.size() <= index ? null : metadataForIndex.get(index);
+ value = formatMetadata(value, metadata);
+ return value;
+ }
+
+ private static CharSequence formatMetadata(CharSequence value, Map<String,Set<String>> metadata) {
+ StringBuilder withMetadata = new StringBuilder();
+ if (metadata != null) {
+ for (Map.Entry<String,Set<String>> metadatum : metadata.entrySet()) {
+ Set<String> values = metadatum.getValue();
+ if (values == null || values.isEmpty()) {
+ continue;
+ }
+ withMetadata.append(';').append(metadatum.getKey()).append('=');
+ if (values.size() > 1) {
+ withMetadata.append('"');
+ }
+ Iterator<String> valuesIt = values.iterator();
+ withMetadata.append(valuesIt.next());
+ while (valuesIt.hasNext()) {
+ withMetadata.append(',').append(valuesIt.next());
+ }
+ if (values.size() > 1) {
+ withMetadata.append('"');
+ }
+ }
+ }
+ withMetadata.append(':').append(value);
+ return withMetadata;
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/encode/VCardTelDisplayFormatter.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/encode/VCardTelDisplayFormatter.java
new file mode 100755
index 0000000..21d2e7f
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/encode/VCardTelDisplayFormatter.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2014 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.encode;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import android.telephony.PhoneNumberUtils;
+
+/**
+ * @author Sean Owen
+ */
+final class VCardTelDisplayFormatter implements Formatter {
+
+ private final List<Map<String,Set<String>>> metadataForIndex;
+
+ VCardTelDisplayFormatter() {
+ this(null);
+ }
+
+ VCardTelDisplayFormatter(List<Map<String,Set<String>>> metadataForIndex) {
+ this.metadataForIndex = metadataForIndex;
+ }
+
+ @Override
+ public CharSequence format(CharSequence value, int index) {
+ value = PhoneNumberUtils.formatNumber(value.toString());
+ Map<String,Set<String>> metadata =
+ metadataForIndex == null || metadataForIndex.size() <= index ? null : metadataForIndex.get(index);
+ value = formatMetadata(value, metadata);
+ return value;
+ }
+
+ private static CharSequence formatMetadata(CharSequence value, Map<String,Set<String>> metadata) {
+ if (metadata == null || metadata.isEmpty()) {
+ return value;
+ }
+ StringBuilder withMetadata = new StringBuilder();
+ for (Map.Entry<String,Set<String>> metadatum : metadata.entrySet()) {
+ Set<String> values = metadatum.getValue();
+ if (values == null || values.isEmpty()) {
+ continue;
+ }
+ Iterator<String> valuesIt = values.iterator();
+ withMetadata.append(valuesIt.next());
+ while (valuesIt.hasNext()) {
+ withMetadata.append(',').append(valuesIt.next());
+ }
+ }
+ if (withMetadata.length() > 0) {
+ withMetadata.append(' ');
+ }
+ withMetadata.append(value);
+ return withMetadata;
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/history/DBHelper.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/history/DBHelper.java
new file mode 100755
index 0000000..290d867
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/history/DBHelper.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2009 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.history;
+
+import android.content.Context;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+
+/**
+ * @author Sean Owen
+ */
+final class DBHelper extends SQLiteOpenHelper {
+
+ private static final int DB_VERSION = 5;
+ private static final String DB_NAME = "barcode_scanner_history.db";
+ static final String TABLE_NAME = "history";
+ static final String ID_COL = "id";
+ static final String TEXT_COL = "text";
+ static final String FORMAT_COL = "format";
+ static final String DISPLAY_COL = "display";
+ static final String TIMESTAMP_COL = "timestamp";
+ static final String DETAILS_COL = "details";
+
+ DBHelper(Context context) {
+ super(context, DB_NAME, null, DB_VERSION);
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase sqLiteDatabase) {
+ sqLiteDatabase.execSQL(
+ "CREATE TABLE " + TABLE_NAME + " (" +
+ ID_COL + " INTEGER PRIMARY KEY, " +
+ TEXT_COL + " TEXT, " +
+ FORMAT_COL + " TEXT, " +
+ DISPLAY_COL + " TEXT, " +
+ TIMESTAMP_COL + " INTEGER, " +
+ DETAILS_COL + " TEXT);");
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
+ sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
+ onCreate(sqLiteDatabase);
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/history/HistoryActivity.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/history/HistoryActivity.java
new file mode 100755
index 0000000..555bf53
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/history/HistoryActivity.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2012 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.history;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.ListActivity;
+import android.content.ActivityNotFoundException;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.util.Log;
+import android.view.ContextMenu;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+
+import com.alibaba.weex.R;
+import com.google.zxing.client.android.CaptureActivity;
+import com.google.zxing.client.android.Intents;
+
+public final class HistoryActivity extends ListActivity {
+
+ private static final String TAG = HistoryActivity.class.getSimpleName();
+
+ private HistoryManager historyManager;
+ private ArrayAdapter<HistoryItem> adapter;
+ private CharSequence originalTitle;
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ this.historyManager = new HistoryManager(this);
+ adapter = new HistoryItemAdapter(this);
+ setListAdapter(adapter);
+ View listview = getListView();
+ registerForContextMenu(listview);
+ originalTitle = getTitle();
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ reloadHistoryItems();
+ }
+
+ private void reloadHistoryItems() {
+ Iterable<HistoryItem> items = historyManager.buildHistoryItems();
+ adapter.clear();
+ for (HistoryItem item : items) {
+ adapter.add(item);
+ }
+ setTitle(originalTitle + " (" + adapter.getCount() + ')');
+ if (adapter.isEmpty()) {
+ adapter.add(new HistoryItem(null, null, null));
+ }
+ }
+
+ @Override
+ protected void onListItemClick(ListView l, View v, int position, long id) {
+ if (adapter.getItem(position).getResult() != null) {
+ Intent intent = new Intent(this, CaptureActivity.class);
+ intent.putExtra(Intents.History.ITEM_NUMBER, position);
+ setResult(Activity.RESULT_OK, intent);
+ finish();
+ }
+ }
+
+ @Override
+ public void onCreateContextMenu(ContextMenu menu,
+ View v,
+ ContextMenu.ContextMenuInfo menuInfo) {
+ int position = ((AdapterView.AdapterContextMenuInfo) menuInfo).position;
+ if (position >= adapter.getCount() || adapter.getItem(position).getResult() != null) {
+ menu.add(Menu.NONE, position, position, R.string.history_clear_one_history_text);
+ } // else it's just that dummy "Empty" message
+ }
+
+ @Override
+ public boolean onContextItemSelected(MenuItem item) {
+ int position = item.getItemId();
+ historyManager.deleteHistoryItem(position);
+ reloadHistoryItems();
+ return true;
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ if (historyManager.hasHistoryItems()) {
+ MenuInflater menuInflater = getMenuInflater();
+ menuInflater.inflate(R.menu.history, menu);
+ }
+ return super.onCreateOptionsMenu(menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ int i = item.getItemId();
+ if (i == R.id.menu_history_send) {
+ CharSequence history = historyManager.buildHistory();
+ Parcelable historyFile = HistoryManager.saveHistory(history.toString());
+ if (historyFile == null) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setMessage(R.string.msg_unmount_usb);
+ builder.setPositiveButton(R.string.button_ok, null);
+ builder.show();
+ } else {
+ Intent intent = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+ String subject = getResources().getString(R.string.history_email_title);
+ intent.putExtra(Intent.EXTRA_SUBJECT, subject);
+ intent.putExtra(Intent.EXTRA_TEXT, subject);
+ intent.putExtra(Intent.EXTRA_STREAM, historyFile);
+ intent.setType("text/csv");
+ try {
+ startActivity(intent);
+ } catch (ActivityNotFoundException anfe) {
+ Log.w(TAG, anfe.toString());
+ }
+ }
+
+ } else if (i == R.id.menu_history_clear_text) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setMessage(R.string.msg_sure);
+ builder.setCancelable(true);
+ builder.setPositiveButton(R.string.button_ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int i2) {
+ historyManager.clearHistory();
+ dialog.dismiss();
+ finish();
+ }
+ });
+ builder.setNegativeButton(R.string.button_cancel, null);
+ builder.show();
+
+ } else {
+ return super.onOptionsItemSelected(item);
+ }
+ return true;
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/history/HistoryItem.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/history/HistoryItem.java
new file mode 100755
index 0000000..45da8bd
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/history/HistoryItem.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2012 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.history;
+
+import com.google.zxing.Result;
+
+public final class HistoryItem {
+
+ private final Result result;
+ private final String display;
+ private final String details;
+
+ HistoryItem(Result result, String display, String details) {
+ this.result = result;
+ this.display = display;
+ this.details = details;
+ }
+
+ public Result getResult() {
+ return result;
+ }
+
+ public String getDisplayAndDetails() {
+ StringBuilder displayResult = new StringBuilder();
+ if (display == null || display.isEmpty()) {
+ displayResult.append(result.getText());
+ } else {
+ displayResult.append(display);
+ }
+ if (details != null && !details.isEmpty()) {
+ displayResult.append(" : ").append(details);
+ }
+ return displayResult.toString();
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/history/HistoryItemAdapter.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/history/HistoryItemAdapter.java
new file mode 100755
index 0000000..1ebb21c
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/history/HistoryItemAdapter.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2012 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.history;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.alibaba.weex.R;
+import com.google.zxing.Result;
+
+import java.util.ArrayList;
+
+final class HistoryItemAdapter extends ArrayAdapter<HistoryItem> {
+
+ private final Context activity;
+
+ HistoryItemAdapter(Context activity) {
+ super(activity, R.layout.history_list_item, new ArrayList<HistoryItem>());
+ this.activity = activity;
+ }
+
+ @Override
+ public View getView(int position, View view, ViewGroup viewGroup) {
+ View layout;
+ if (view instanceof LinearLayout) {
+ layout = view;
+ } else {
+ LayoutInflater factory = LayoutInflater.from(activity);
+ layout = factory.inflate(R.layout.history_list_item, viewGroup, false);
+ }
+
+ HistoryItem item = getItem(position);
+ Result result = item.getResult();
+
+ CharSequence title;
+ CharSequence detail;
+ if (result != null) {
+ title = result.getText();
+ detail = item.getDisplayAndDetails();
+ } else {
+ Resources resources = getContext().getResources();
+ title = resources.getString(R.string.history_empty);
+ detail = resources.getString(R.string.history_empty_detail);
+ }
+
+ ((TextView) layout.findViewById(R.id.history_title)).setText(title);
+ ((TextView) layout.findViewById(R.id.history_detail)).setText(detail);
+
+ return layout;
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/history/HistoryManager.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/history/HistoryManager.java
new file mode 100755
index 0000000..281ae82
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/history/HistoryManager.java
@@ -0,0 +1,366 @@
+/*
+ * Copyright (C) 2009 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.history;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.nio.charset.Charset;
+import java.text.DateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import android.app.Activity;
+import android.content.ContentValues;
+import android.content.SharedPreferences;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteException;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.net.Uri;
+import android.os.Environment;
+import android.preference.PreferenceManager;
+import android.util.Log;
+
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.Result;
+import com.google.zxing.client.android.Intents;
+import com.google.zxing.client.android.PreferencesActivity;
+import com.google.zxing.client.android.result.ResultHandler;
+
+/**
+ * <p>Manages functionality related to scan history.</p>
+ *
+ * @author Sean Owen
+ */
+public final class HistoryManager {
+
+ private static final String TAG = HistoryManager.class.getSimpleName();
+
+ private static final int MAX_ITEMS = 2000;
+
+ private static final String[] COLUMNS = {
+ DBHelper.TEXT_COL,
+ DBHelper.DISPLAY_COL,
+ DBHelper.FORMAT_COL,
+ DBHelper.TIMESTAMP_COL,
+ DBHelper.DETAILS_COL,
+ };
+
+ private static final String[] COUNT_COLUMN = { "COUNT(1)" };
+
+ private static final String[] ID_COL_PROJECTION = { DBHelper.ID_COL };
+ private static final String[] ID_DETAIL_COL_PROJECTION = { DBHelper.ID_COL, DBHelper.DETAILS_COL };
+
+ private final Activity activity;
+ private final boolean enableHistory;
+
+ public HistoryManager(Activity activity) {
+ this.activity = activity;
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
+ enableHistory = prefs.getBoolean(PreferencesActivity.KEY_ENABLE_HISTORY, true);
+ }
+
+ public boolean hasHistoryItems() {
+ SQLiteOpenHelper helper = new DBHelper(activity);
+ SQLiteDatabase db = null;
+ Cursor cursor = null;
+ try {
+ db = helper.getReadableDatabase();
+ cursor = db.query(DBHelper.TABLE_NAME, COUNT_COLUMN, null, null, null, null, null);
+ cursor.moveToFirst();
+ return cursor.getInt(0) > 0;
+ } finally {
+ close(cursor, db);
+ }
+ }
+
+ public List<HistoryItem> buildHistoryItems() {
+ SQLiteOpenHelper helper = new DBHelper(activity);
+ List<HistoryItem> items = new ArrayList<>();
+ SQLiteDatabase db = null;
+ Cursor cursor = null;
+ try {
+ db = helper.getReadableDatabase();
+ cursor = db.query(DBHelper.TABLE_NAME, COLUMNS, null, null, null, null, DBHelper.TIMESTAMP_COL + " DESC");
+ while (cursor.moveToNext()) {
+ String text = cursor.getString(0);
+ String display = cursor.getString(1);
+ String format = cursor.getString(2);
+ long timestamp = cursor.getLong(3);
+ String details = cursor.getString(4);
+ Result result = new Result(text, null, null, BarcodeFormat.valueOf(format), timestamp);
+ items.add(new HistoryItem(result, display, details));
+ }
+ } finally {
+ close(cursor, db);
+ }
+ return items;
+ }
+
+ public HistoryItem buildHistoryItem(int number) {
+ SQLiteOpenHelper helper = new DBHelper(activity);
+ SQLiteDatabase db = null;
+ Cursor cursor = null;
+ try {
+ db = helper.getReadableDatabase();
+ cursor = db.query(DBHelper.TABLE_NAME, COLUMNS, null, null, null, null, DBHelper.TIMESTAMP_COL + " DESC");
+ cursor.move(number + 1);
+ String text = cursor.getString(0);
+ String display = cursor.getString(1);
+ String format = cursor.getString(2);
+ long timestamp = cursor.getLong(3);
+ String details = cursor.getString(4);
+ Result result = new Result(text, null, null, BarcodeFormat.valueOf(format), timestamp);
+ return new HistoryItem(result, display, details);
+ } finally {
+ close(cursor, db);
+ }
+ }
+
+ public void deleteHistoryItem(int number) {
+ SQLiteOpenHelper helper = new DBHelper(activity);
+ SQLiteDatabase db = null;
+ Cursor cursor = null;
+ try {
+ db = helper.getWritableDatabase();
+ cursor = db.query(DBHelper.TABLE_NAME,
+ ID_COL_PROJECTION,
+ null, null, null, null,
+ DBHelper.TIMESTAMP_COL + " DESC");
+ cursor.move(number + 1);
+ db.delete(DBHelper.TABLE_NAME, DBHelper.ID_COL + '=' + cursor.getString(0), null);
+ } finally {
+ close(cursor, db);
+ }
+ }
+
+ public void addHistoryItem(Result result, ResultHandler handler) {
+ // Do not save this item to the history if the preference is turned off, or the contents are
+ // considered secure.
+ if (!activity.getIntent().getBooleanExtra(Intents.Scan.SAVE_HISTORY, true) ||
+ handler.areContentsSecure() || !enableHistory) {
+ return;
+ }
+
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
+ if (!prefs.getBoolean(PreferencesActivity.KEY_REMEMBER_DUPLICATES, false)) {
+ deletePrevious(result.getText());
+ }
+
+ ContentValues values = new ContentValues();
+ values.put(DBHelper.TEXT_COL, result.getText());
+ values.put(DBHelper.FORMAT_COL, result.getBarcodeFormat().toString());
+ values.put(DBHelper.DISPLAY_COL, handler.getDisplayContents().toString());
+ values.put(DBHelper.TIMESTAMP_COL, System.currentTimeMillis());
+
+ SQLiteOpenHelper helper = new DBHelper(activity);
+ SQLiteDatabase db = null;
+ try {
+ db = helper.getWritableDatabase();
+ // Insert the new entry into the DB.
+ db.insert(DBHelper.TABLE_NAME, DBHelper.TIMESTAMP_COL, values);
+ } finally {
+ close(null, db);
+ }
+ }
+
+ public void addHistoryItemDetails(String itemID, String itemDetails) {
+ // As we're going to do an update only we don't need need to worry
+ // about the preferences; if the item wasn't saved it won't be udpated
+ SQLiteOpenHelper helper = new DBHelper(activity);
+ SQLiteDatabase db = null;
+ Cursor cursor = null;
+ try {
+ db = helper.getWritableDatabase();
+ cursor = db.query(DBHelper.TABLE_NAME,
+ ID_DETAIL_COL_PROJECTION,
+ DBHelper.TEXT_COL + "=?",
+ new String[] { itemID },
+ null,
+ null,
+ DBHelper.TIMESTAMP_COL + " DESC",
+ "1");
+ String oldID = null;
+ String oldDetails = null;
+ if (cursor.moveToNext()) {
+ oldID = cursor.getString(0);
+ oldDetails = cursor.getString(1);
+ }
+
+ if (oldID != null) {
+ String newDetails;
+ if (oldDetails == null) {
+ newDetails = itemDetails;
+ } else if (oldDetails.contains(itemDetails)) {
+ newDetails = null;
+ } else {
+ newDetails = oldDetails + " : " + itemDetails;
+ }
+ if (newDetails != null) {
+ ContentValues values = new ContentValues();
+ values.put(DBHelper.DETAILS_COL, newDetails);
+ db.update(DBHelper.TABLE_NAME, values, DBHelper.ID_COL + "=?", new String[] { oldID });
+ }
+ }
+
+ } finally {
+ close(cursor, db);
+ }
+ }
+
+ private void deletePrevious(String text) {
+ SQLiteOpenHelper helper = new DBHelper(activity);
+ SQLiteDatabase db = null;
+ try {
+ db = helper.getWritableDatabase();
+ db.delete(DBHelper.TABLE_NAME, DBHelper.TEXT_COL + "=?", new String[] { text });
+ } finally {
+ close(null, db);
+ }
+ }
+
+ public void trimHistory() {
+ SQLiteOpenHelper helper = new DBHelper(activity);
+ SQLiteDatabase db = null;
+ Cursor cursor = null;
+ try {
+ db = helper.getWritableDatabase();
+ cursor = db.query(DBHelper.TABLE_NAME,
+ ID_COL_PROJECTION,
+ null, null, null, null,
+ DBHelper.TIMESTAMP_COL + " DESC");
+ cursor.move(MAX_ITEMS);
+ while (cursor.moveToNext()) {
+ String id = cursor.getString(0);
+ Log.i(TAG, "Deleting scan history ID " + id);
+ db.delete(DBHelper.TABLE_NAME, DBHelper.ID_COL + '=' + id, null);
+ }
+ } catch (SQLiteException sqle) {
+ // We're seeing an error here when called in CaptureActivity.onCreate() in rare cases
+ // and don't understand it. First theory is that it's transient so can be safely ignored.
+ Log.w(TAG, sqle);
+ // continue
+ } finally {
+ close(cursor, db);
+ }
+ }
+
+ /**
+ * <p>Builds a text representation of the scanning history. Each scan is encoded on one
+ * line, terminated by a line break (\r\n). The values in each line are comma-separated,
+ * and double-quoted. Double-quotes within values are escaped with a sequence of two
+ * double-quotes. The fields output are:</p>
+ *
+ * <ol>
+ * <li>Raw text</li>
+ * <li>Display text</li>
+ * <li>Format (e.g. QR_CODE)</li>
+ * <li>Unix timestamp (milliseconds since the epoch)</li>
+ * <li>Formatted version of timestamp</li>
+ * <li>Supplemental info (e.g. price info for a product barcode)</li>
+ * </ol>
+ */
+ CharSequence buildHistory() {
+ SQLiteOpenHelper helper = new DBHelper(activity);
+ SQLiteDatabase db = null;
+ Cursor cursor = null;
+ try {
+ db = helper.getWritableDatabase();
+ cursor = db.query(DBHelper.TABLE_NAME,
+ COLUMNS,
+ null, null, null, null,
+ DBHelper.TIMESTAMP_COL + " DESC");
+
+ DateFormat format = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
+ StringBuilder historyText = new StringBuilder(1000);
+ while (cursor.moveToNext()) {
+
+ historyText.append('"').append(massageHistoryField(cursor.getString(0))).append("\",");
+ historyText.append('"').append(massageHistoryField(cursor.getString(1))).append("\",");
+ historyText.append('"').append(massageHistoryField(cursor.getString(2))).append("\",");
+ historyText.append('"').append(massageHistoryField(cursor.getString(3))).append("\",");
+
+ // Add timestamp again, formatted
+ long timestamp = cursor.getLong(3);
+ historyText.append('"').append(massageHistoryField(
+ format.format(new Date(timestamp)))).append("\",");
+
+ // Above we're preserving the old ordering of columns which had formatted data in position 5
+
+ historyText.append('"').append(massageHistoryField(cursor.getString(4))).append("\"\r\n");
+ }
+ return historyText;
+ } finally {
+ close(cursor, db);
+ }
+ }
+
+ void clearHistory() {
+ SQLiteOpenHelper helper = new DBHelper(activity);
+ SQLiteDatabase db = null;
+ try {
+ db = helper.getWritableDatabase();
+ db.delete(DBHelper.TABLE_NAME, null, null);
+ } finally {
+ close(null, db);
+ }
+ }
+
+ static Uri saveHistory(String history) {
+ File bsRoot = new File(Environment.getExternalStorageDirectory(), "BarcodeScanner");
+ File historyRoot = new File(bsRoot, "History");
+ if (!historyRoot.exists() && !historyRoot.mkdirs()) {
+ Log.w(TAG, "Couldn't make dir " + historyRoot);
+ return null;
+ }
+ File historyFile = new File(historyRoot, "history-" + System.currentTimeMillis() + ".csv");
+ OutputStreamWriter out = null;
+ try {
+ out = new OutputStreamWriter(new FileOutputStream(historyFile), Charset.forName("UTF-8"));
+ out.write(history);
+ return Uri.parse("file://" + historyFile.getAbsolutePath());
+ } catch (IOException ioe) {
+ Log.w(TAG, "Couldn't access file " + historyFile + " due to " + ioe);
+ return null;
+ } finally {
+ if (out != null) {
+ try {
+ out.close();
+ } catch (IOException ioe) {
+ // do nothing
+ }
+ }
+ }
+ }
+
+ private static String massageHistoryField(String value) {
+ return value == null ? "" : value.replace("\"","\"\"");
+ }
+
+ private static void close(Cursor cursor, SQLiteDatabase database) {
+ if (cursor != null) {
+ cursor.close();
+ }
+ if (database != null) {
+ database.close();
+ }
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/AddressBookResultHandler.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/AddressBookResultHandler.java
new file mode 100755
index 0000000..70d48a2
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/AddressBookResultHandler.java
@@ -0,0 +1,219 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.result;
+
+import android.app.Activity;
+import android.telephony.PhoneNumberUtils;
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.style.StyleSpan;
+
+import com.alibaba.weex.R;
+import com.google.zxing.client.result.AddressBookParsedResult;
+import com.google.zxing.client.result.ParsedResult;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * Handles address book entries.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+public final class AddressBookResultHandler extends ResultHandler {
+
+ private static final DateFormat[] DATE_FORMATS = {
+ new SimpleDateFormat("yyyyMMdd", Locale.ENGLISH),
+ new SimpleDateFormat("yyyyMMdd'T'HHmmss", Locale.ENGLISH),
+ new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH),
+ new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.ENGLISH),
+ };
+ static {
+ for (DateFormat format : DATE_FORMATS) {
+ format.setLenient(false);
+ }
+ }
+
+ private static final int[] BUTTON_TEXTS = {
+ R.string.button_add_contact,
+ R.string.button_show_map,
+ R.string.button_dial,
+ R.string.button_email,
+ };
+
+ private final boolean[] fields;
+ private int buttonCount;
+
+ // This takes all the work out of figuring out which buttons/actions should be in which
+ // positions, based on which fields are present in this barcode.
+ private int mapIndexToAction(int index) {
+ if (index < buttonCount) {
+ int count = -1;
+ for (int x = 0; x < MAX_BUTTON_COUNT; x++) {
+ if (fields[x]) {
+ count++;
+ }
+ if (count == index) {
+ return x;
+ }
+ }
+ }
+ return -1;
+ }
+
+ public AddressBookResultHandler(Activity activity, ParsedResult result) {
+ super(activity, result);
+ AddressBookParsedResult addressResult = (AddressBookParsedResult) result;
+ String[] addresses = addressResult.getAddresses();
+ boolean hasAddress = addresses != null && addresses.length > 0 && addresses[0] != null && !addresses[0].isEmpty();
+ String[] phoneNumbers = addressResult.getPhoneNumbers();
+ boolean hasPhoneNumber = phoneNumbers != null && phoneNumbers.length > 0;
+ String[] emails = addressResult.getEmails();
+ boolean hasEmailAddress = emails != null && emails.length > 0;
+
+ fields = new boolean[MAX_BUTTON_COUNT];
+ fields[0] = true; // Add contact is always available
+ fields[1] = hasAddress;
+ fields[2] = hasPhoneNumber;
+ fields[3] = hasEmailAddress;
+
+ buttonCount = 0;
+ for (int x = 0; x < MAX_BUTTON_COUNT; x++) {
+ if (fields[x]) {
+ buttonCount++;
+ }
+ }
+ }
+
+ @Override
+ public int getButtonCount() {
+ return buttonCount;
+ }
+
+ @Override
+ public int getButtonText(int index) {
+ return BUTTON_TEXTS[mapIndexToAction(index)];
+ }
+
+ @Override
+ public void handleButtonPress(int index) {
+ AddressBookParsedResult addressResult = (AddressBookParsedResult) getResult();
+ String[] addresses = addressResult.getAddresses();
+ String address1 = addresses == null || addresses.length < 1 ? null : addresses[0];
+ String[] addressTypes = addressResult.getAddressTypes();
+ String address1Type = addressTypes == null || addressTypes.length < 1 ? null : addressTypes[0];
+ int action = mapIndexToAction(index);
+ switch (action) {
+ case 0:
+ addContact(addressResult.getNames(),
+ addressResult.getNicknames(),
+ addressResult.getPronunciation(),
+ addressResult.getPhoneNumbers(),
+ addressResult.getPhoneTypes(),
+ addressResult.getEmails(),
+ addressResult.getEmailTypes(),
+ addressResult.getNote(),
+ addressResult.getInstantMessenger(),
+ address1,
+ address1Type,
+ addressResult.getOrg(),
+ addressResult.getTitle(),
+ addressResult.getURLs(),
+ addressResult.getBirthday(),
+ addressResult.getGeo());
+ break;
+ case 1:
+ searchMap(address1);
+ break;
+ case 2:
+ dialPhone(addressResult.getPhoneNumbers()[0]);
+ break;
+ case 3:
+ sendEmail(addressResult.getEmails(), null, null, null, null);
+ break;
+ default:
+ break;
+ }
+ }
+
+ private static Date parseDate(String s) {
+ for (DateFormat currentFormat : DATE_FORMATS) {
+ try {
+ return currentFormat.parse(s);
+ } catch (ParseException e) {
+ // continue
+ }
+ }
+ return null;
+ }
+
+ // Overriden so we can hyphenate phone numbers, format birthdays, and bold the name.
+ @Override
+ public CharSequence getDisplayContents() {
+ AddressBookParsedResult result = (AddressBookParsedResult) getResult();
+ StringBuilder contents = new StringBuilder(100);
+ ParsedResult.maybeAppend(result.getNames(), contents);
+ int namesLength = contents.length();
+
+ String pronunciation = result.getPronunciation();
+ if (pronunciation != null && !pronunciation.isEmpty()) {
+ contents.append("\n(");
+ contents.append(pronunciation);
+ contents.append(')');
+ }
+
+ ParsedResult.maybeAppend(result.getTitle(), contents);
+ ParsedResult.maybeAppend(result.getOrg(), contents);
+ ParsedResult.maybeAppend(result.getAddresses(), contents);
+ String[] numbers = result.getPhoneNumbers();
+ if (numbers != null) {
+ for (String number : numbers) {
+ if (number != null) {
+ ParsedResult.maybeAppend(PhoneNumberUtils.formatNumber(number), contents);
+ }
+ }
+ }
+ ParsedResult.maybeAppend(result.getEmails(), contents);
+ ParsedResult.maybeAppend(result.getURLs(), contents);
+
+ String birthday = result.getBirthday();
+ if (birthday != null && !birthday.isEmpty()) {
+ Date date = parseDate(birthday);
+ if (date != null) {
+ ParsedResult.maybeAppend(DateFormat.getDateInstance(DateFormat.MEDIUM).format(date.getTime()), contents);
+ }
+ }
+ ParsedResult.maybeAppend(result.getNote(), contents);
+
+ if (namesLength > 0) {
+ // Bold the full name to make it stand out a bit.
+ Spannable styled = new SpannableString(contents.toString());
+ styled.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, namesLength, 0);
+ return styled;
+ } else {
+ return contents.toString();
+ }
+ }
+
+ @Override
+ public int getDisplayTitle() {
+ return R.string.result_address_book;
+ }
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/CalendarResultHandler.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/CalendarResultHandler.java
new file mode 100755
index 0000000..29d9520
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/CalendarResultHandler.java
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.result;
+
+import android.app.Activity;
+import android.content.ActivityNotFoundException;
+import android.content.Intent;
+import android.util.Log;
+
+import com.alibaba.weex.R;
+import com.google.zxing.client.result.CalendarParsedResult;
+import com.google.zxing.client.result.ParsedResult;
+
+import java.text.DateFormat;
+import java.util.Date;
+
+/**
+ * Handles calendar entries encoded in QR Codes.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ * @author Sean Owen
+ */
+public final class CalendarResultHandler extends ResultHandler {
+
+ private static final String TAG = CalendarResultHandler.class.getSimpleName();
+
+ private static final int[] buttons = {
+ R.string.button_add_calendar
+ };
+
+ public CalendarResultHandler(Activity activity, ParsedResult result) {
+ super(activity, result);
+ }
+
+ @Override
+ public int getButtonCount() {
+ return buttons.length;
+ }
+
+ @Override
+ public int getButtonText(int index) {
+ return buttons[index];
+ }
+
+ @Override
+ public void handleButtonPress(int index) {
+ if (index == 0) {
+ CalendarParsedResult calendarResult = (CalendarParsedResult) getResult();
+
+ String description = calendarResult.getDescription();
+ String organizer = calendarResult.getOrganizer();
+ if (organizer != null) { // No separate Intent key, put in description
+ if (description == null) {
+ description = organizer;
+ } else {
+ description = description + '\n' + organizer;
+ }
+ }
+
+ addCalendarEvent(calendarResult.getSummary(),
+ calendarResult.getStart(),
+ calendarResult.isStartAllDay(),
+ calendarResult.getEnd(),
+ calendarResult.getLocation(),
+ description,
+ calendarResult.getAttendees());
+ }
+ }
+
+ /**
+ * Sends an intent to create a new calendar event by prepopulating the Add Event UI. Older
+ * versions of the system have a bug where the event title will not be filled out.
+ *
+ * @param summary A description of the event
+ * @param start The start time
+ * @param allDay if true, event is considered to be all day starting from start time
+ * @param end The end time (optional)
+ * @param location a text description of the event location
+ * @param description a text description of the event itself
+ * @param attendees attendees to invite
+ */
+ private void addCalendarEvent(String summary,
+ Date start,
+ boolean allDay,
+ Date end,
+ String location,
+ String description,
+ String[] attendees) {
+ Intent intent = new Intent(Intent.ACTION_INSERT);
+ intent.setType("vnd.android.cursor.item/event");
+ long startMilliseconds = start.getTime();
+ intent.putExtra("beginTime", startMilliseconds);
+ if (allDay) {
+ intent.putExtra("allDay", true);
+ }
+ long endMilliseconds;
+ if (end == null) {
+ if (allDay) {
+ // + 1 day
+ endMilliseconds = startMilliseconds + 24 * 60 * 60 * 1000;
+ } else {
+ endMilliseconds = startMilliseconds;
+ }
+ } else {
+ endMilliseconds = end.getTime();
+ }
+ intent.putExtra("endTime", endMilliseconds);
+ intent.putExtra("title", summary);
+ intent.putExtra("eventLocation", location);
+ intent.putExtra("description", description);
+ if (attendees != null) {
+ intent.putExtra(Intent.EXTRA_EMAIL, attendees);
+ // Documentation says this is either a String[] or comma-separated String, which is right?
+ }
+
+ try {
+ // Do this manually at first
+ rawLaunchIntent(intent);
+ } catch (ActivityNotFoundException anfe) {
+ Log.w(TAG, "No calendar app available that responds to " + Intent.ACTION_INSERT);
+ // For calendar apps that don't like "INSERT":
+ intent.setAction(Intent.ACTION_EDIT);
+ launchIntent(intent); // Fail here for real if nothing can handle it
+ }
+ }
+
+
+ @Override
+ public CharSequence getDisplayContents() {
+
+ CalendarParsedResult calResult = (CalendarParsedResult) getResult();
+ StringBuilder result = new StringBuilder(100);
+
+ ParsedResult.maybeAppend(calResult.getSummary(), result);
+
+ Date start = calResult.getStart();
+ ParsedResult.maybeAppend(format(calResult.isStartAllDay(), start), result);
+
+ Date end = calResult.getEnd();
+ if (end != null) {
+ if (calResult.isEndAllDay() && !start.equals(end)) {
+ // Show only year/month/day
+ // if it's all-day and this is the end date, it's exclusive, so show the user
+ // that it ends on the day before to make more intuitive sense.
+ // But don't do it if the event already (incorrectly?) specifies the same start/end
+ end = new Date(end.getTime() - 24 * 60 * 60 * 1000);
+ }
+ ParsedResult.maybeAppend(format(calResult.isEndAllDay(), end), result);
+ }
+
+ ParsedResult.maybeAppend(calResult.getLocation(), result);
+ ParsedResult.maybeAppend(calResult.getOrganizer(), result);
+ ParsedResult.maybeAppend(calResult.getAttendees(), result);
+ ParsedResult.maybeAppend(calResult.getDescription(), result);
+ return result.toString();
+ }
+
+ private static String format(boolean allDay, Date date) {
+ if (date == null) {
+ return null;
+ }
+ DateFormat format = allDay
+ ? DateFormat.getDateInstance(DateFormat.MEDIUM)
+ : DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
+ return format.format(date);
+ }
+
+ @Override
+ public int getDisplayTitle() {
+ return R.string.result_calendar;
+ }
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/EmailAddressResultHandler.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/EmailAddressResultHandler.java
new file mode 100755
index 0000000..d05db00
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/EmailAddressResultHandler.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.result;
+
+import android.app.Activity;
+
+import com.alibaba.weex.R;
+import com.google.zxing.client.result.EmailAddressParsedResult;
+import com.google.zxing.client.result.ParsedResult;
+
+/**
+ * Handles email addresses.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+public final class EmailAddressResultHandler extends ResultHandler {
+ private static final int[] buttons = {
+ R.string.button_email,
+ R.string.button_add_contact
+ };
+
+ public EmailAddressResultHandler(Activity activity, ParsedResult result) {
+ super(activity, result);
+ }
+
+ @Override
+ public int getButtonCount() {
+ return buttons.length;
+ }
+
+ @Override
+ public int getButtonText(int index) {
+ return buttons[index];
+ }
+
+ @Override
+ public void handleButtonPress(int index) {
+ EmailAddressParsedResult emailResult = (EmailAddressParsedResult) getResult();
+ switch (index) {
+ case 0:
+ sendEmail(emailResult.getTos(),
+ emailResult.getCCs(),
+ emailResult.getBCCs(),
+ emailResult.getSubject(),
+ emailResult.getBody());
+ break;
+ case 1:
+ addEmailOnlyContact(emailResult.getTos(), null);
+ break;
+ }
+ }
+
+ @Override
+ public int getDisplayTitle() {
+ return R.string.result_email_address;
+ }
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/GeoResultHandler.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/GeoResultHandler.java
new file mode 100755
index 0000000..1fed4e5
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/GeoResultHandler.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.result;
+
+import android.app.Activity;
+
+import com.alibaba.weex.R;
+import com.google.zxing.client.result.GeoParsedResult;
+import com.google.zxing.client.result.ParsedResult;
+
+/**
+ * Handles geographic coordinates (typically encoded as geo: URLs).
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+public final class GeoResultHandler extends ResultHandler {
+ private static final int[] buttons = {
+ R.string.button_show_map,
+ R.string.button_get_directions
+ };
+
+ public GeoResultHandler(Activity activity, ParsedResult result) {
+ super(activity, result);
+ }
+
+ @Override
+ public int getButtonCount() {
+ return buttons.length;
+ }
+
+ @Override
+ public int getButtonText(int index) {
+ return buttons[index];
+ }
+
+ @Override
+ public void handleButtonPress(int index) {
+ GeoParsedResult geoResult = (GeoParsedResult) getResult();
+ switch (index) {
+ case 0:
+ openMap(geoResult.getGeoURI());
+ break;
+ case 1:
+ getDirections(geoResult.getLatitude(), geoResult.getLongitude());
+ break;
+ }
+ }
+
+ @Override
+ public int getDisplayTitle() {
+ return R.string.result_geo;
+ }
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/ISBNResultHandler.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/ISBNResultHandler.java
new file mode 100755
index 0000000..dbe2f1b
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/ISBNResultHandler.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.result;
+
+import android.app.Activity;
+
+import com.alibaba.weex.R;
+import com.google.zxing.Result;
+import com.google.zxing.client.result.ISBNParsedResult;
+import com.google.zxing.client.result.ParsedResult;
+
+/**
+ * Handles books encoded by their ISBN values.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+public final class ISBNResultHandler extends ResultHandler {
+ private static final int[] buttons = {
+ R.string.button_product_search,
+ R.string.button_book_search,
+ R.string.button_search_book_contents,
+ R.string.button_custom_product_search
+ };
+
+ public ISBNResultHandler(Activity activity, ParsedResult result, Result rawResult) {
+ super(activity, result, rawResult);
+ }
+
+ @Override
+ public int getButtonCount() {
+ return hasCustomProductSearch() ? buttons.length : buttons.length - 1;
+ }
+
+ @Override
+ public int getButtonText(int index) {
+ return buttons[index];
+ }
+
+ @Override
+ public void handleButtonPress(int index) {
+ ISBNParsedResult isbnResult = (ISBNParsedResult) getResult();
+ switch (index) {
+ case 0:
+ openProductSearch(isbnResult.getISBN());
+ break;
+ case 1:
+ openBookSearch(isbnResult.getISBN());
+ break;
+ case 2:
+ searchBookContents(isbnResult.getISBN());
+ break;
+ case 3:
+ openURL(fillInCustomSearchURL(isbnResult.getISBN()));
+ break;
+ }
+ }
+
+ @Override
+ public int getDisplayTitle() {
+ return R.string.result_isbn;
+ }
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/ProductResultHandler.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/ProductResultHandler.java
new file mode 100755
index 0000000..c8e5159
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/ProductResultHandler.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.result;
+
+import android.app.Activity;
+
+import com.alibaba.weex.R;
+import com.google.zxing.Result;
+import com.google.zxing.client.result.ExpandedProductParsedResult;
+import com.google.zxing.client.result.ParsedResult;
+import com.google.zxing.client.result.ProductParsedResult;
+
+/**
+ * Handles generic products which are not books.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+public final class ProductResultHandler extends ResultHandler {
+ private static final int[] buttons = {
+ R.string.button_product_search,
+ R.string.button_web_search,
+ R.string.button_custom_product_search
+ };
+
+ public ProductResultHandler(Activity activity, ParsedResult result, Result rawResult) {
+ super(activity, result, rawResult);
+ }
+
+ @Override
+ public int getButtonCount() {
+ return hasCustomProductSearch() ? buttons.length : buttons.length - 1;
+ }
+
+ @Override
+ public int getButtonText(int index) {
+ return buttons[index];
+ }
+
+ @Override
+ public void handleButtonPress(int index) {
+ String productID = getProductIDFromResult(getResult());
+ switch (index) {
+ case 0:
+ openProductSearch(productID);
+ break;
+ case 1:
+ webSearch(productID);
+ break;
+ case 2:
+ openURL(fillInCustomSearchURL(productID));
+ break;
+ }
+ }
+
+ private static String getProductIDFromResult(ParsedResult rawResult) {
+ if (rawResult instanceof ProductParsedResult) {
+ return ((ProductParsedResult) rawResult).getNormalizedProductID();
+ }
+ if (rawResult instanceof ExpandedProductParsedResult) {
+ return ((ExpandedProductParsedResult) rawResult).getRawText();
+ }
+ throw new IllegalArgumentException(rawResult.getClass().toString());
+ }
+
+ @Override
+ public int getDisplayTitle() {
+ return R.string.result_product;
+ }
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/ResultButtonListener.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/ResultButtonListener.java
new file mode 100755
index 0000000..2e107c4
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/ResultButtonListener.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.result;
+
+import android.view.View;
+
+/**
+ * Handles the result of barcode decoding in the context of the Android platform, by dispatching the
+ * proper intents to open other activities like GMail, Maps, etc.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+public final class ResultButtonListener implements View.OnClickListener {
+ private final ResultHandler resultHandler;
+ private final int index;
+
+ public ResultButtonListener(ResultHandler resultHandler, int index) {
+ this.resultHandler = resultHandler;
+ this.index = index;
+ }
+
+ @Override
+ public void onClick(View view) {
+ resultHandler.handleButtonPress(index);
+ }
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/ResultHandler.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/ResultHandler.java
new file mode 100755
index 0000000..92187e8
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/ResultHandler.java
@@ -0,0 +1,513 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.result;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.ActivityNotFoundException;
+import android.content.ContentValues;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.net.Uri;
+import android.preference.PreferenceManager;
+import android.provider.ContactsContract;
+import android.util.Log;
+
+import com.alibaba.weex.R;
+import com.google.zxing.Result;
+import com.google.zxing.client.android.Contents;
+import com.google.zxing.client.android.Intents;
+import com.google.zxing.client.android.LocaleManager;
+import com.google.zxing.client.android.PreferencesActivity;
+import com.google.zxing.client.android.book.SearchBookContentsActivity;
+import com.google.zxing.client.result.ParsedResult;
+import com.google.zxing.client.result.ParsedResultType;
+import com.google.zxing.client.result.ResultParser;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Locale;
+
+/**
+ * A base class for the Android-specific barcode handlers. These allow the app to polymorphically
+ * suggest the appropriate actions for each data type.
+ *
+ * This class also contains a bunch of utility methods to take common actions like opening a URL.
+ * They could easily be moved into a helper object, but it can't be static because the Activity
+ * instance is needed to launch an intent.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ * @author Sean Owen
+ */
+public abstract class ResultHandler {
+
+ private static final String TAG = ResultHandler.class.getSimpleName();
+
+ private static final String[] EMAIL_TYPE_STRINGS = {"home", "work", "mobile"};
+ private static final String[] PHONE_TYPE_STRINGS = {"home", "work", "mobile", "fax", "pager", "main"};
+ private static final String[] ADDRESS_TYPE_STRINGS = {"home", "work"};
+ private static final int[] EMAIL_TYPE_VALUES = {
+ ContactsContract.CommonDataKinds.Email.TYPE_HOME,
+ ContactsContract.CommonDataKinds.Email.TYPE_WORK,
+ ContactsContract.CommonDataKinds.Email.TYPE_MOBILE,
+ };
+ private static final int[] PHONE_TYPE_VALUES = {
+ ContactsContract.CommonDataKinds.Phone.TYPE_HOME,
+ ContactsContract.CommonDataKinds.Phone.TYPE_WORK,
+ ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE,
+ ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK,
+ ContactsContract.CommonDataKinds.Phone.TYPE_PAGER,
+ ContactsContract.CommonDataKinds.Phone.TYPE_MAIN,
+ };
+ private static final int[] ADDRESS_TYPE_VALUES = {
+ ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME,
+ ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK,
+ };
+ private static final int NO_TYPE = -1;
+
+ public static final int MAX_BUTTON_COUNT = 4;
+
+ private final ParsedResult result;
+ private final Activity activity;
+ private final Result rawResult;
+ private final String customProductSearch;
+
+ ResultHandler(Activity activity, ParsedResult result) {
+ this(activity, result, null);
+ }
+
+ ResultHandler(Activity activity, ParsedResult result, Result rawResult) {
+ this.result = result;
+ this.activity = activity;
+ this.rawResult = rawResult;
+ this.customProductSearch = parseCustomSearchURL();
+ }
+
+ public final ParsedResult getResult() {
+ return result;
+ }
+
+ final boolean hasCustomProductSearch() {
+ return customProductSearch != null;
+ }
+
+ final Activity getActivity() {
+ return activity;
+ }
+
+ /**
+ * Indicates how many buttons the derived class wants shown.
+ *
+ * @return The integer button count.
+ */
+ public abstract int getButtonCount();
+
+ /**
+ * The text of the nth action button.
+ *
+ * @param index From 0 to getButtonCount() - 1
+ * @return The button text as a resource ID
+ */
+ public abstract int getButtonText(int index);
+
+ public Integer getDefaultButtonID() {
+ return null;
+ }
+
+ /**
+ * Execute the action which corresponds to the nth button.
+ *
+ * @param index The button that was clicked.
+ */
+ public abstract void handleButtonPress(int index);
+
+ /**
+ * Some barcode contents are considered secure, and should not be saved to history, copied to
+ * the clipboard, or otherwise persisted.
+ *
+ * @return If true, do not create any permanent record of these contents.
+ */
+ public boolean areContentsSecure() {
+ return false;
+ }
+
+ /**
+ * Create a possibly styled string for the contents of the current barcode.
+ *
+ * @return The text to be displayed.
+ */
+ public CharSequence getDisplayContents() {
+ String contents = result.getDisplayResult();
+ return contents.replace("\r", "");
+ }
+
+ /**
+ * A string describing the kind of barcode that was found, e.g. "Found contact info".
+ *
+ * @return The resource ID of the string.
+ */
+ public abstract int getDisplayTitle();
+
+ /**
+ * A convenience method to get the parsed type. Should not be overridden.
+ *
+ * @return The parsed type, e.g. URI or ISBN
+ */
+ public final ParsedResultType getType() {
+ return result.getType();
+ }
+
+ final void addPhoneOnlyContact(String[] phoneNumbers,String[] phoneTypes) {
+ addContact(null, null, null, phoneNumbers, phoneTypes, null, null, null, null, null, null, null, null, null, null, null);
+ }
+
+ final void addEmailOnlyContact(String[] emails, String[] emailTypes) {
+ addContact(null, null, null, null, null, emails, emailTypes, null, null, null, null, null, null, null, null, null);
+ }
+
+ final void addContact(String[] names,
+ String[] nicknames,
+ String pronunciation,
+ String[] phoneNumbers,
+ String[] phoneTypes,
+ String[] emails,
+ String[] emailTypes,
+ String note,
+ String instantMessenger,
+ String address,
+ String addressType,
+ String org,
+ String title,
+ String[] urls,
+ String birthday,
+ String[] geo) {
+
+ // Only use the first name in the array, if present.
+ Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT, ContactsContract.Contacts.CONTENT_URI);
+ intent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE);
+ putExtra(intent, ContactsContract.Intents.Insert.NAME, names != null ? names[0] : null);
+
+ putExtra(intent, ContactsContract.Intents.Insert.PHONETIC_NAME, pronunciation);
+
+ int phoneCount = Math.min(phoneNumbers != null ? phoneNumbers.length : 0, Contents.PHONE_KEYS.length);
+ for (int x = 0; x < phoneCount; x++) {
+ putExtra(intent, Contents.PHONE_KEYS[x], phoneNumbers[x]);
+ if (phoneTypes != null && x < phoneTypes.length) {
+ int type = toPhoneContractType(phoneTypes[x]);
+ if (type >= 0) {
+ intent.putExtra(Contents.PHONE_TYPE_KEYS[x], type);
+ }
+ }
+ }
+
+ int emailCount = Math.min(emails != null ? emails.length : 0, Contents.EMAIL_KEYS.length);
+ for (int x = 0; x < emailCount; x++) {
+ putExtra(intent, Contents.EMAIL_KEYS[x], emails[x]);
+ if (emailTypes != null && x < emailTypes.length) {
+ int type = toEmailContractType(emailTypes[x]);
+ if (type >= 0) {
+ intent.putExtra(Contents.EMAIL_TYPE_KEYS[x], type);
+ }
+ }
+ }
+
+ ArrayList<ContentValues> data = new ArrayList<>();
+ if (urls != null) {
+ for (String url : urls) {
+ if (url != null && !url.isEmpty()) {
+ ContentValues row = new ContentValues(2);
+ row.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE);
+ row.put(ContactsContract.CommonDataKinds.Website.URL, url);
+ data.add(row);
+ break;
+ }
+ }
+ }
+
+ if (birthday != null) {
+ ContentValues row = new ContentValues(3);
+ row.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE);
+ row.put(ContactsContract.CommonDataKinds.Event.TYPE, ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY);
+ row.put(ContactsContract.CommonDataKinds.Event.START_DATE, birthday);
+ data.add(row);
+ }
+
+ if (nicknames != null) {
+ for (String nickname : nicknames) {
+ if (nickname != null && !nickname.isEmpty()) {
+ ContentValues row = new ContentValues(3);
+ row.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE);
+ row.put(ContactsContract.CommonDataKinds.Nickname.TYPE,
+ ContactsContract.CommonDataKinds.Nickname.TYPE_DEFAULT);
+ row.put(ContactsContract.CommonDataKinds.Nickname.NAME, nickname);
+ data.add(row);
+ break;
+ }
+ }
+ }
+
+ if (!data.isEmpty()) {
+ intent.putParcelableArrayListExtra(ContactsContract.Intents.Insert.DATA, data);
+ }
+
+ StringBuilder aggregatedNotes = new StringBuilder();
+ if (note != null) {
+ aggregatedNotes.append('\n').append(note);
+ }
+ if (geo != null) {
+ aggregatedNotes.append('\n').append(geo[0]).append(',').append(geo[1]);
+ }
+
+ if (aggregatedNotes.length() > 0) {
+ // Remove extra leading '\n'
+ putExtra(intent, ContactsContract.Intents.Insert.NOTES, aggregatedNotes.substring(1));
+ }
+
+ putExtra(intent, ContactsContract.Intents.Insert.IM_HANDLE, instantMessenger);
+ putExtra(intent, ContactsContract.Intents.Insert.POSTAL, address);
+ if (addressType != null) {
+ int type = toAddressContractType(addressType);
+ if (type >= 0) {
+ intent.putExtra(ContactsContract.Intents.Insert.POSTAL_TYPE, type);
+ }
+ }
+ putExtra(intent, ContactsContract.Intents.Insert.COMPANY, org);
+ putExtra(intent, ContactsContract.Intents.Insert.JOB_TITLE, title);
+ launchIntent(intent);
+ }
+
+ private static int toEmailContractType(String typeString) {
+ return doToContractType(typeString, EMAIL_TYPE_STRINGS, EMAIL_TYPE_VALUES);
+ }
+
+ private static int toPhoneContractType(String typeString) {
+ return doToContractType(typeString, PHONE_TYPE_STRINGS, PHONE_TYPE_VALUES);
+ }
+
+ private static int toAddressContractType(String typeString) {
+ return doToContractType(typeString, ADDRESS_TYPE_STRINGS, ADDRESS_TYPE_VALUES);
+ }
+
+ private static int doToContractType(String typeString, String[] types, int[] values) {
+ if (typeString == null) {
+ return NO_TYPE;
+ }
+ for (int i = 0; i < types.length; i++) {
+ String type = types[i];
+ if (typeString.startsWith(type) || typeString.startsWith(type.toUpperCase(Locale.ENGLISH))) {
+ return values[i];
+ }
+ }
+ return NO_TYPE;
+ }
+
+ final void shareByEmail(String contents) {
+ sendEmail(null, null, null, null, contents);
+ }
+
+ final void sendEmail(String[] to,
+ String[] cc,
+ String[] bcc,
+ String subject,
+ String body) {
+ Intent intent = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
+ if (to != null && to.length != 0) {
+ intent.putExtra(Intent.EXTRA_EMAIL, to);
+ }
+ if (cc != null && cc.length != 0) {
+ intent.putExtra(Intent.EXTRA_CC, cc);
+ }
+ if (bcc != null && bcc.length != 0) {
+ intent.putExtra(Intent.EXTRA_BCC, bcc);
+ }
+ putExtra(intent, Intent.EXTRA_SUBJECT, subject);
+ putExtra(intent, Intent.EXTRA_TEXT, body);
+ intent.setType("text/plain");
+ launchIntent(intent);
+ }
+
+ final void shareBySMS(String contents) {
+ sendSMSFromUri("smsto:", contents);
+ }
+
+ final void sendSMS(String phoneNumber, String body) {
+ sendSMSFromUri("smsto:" + phoneNumber, body);
+ }
+
+ final void sendSMSFromUri(String uri, String body) {
+ Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(uri));
+ putExtra(intent, "sms_body", body);
+ // Exit the app once the SMS is sent
+ intent.putExtra("compose_mode", true);
+ launchIntent(intent);
+ }
+
+ final void sendMMS(String phoneNumber, String subject, String body) {
+ sendMMSFromUri("mmsto:" + phoneNumber, subject, body);
+ }
+
+ final void sendMMSFromUri(String uri, String subject, String body) {
+ Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(uri));
+ // The Messaging app needs to see a valid subject or else it will treat this an an SMS.
+ if (subject == null || subject.isEmpty()) {
+ putExtra(intent, "subject", activity.getString(R.string.msg_default_mms_subject));
+ } else {
+ putExtra(intent, "subject", subject);
+ }
+ putExtra(intent, "sms_body", body);
+ intent.putExtra("compose_mode", true);
+ launchIntent(intent);
+ }
+
+ final void dialPhone(String phoneNumber) {
+ launchIntent(new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + phoneNumber)));
+ }
+
+ final void dialPhoneFromUri(String uri) {
+ launchIntent(new Intent(Intent.ACTION_DIAL, Uri.parse(uri)));
+ }
+
+ final void openMap(String geoURI) {
+ launchIntent(new Intent(Intent.ACTION_VIEW, Uri.parse(geoURI)));
+ }
+
+ /**
+ * Do a geo search using the address as the query.
+ *
+ * @param address The address to find
+ */
+ final void searchMap(String address) {
+ launchIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("geo:0,0?q=" + Uri.encode(address))));
+ }
+
+ final void getDirections(double latitude, double longitude) {
+ launchIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("http://maps.google." +
+ LocaleManager.getCountryTLD(activity) + "/maps?f=d&daddr=" + latitude + ',' + longitude)));
+ }
+
+ // Uses the mobile-specific version of Product Search, which is formatted for small screens.
+ final void openProductSearch(String upc) {
+ Uri uri = Uri.parse("http://www.google." + LocaleManager.getProductSearchCountryTLD(activity) +
+ "/m/products?q=" + upc + "&source=zxing");
+ launchIntent(new Intent(Intent.ACTION_VIEW, uri));
+ }
+
+ final void openBookSearch(String isbn) {
+ Uri uri = Uri.parse("http://books.google." + LocaleManager.getBookSearchCountryTLD(activity) +
+ "/books?vid=isbn" + isbn);
+ launchIntent(new Intent(Intent.ACTION_VIEW, uri));
+ }
+
+ final void searchBookContents(String isbnOrUrl) {
+ Intent intent = new Intent(Intents.SearchBookContents.ACTION);
+ intent.setClassName(activity, SearchBookContentsActivity.class.getName());
+ putExtra(intent, Intents.SearchBookContents.ISBN, isbnOrUrl);
+ launchIntent(intent);
+ }
+
+ final void openURL(String url) {
+ // Strangely, some Android browsers don't seem to register to handle HTTP:// or HTTPS://.
+ // Lower-case these as it should always be OK to lower-case these schemes.
+ if (url.startsWith("HTTP://")) {
+ url = "http" + url.substring(4);
+ } else if (url.startsWith("HTTPS://")) {
+ url = "https" + url.substring(5);
+ }
+ Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
+ try {
+ launchIntent(intent);
+ } catch (ActivityNotFoundException ignored) {
+ Log.w(TAG, "Nothing available to handle " + intent);
+ }
+ }
+
+ final void webSearch(String query) {
+ Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
+ intent.putExtra("query", query);
+ launchIntent(intent);
+ }
+
+ /**
+ * Like {@link #launchIntent(Intent)} but will tell you if it is not handle-able
+ * via {@link ActivityNotFoundException}.
+ *
+ * @throws ActivityNotFoundException
+ */
+ final void rawLaunchIntent(Intent intent) {
+ if (intent != null) {
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+ Log.d(TAG, "Launching intent: " + intent + " with extras: " + intent.getExtras());
+ activity.startActivity(intent);
+ }
+ }
+
+ /**
+ * Like {@link #rawLaunchIntent(Intent)} but will show a user dialog if nothing is available to handle.
+ */
+ final void launchIntent(Intent intent) {
+ try {
+ rawLaunchIntent(intent);
+ } catch (ActivityNotFoundException ignored) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+ builder.setTitle(R.string.app_name);
+ builder.setMessage(R.string.msg_intent_failed);
+ builder.setPositiveButton(R.string.button_ok, null);
+ builder.show();
+ }
+ }
+
+ private static void putExtra(Intent intent, String key, String value) {
+ if (value != null && !value.isEmpty()) {
+ intent.putExtra(key, value);
+ }
+ }
+
+ private String parseCustomSearchURL() {
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
+ String customProductSearch = prefs.getString(PreferencesActivity.KEY_CUSTOM_PRODUCT_SEARCH,
+ null);
+ if (customProductSearch != null && customProductSearch.trim().isEmpty()) {
+ return null;
+ }
+ return customProductSearch;
+ }
+
+ final String fillInCustomSearchURL(String text) {
+ if (customProductSearch == null) {
+ return text; // ?
+ }
+ try {
+ text = URLEncoder.encode(text, "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ // can't happen; UTF-8 is always supported. Continue, I guess, without encoding
+ }
+ String url = customProductSearch;
+ if (rawResult != null) {
+ // Replace %f but only if it doesn't seem to be a hex escape sequence. This remains
+ // problematic but avoids the more surprising problem of breaking escapes
+ url = url.replaceFirst("%f(?![0-9a-f])", rawResult.getBarcodeFormat().toString());
+ if (url.contains("%t")) {
+ ParsedResult parsedResultAgain = ResultParser.parseResult(rawResult);
+ url = url.replace("%t", parsedResultAgain.getType().toString());
+ }
+ }
+ // Replace %s last as it might contain itself %f or %t
+ return url.replace("%s", text);
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/ResultHandlerFactory.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/ResultHandlerFactory.java
new file mode 100755
index 0000000..a31d089
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/ResultHandlerFactory.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.result;
+
+import com.google.zxing.Result;
+import com.google.zxing.client.android.CaptureActivity;
+import com.google.zxing.client.result.ParsedResult;
+import com.google.zxing.client.result.ResultParser;
+
+/**
+ * Manufactures Android-specific handlers based on the barcode content's type.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+public final class ResultHandlerFactory {
+ private ResultHandlerFactory() {
+ }
+
+ public static ResultHandler makeResultHandler(CaptureActivity activity, Result rawResult) {
+ ParsedResult result = parseResult(rawResult);
+ switch (result.getType()) {
+ case ADDRESSBOOK:
+ return new AddressBookResultHandler(activity, result);
+ case EMAIL_ADDRESS:
+ return new EmailAddressResultHandler(activity, result);
+ case PRODUCT:
+ return new ProductResultHandler(activity, result, rawResult);
+ case URI:
+ return new URIResultHandler(activity, result);
+ case WIFI:
+ return new WifiResultHandler(activity, result);
+ case GEO:
+ return new GeoResultHandler(activity, result);
+ case TEL:
+ return new TelResultHandler(activity, result);
+ case SMS:
+ return new SMSResultHandler(activity, result);
+ case CALENDAR:
+ return new CalendarResultHandler(activity, result);
+ case ISBN:
+ return new ISBNResultHandler(activity, result, rawResult);
+ default:
+ return new TextResultHandler(activity, result, rawResult);
+ }
+ }
+
+ private static ParsedResult parseResult(Result rawResult) {
+ return ResultParser.parseResult(rawResult);
+ }
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/SMSResultHandler.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/SMSResultHandler.java
new file mode 100755
index 0000000..22bce75
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/SMSResultHandler.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.result;
+
+import android.app.Activity;
+import android.telephony.PhoneNumberUtils;
+
+import com.alibaba.weex.R;
+import com.google.zxing.client.result.ParsedResult;
+import com.google.zxing.client.result.SMSParsedResult;
+
+/**
+ * Handles SMS addresses, offering a choice of composing a new SMS or MMS message.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+public final class SMSResultHandler extends ResultHandler {
+ private static final int[] buttons = {
+ R.string.button_sms,
+ R.string.button_mms
+ };
+
+ public SMSResultHandler(Activity activity, ParsedResult result) {
+ super(activity, result);
+ }
+
+ @Override
+ public int getButtonCount() {
+ return buttons.length;
+ }
+
+ @Override
+ public int getButtonText(int index) {
+ return buttons[index];
+ }
+
+ @Override
+ public void handleButtonPress(int index) {
+ SMSParsedResult smsResult = (SMSParsedResult) getResult();
+ String number = smsResult.getNumbers()[0];
+ switch (index) {
+ case 0:
+ // Don't know of a way yet to express a SENDTO intent with multiple recipients
+ sendSMS(number, smsResult.getBody());
+ break;
+ case 1:
+ sendMMS(number, smsResult.getSubject(), smsResult.getBody());
+ break;
+ }
+ }
+
+ @Override
+ public CharSequence getDisplayContents() {
+ SMSParsedResult smsResult = (SMSParsedResult) getResult();
+ String[] rawNumbers = smsResult.getNumbers();
+ String[] formattedNumbers = new String[rawNumbers.length];
+ for (int i = 0; i < rawNumbers.length; i++) {
+ formattedNumbers[i] = PhoneNumberUtils.formatNumber(rawNumbers[i]);
+ }
+ StringBuilder contents = new StringBuilder(50);
+ ParsedResult.maybeAppend(formattedNumbers, contents);
+ ParsedResult.maybeAppend(smsResult.getSubject(), contents);
+ ParsedResult.maybeAppend(smsResult.getBody(), contents);
+ return contents.toString();
+ }
+
+ @Override
+ public int getDisplayTitle() {
+ return R.string.result_sms;
+ }
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/TelResultHandler.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/TelResultHandler.java
new file mode 100755
index 0000000..a42e7cf
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/TelResultHandler.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.result;
+
+import android.app.Activity;
+import android.telephony.PhoneNumberUtils;
+
+import com.alibaba.weex.R;
+import com.google.zxing.client.result.ParsedResult;
+import com.google.zxing.client.result.TelParsedResult;
+
+/**
+ * Offers relevant actions for telephone numbers.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+public final class TelResultHandler extends ResultHandler {
+ private static final int[] buttons = {
+ R.string.button_dial,
+ R.string.button_add_contact
+ };
+
+ public TelResultHandler(Activity activity, ParsedResult result) {
+ super(activity, result);
+ }
+
+ @Override
+ public int getButtonCount() {
+ return buttons.length;
+ }
+
+ @Override
+ public int getButtonText(int index) {
+ return buttons[index];
+ }
+
+ @Override
+ public void handleButtonPress(int index) {
+ TelParsedResult telResult = (TelParsedResult) getResult();
+ switch (index) {
+ case 0:
+ dialPhoneFromUri(telResult.getTelURI());
+ // When dialer comes up, it allows underlying display activity to continue or something,
+ // but app can't get camera in this state. Avoid issues by just quitting, only in the
+ // case of a phone number
+ getActivity().finish();
+ break;
+ case 1:
+ String[] numbers = new String[1];
+ numbers[0] = telResult.getNumber();
+ addPhoneOnlyContact(numbers, null);
+ break;
+ }
+ }
+
+ // Overriden so we can take advantage of Android's phone number hyphenation routines.
+ @Override
+ public CharSequence getDisplayContents() {
+ String contents = getResult().getDisplayResult();
+ contents = contents.replace("\r", "");
+ return PhoneNumberUtils.formatNumber(contents);
+ }
+
+ @Override
+ public int getDisplayTitle() {
+ return R.string.result_tel;
+ }
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/TextResultHandler.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/TextResultHandler.java
new file mode 100755
index 0000000..32bda84
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/TextResultHandler.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.result;
+
+import android.app.Activity;
+
+import com.alibaba.weex.R;
+import com.google.zxing.Result;
+import com.google.zxing.client.result.ParsedResult;
+
+/**
+ * This class handles TextParsedResult as well as unknown formats. It's the fallback handler.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+public final class TextResultHandler extends ResultHandler {
+
+ private static final int[] buttons = {
+ R.string.button_web_search,
+ R.string.button_share_by_email,
+ R.string.button_share_by_sms,
+ R.string.button_custom_product_search,
+ };
+
+ public TextResultHandler(Activity activity, ParsedResult result, Result rawResult) {
+ super(activity, result, rawResult);
+ }
+
+ @Override
+ public int getButtonCount() {
+ return hasCustomProductSearch() ? buttons.length : buttons.length - 1;
+ }
+
+ @Override
+ public int getButtonText(int index) {
+ return buttons[index];
+ }
+
+ @Override
+ public void handleButtonPress(int index) {
+ String text = getResult().getDisplayResult();
+ switch (index) {
+ case 0:
+ webSearch(text);
+ break;
+ case 1:
+ shareByEmail(text);
+ break;
+ case 2:
+ shareBySMS(text);
+ break;
+ case 3:
+ openURL(fillInCustomSearchURL(text));
+ break;
+ }
+ }
+
+ @Override
+ public int getDisplayTitle() {
+ return R.string.result_text;
+ }
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/URIResultHandler.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/URIResultHandler.java
new file mode 100755
index 0000000..6d06583
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/URIResultHandler.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.result;
+
+import android.app.Activity;
+
+import com.alibaba.weex.R;
+import com.google.zxing.client.android.LocaleManager;
+import com.google.zxing.client.result.ParsedResult;
+import com.google.zxing.client.result.URIParsedResult;
+
+import java.util.Locale;
+
+/**
+ * Offers appropriate actions for URLS.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+public final class URIResultHandler extends ResultHandler {
+ // URIs beginning with entries in this array will not be saved to history or copied to the
+ // clipboard for security.
+ private static final String[] SECURE_PROTOCOLS = {
+ "otpauth:"
+ };
+
+ private static final int[] buttons = {
+ R.string.button_open_browser,
+ R.string.button_share_by_email,
+ R.string.button_share_by_sms,
+ R.string.button_search_book_contents,
+ };
+
+ public URIResultHandler(Activity activity, ParsedResult result) {
+ super(activity, result);
+ }
+
+ @Override
+ public int getButtonCount() {
+ if (LocaleManager.isBookSearchUrl(((URIParsedResult) getResult()).getURI())) {
+ return buttons.length;
+ }
+ return buttons.length - 1;
+ }
+
+ @Override
+ public int getButtonText(int index) {
+ return buttons[index];
+ }
+
+ @Override
+ public Integer getDefaultButtonID() {
+ return 0;
+ }
+
+ @Override
+ public void handleButtonPress(int index) {
+ URIParsedResult uriResult = (URIParsedResult) getResult();
+ String uri = uriResult.getURI();
+ switch (index) {
+ case 0:
+ openURL(uri);
+ break;
+ case 1:
+ shareByEmail(uri);
+ break;
+ case 2:
+ shareBySMS(uri);
+ break;
+ case 3:
+ searchBookContents(uri);
+ break;
+ }
+ }
+
+ @Override
+ public int getDisplayTitle() {
+ return R.string.result_uri;
+ }
+
+ @Override
+ public boolean areContentsSecure() {
+ URIParsedResult uriResult = (URIParsedResult) getResult();
+ String uri = uriResult.getURI().toLowerCase(Locale.ENGLISH);
+ for (String secure : SECURE_PROTOCOLS) {
+ if (uri.startsWith(secure)) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/WifiResultHandler.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/WifiResultHandler.java
new file mode 100755
index 0000000..ab76af3
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/WifiResultHandler.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.result;
+
+import android.app.Activity;
+import android.content.Context;
+import android.net.wifi.WifiManager;
+import android.os.AsyncTask;
+import android.util.Log;
+import android.widget.Toast;
+
+import com.alibaba.weex.R;
+import com.google.zxing.client.android.CaptureActivity;
+import com.google.zxing.client.android.wifi.WifiConfigManager;
+import com.google.zxing.client.result.ParsedResult;
+import com.google.zxing.client.result.WifiParsedResult;
+
+/**
+ * Handles wifi access information.
+ *
+ * @author Vikram Aggarwal
+ * @author Sean Owen
+ */
+public final class WifiResultHandler extends ResultHandler {
+
+ private static final String TAG = WifiResultHandler.class.getSimpleName();
+
+ private final CaptureActivity parent;
+
+ public WifiResultHandler(CaptureActivity activity, ParsedResult result) {
+ super(activity, result);
+ parent = activity;
+ }
+
+ @Override
+ public int getButtonCount() {
+ // We just need one button, and that is to configure the wireless. This could change in the future.
+ return 1;
+ }
+
+ @Override
+ public int getButtonText(int index) {
+ return R.string.button_wifi;
+ }
+
+ @Override
+ public void handleButtonPress(int index) {
+ if (index == 0) {
+ WifiParsedResult wifiResult = (WifiParsedResult) getResult();
+ WifiManager wifiManager = (WifiManager) getActivity().getApplicationContext().getSystemService(Context.WIFI_SERVICE);
+ if (wifiManager == null) {
+ Log.w(TAG, "No WifiManager available from device");
+ return;
+ }
+ final Activity activity = getActivity();
+ activity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ Toast.makeText(activity.getApplicationContext(), R.string.wifi_changing_network, Toast.LENGTH_SHORT).show();
+ }
+ });
+ new WifiConfigManager(wifiManager).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, wifiResult);
+ parent.restartPreviewAfterDelay(0L);
+ }
+ }
+
+ // Display the name of the network and the network type to the user.
+ @Override
+ public CharSequence getDisplayContents() {
+ WifiParsedResult wifiResult = (WifiParsedResult) getResult();
+ return wifiResult.getSsid() + " (" + wifiResult.getNetworkEncryption() + ')';
+ }
+
+ @Override
+ public int getDisplayTitle() {
+ return R.string.result_wifi;
+ }
+}
\ No newline at end of file
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/supplement/BookResultInfoRetriever.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/supplement/BookResultInfoRetriever.java
new file mode 100755
index 0000000..769f770
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/supplement/BookResultInfoRetriever.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2011 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.result.supplement;
+
+import android.content.Context;
+import android.widget.TextView;
+
+import com.alibaba.weex.R;
+import com.google.zxing.client.android.HttpHelper;
+import com.google.zxing.client.android.LocaleManager;
+import com.google.zxing.client.android.history.HistoryManager;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.json.JSONTokener;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * @author Kamil Kaczmarczyk
+ * @author Sean Owen
+ */
+final class BookResultInfoRetriever extends SupplementalInfoRetriever {
+
+ private final String isbn;
+ private final String source;
+ private final Context context;
+
+ BookResultInfoRetriever(TextView textView, String isbn, HistoryManager historyManager, Context context) {
+ super(textView, historyManager);
+ this.isbn = isbn;
+ this.source = context.getString(R.string.msg_google_books);
+ this.context = context;
+ }
+
+ @Override
+ void retrieveSupplementalInfo() throws IOException {
+
+ CharSequence contents = HttpHelper.downloadViaHttp("https://www.googleapis.com/books/v1/volumes?q=isbn:" + isbn,
+ HttpHelper.ContentType.JSON);
+
+ if (contents.length() == 0) {
+ return;
+ }
+
+ String title;
+ String pages;
+ Collection<String> authors = null;
+
+ try {
+
+ JSONObject topLevel = (JSONObject) new JSONTokener(contents.toString()).nextValue();
+ JSONArray items = topLevel.optJSONArray("items");
+ if (items == null || items.isNull(0)) {
+ return;
+ }
+
+ JSONObject volumeInfo = ((JSONObject) items.get(0)).getJSONObject("volumeInfo");
+ if (volumeInfo == null) {
+ return;
+ }
+
+ title = volumeInfo.optString("title");
+ pages = volumeInfo.optString("pageCount");
+
+ JSONArray authorsArray = volumeInfo.optJSONArray("authors");
+ if (authorsArray != null && !authorsArray.isNull(0)) {
+ authors = new ArrayList<>(authorsArray.length());
+ for (int i = 0; i < authorsArray.length(); i++) {
+ authors.add(authorsArray.getString(i));
+ }
+ }
+
+ } catch (JSONException e) {
+ throw new IOException(e);
+ }
+
+ Collection<String> newTexts = new ArrayList<>();
+ maybeAddText(title, newTexts);
+ maybeAddTextSeries(authors, newTexts);
+ maybeAddText(pages == null || pages.isEmpty() ? null : pages + "pp.", newTexts);
+
+ String baseBookUri = "http://www.google." + LocaleManager.getBookSearchCountryTLD(context)
+ + "/search?tbm=bks&source=zxing&q=";
+
+ append(isbn, source, newTexts.toArray(new String[newTexts.size()]), baseBookUri + isbn);
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/supplement/ProductResultInfoRetriever.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/supplement/ProductResultInfoRetriever.java
new file mode 100755
index 0000000..ad6fe8e
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/supplement/ProductResultInfoRetriever.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2010 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.result.supplement;
+
+import android.content.Context;
+import android.text.Html;
+import android.widget.TextView;
+
+import com.alibaba.weex.R;
+import com.google.zxing.client.android.HttpHelper;
+import com.google.zxing.client.android.LocaleManager;
+import com.google.zxing.client.android.history.HistoryManager;
+
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * <p>Retrieves product information from Google Product search.</p>
+ *
+ * <p><strong>Please do not reuse this code.</strong> Using results in this way requires permission
+ * from Google, and that is not granted to users via this project.</p>
+ *
+ * @author Sean Owen
+ */
+final class ProductResultInfoRetriever extends SupplementalInfoRetriever {
+
+ private static final Pattern[] PRODUCT_NAME_PRICE_PATTERNS = {
+ Pattern.compile(",event\\)\">([^<]+)</a></h3>.+<span class=psrp>([^<]+)</span>"),
+ Pattern.compile("owb63p\">([^<]+).+zdi3pb\">([^<]+)"),
+ };
+
+ private final String productID;
+ private final String source;
+ private final Context context;
+
+ ProductResultInfoRetriever(TextView textView, String productID, HistoryManager historyManager, Context context) {
+ super(textView, historyManager);
+ this.productID = productID;
+ this.source = context.getString(R.string.msg_google_product);
+ this.context = context;
+ }
+
+ @Override
+ void retrieveSupplementalInfo() throws IOException {
+
+ String encodedProductID = URLEncoder.encode(productID, "UTF-8");
+ String uri = "https://www.google." + LocaleManager.getProductSearchCountryTLD(context)
+ + "/m/products?ie=utf8&oe=utf8&scoring=p&source=zxing&q=" + encodedProductID;
+ CharSequence content = HttpHelper.downloadViaHttp(uri, HttpHelper.ContentType.HTML);
+
+ for (Pattern p : PRODUCT_NAME_PRICE_PATTERNS) {
+ Matcher matcher = p.matcher(content);
+ if (matcher.find()) {
+ append(productID,
+ source,
+ new String[] { unescapeHTML(matcher.group(1)), unescapeHTML(matcher.group(2)) },
+ uri);
+ break;
+ }
+ }
+ }
+
+ private static String unescapeHTML(String raw) {
+ return Html.fromHtml(raw).toString();
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/supplement/SupplementalInfoRetriever.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/supplement/SupplementalInfoRetriever.java
new file mode 100755
index 0000000..8791be8
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/supplement/SupplementalInfoRetriever.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2010 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.result.supplement;
+
+import java.io.IOException;
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.concurrent.RejectedExecutionException;
+
+import android.content.Context;
+import android.os.AsyncTask;
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.method.LinkMovementMethod;
+import android.text.style.URLSpan;
+import android.util.Log;
+import android.widget.TextView;
+
+import com.google.zxing.client.android.history.HistoryManager;
+import com.google.zxing.client.result.ISBNParsedResult;
+import com.google.zxing.client.result.ParsedResult;
+import com.google.zxing.client.result.ProductParsedResult;
+import com.google.zxing.client.result.URIParsedResult;
+
+public abstract class SupplementalInfoRetriever extends AsyncTask<Object,Object,Object> {
+
+ private static final String TAG = "SupplementalInfo";
+
+ public static void maybeInvokeRetrieval(TextView textView,
+ ParsedResult result,
+ HistoryManager historyManager,
+ Context context) {
+ try {
+ if (result instanceof URIParsedResult) {
+ SupplementalInfoRetriever uriRetriever =
+ new URIResultInfoRetriever(textView, (URIParsedResult) result, historyManager, context);
+ uriRetriever.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ SupplementalInfoRetriever titleRetriever =
+ new TitleRetriever(textView, (URIParsedResult) result, historyManager);
+ titleRetriever.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ } else if (result instanceof ProductParsedResult) {
+ ProductParsedResult productParsedResult = (ProductParsedResult) result;
+ String productID = productParsedResult.getProductID();
+ SupplementalInfoRetriever productRetriever =
+ new ProductResultInfoRetriever(textView, productID, historyManager, context);
+ productRetriever.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ } else if (result instanceof ISBNParsedResult) {
+ String isbn = ((ISBNParsedResult) result).getISBN();
+ SupplementalInfoRetriever productInfoRetriever =
+ new ProductResultInfoRetriever(textView, isbn, historyManager, context);
+ productInfoRetriever.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ SupplementalInfoRetriever bookInfoRetriever =
+ new BookResultInfoRetriever(textView, isbn, historyManager, context);
+ bookInfoRetriever.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ }
+ } catch (RejectedExecutionException ree) {
+ // do nothing
+ }
+ }
+
+ private final WeakReference<TextView> textViewRef;
+ private final WeakReference<HistoryManager> historyManagerRef;
+ private final Collection<Spannable> newContents;
+ private final Collection<String[]> newHistories;
+
+ SupplementalInfoRetriever(TextView textView, HistoryManager historyManager) {
+ textViewRef = new WeakReference<>(textView);
+ historyManagerRef = new WeakReference<>(historyManager);
+ newContents = new ArrayList<>();
+ newHistories = new ArrayList<>();
+ }
+
+ @Override
+ public final Object doInBackground(Object... args) {
+ try {
+ retrieveSupplementalInfo();
+ } catch (IOException e) {
+ Log.w(TAG, e);
+ }
+ return null;
+ }
+
+ @Override
+ protected final void onPostExecute(Object arg) {
+ TextView textView = textViewRef.get();
+ if (textView != null) {
+ for (CharSequence content : newContents) {
+ textView.append(content);
+ }
+ textView.setMovementMethod(LinkMovementMethod.getInstance());
+ }
+ HistoryManager historyManager = historyManagerRef.get();
+ if (historyManager != null) {
+ for (String[] text : newHistories) {
+ historyManager.addHistoryItemDetails(text[0], text[1]);
+ }
+ }
+ }
+
+ abstract void retrieveSupplementalInfo() throws IOException;
+
+ final void append(String itemID, String source, String[] newTexts, String linkURL) {
+
+ StringBuilder newTextCombined = new StringBuilder();
+
+ if (source != null) {
+ newTextCombined.append(source).append(' ');
+ }
+
+ int linkStart = newTextCombined.length();
+
+ boolean first = true;
+ for (String newText : newTexts) {
+ if (first) {
+ newTextCombined.append(newText);
+ first = false;
+ } else {
+ newTextCombined.append(" [");
+ newTextCombined.append(newText);
+ newTextCombined.append(']');
+ }
+ }
+
+ int linkEnd = newTextCombined.length();
+
+ String newText = newTextCombined.toString();
+ Spannable content = new SpannableString(newText + "\n\n");
+ if (linkURL != null) {
+ // Strangely, some Android browsers don't seem to register to handle HTTP:// or HTTPS://.
+ // Lower-case these as it should always be OK to lower-case these schemes.
+ if (linkURL.startsWith("HTTP://")) {
+ linkURL = "http" + linkURL.substring(4);
+ } else if (linkURL.startsWith("HTTPS://")) {
+ linkURL = "https" + linkURL.substring(5);
+ }
+ content.setSpan(new URLSpan(linkURL), linkStart, linkEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ }
+
+ newContents.add(content);
+ newHistories.add(new String[] {itemID, newText});
+ }
+
+ static void maybeAddText(String text, Collection<String> texts) {
+ if (text != null && !text.isEmpty()) {
+ texts.add(text);
+ }
+ }
+
+ static void maybeAddTextSeries(Collection<String> textSeries, Collection<String> texts) {
+ if (textSeries != null && !textSeries.isEmpty()) {
+ boolean first = true;
+ StringBuilder authorsText = new StringBuilder();
+ for (String author : textSeries) {
+ if (first) {
+ first = false;
+ } else {
+ authorsText.append(", ");
+ }
+ authorsText.append(author);
+ }
+ texts.add(authorsText.toString());
+ }
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/supplement/TitleRetriever.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/supplement/TitleRetriever.java
new file mode 100755
index 0000000..7d0f7e2
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/supplement/TitleRetriever.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2012 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.result.supplement;
+
+import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import android.text.Html;
+import android.widget.TextView;
+
+import com.google.zxing.client.android.HttpHelper;
+import com.google.zxing.client.android.history.HistoryManager;
+import com.google.zxing.client.result.URIParsedResult;
+
+/**
+ * Retrieves the title of a web page as supplemental info.
+ *
+ * @author Sean Owen
+ */
+final class TitleRetriever extends SupplementalInfoRetriever {
+
+ private static final Pattern TITLE_PATTERN = Pattern.compile("<title>([^<]+)");
+ private static final int MAX_TITLE_LEN = 100;
+
+ private final String httpUrl;
+
+ TitleRetriever(TextView textView, URIParsedResult result, HistoryManager historyManager) {
+ super(textView, historyManager);
+ this.httpUrl = result.getURI();
+ }
+
+ @Override
+ void retrieveSupplementalInfo() {
+ CharSequence contents;
+ try {
+ contents = HttpHelper.downloadViaHttp(httpUrl, HttpHelper.ContentType.HTML, 4096);
+ } catch (IOException ioe) {
+ // ignore this
+ return;
+ }
+ if (contents != null && contents.length() > 0) {
+ Matcher m = TITLE_PATTERN.matcher(contents);
+ if (m.find()) {
+ String title = m.group(1);
+ if (title != null && !title.isEmpty()) {
+ title = Html.fromHtml(title).toString();
+ if (title.length() > MAX_TITLE_LEN) {
+ title = title.substring(0, MAX_TITLE_LEN) + "...";
+ }
+ append(httpUrl, null, new String[] {title}, httpUrl);
+ }
+ }
+ }
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/supplement/URIResultInfoRetriever.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/supplement/URIResultInfoRetriever.java
new file mode 100755
index 0000000..bebf3be
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/result/supplement/URIResultInfoRetriever.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2010 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.result.supplement;
+
+import android.content.Context;
+import android.widget.TextView;
+
+import com.alibaba.weex.R;
+import com.google.zxing.client.android.HttpHelper;
+import com.google.zxing.client.android.history.HistoryManager;
+import com.google.zxing.client.result.URIParsedResult;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+final class URIResultInfoRetriever extends SupplementalInfoRetriever {
+
+ private static final int MAX_REDIRECTS = 5;
+
+ private final URIParsedResult result;
+ private final String redirectString;
+
+ URIResultInfoRetriever(TextView textView, URIParsedResult result, HistoryManager historyManager, Context context) {
+ super(textView, historyManager);
+ redirectString = context.getString(R.string.msg_redirect);
+ this.result = result;
+ }
+
+ @Override
+ void retrieveSupplementalInfo() throws IOException {
+ URI oldURI;
+ try {
+ oldURI = new URI(result.getURI());
+ } catch (URISyntaxException ignored) {
+ return;
+ }
+ URI newURI = HttpHelper.unredirect(oldURI);
+ int count = 0;
+ while (count++ < MAX_REDIRECTS && !oldURI.equals(newURI)) {
+ append(result.getDisplayResult(),
+ null,
+ new String[] { redirectString + " : " + newURI },
+ newURI.toString());
+ oldURI = newURI;
+ newURI = HttpHelper.unredirect(newURI);
+ }
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/share/AppInfo.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/share/AppInfo.java
new file mode 100755
index 0000000..94bde9b
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/share/AppInfo.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2013 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.share;
+
+import android.graphics.drawable.Drawable;
+
+final class AppInfo implements Comparable<AppInfo> {
+
+ private final String packageName;
+ private final String label;
+ private final Drawable icon;
+
+ AppInfo(String packageName, String label, Drawable icon) {
+ this.packageName = packageName;
+ this.label = label;
+ this.icon = icon;
+ }
+
+ String getPackageName() {
+ return packageName;
+ }
+
+ Drawable getIcon() {
+ return icon;
+ }
+
+ @Override
+ public String toString() {
+ return label;
+ }
+
+ @Override
+ public int compareTo(AppInfo another) {
+ return label.compareTo(another.label);
+ }
+
+ @Override
+ public int hashCode() {
+ return label.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (!(other instanceof AppInfo)) {
+ return false;
+ }
+ AppInfo another = (AppInfo) other;
+ return label.equals(another.label);
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/share/AppPickerActivity.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/share/AppPickerActivity.java
new file mode 100755
index 0000000..319fd63
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/share/AppPickerActivity.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2009 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.share;
+
+import android.app.ListActivity;
+import android.content.Intent;
+import android.os.AsyncTask;
+import android.view.View;
+import android.widget.Adapter;
+import android.widget.ListView;
+
+import java.util.List;
+
+public final class AppPickerActivity extends ListActivity {
+
+ private AsyncTask<Object,Object,List<AppInfo>> backgroundTask;
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ backgroundTask = new LoadPackagesAsyncTask(this);
+ backgroundTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ }
+
+ @Override
+ protected void onPause() {
+ AsyncTask<?,?,?> task = backgroundTask;
+ if (task != null) {
+ task.cancel(true);
+ backgroundTask = null;
+ }
+ super.onPause();
+ }
+
+ @Override
+ protected void onListItemClick(ListView l, View view, int position, long id) {
+ Adapter adapter = getListAdapter();
+ if (position >= 0 && position < adapter.getCount()) {
+ String packageName = ((AppInfo) adapter.getItem(position)).getPackageName();
+ Intent intent = new Intent();
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+ intent.putExtra("url", "market://details?id=" + packageName);
+ setResult(RESULT_OK, intent);
+ } else {
+ setResult(RESULT_CANCELED);
+ }
+ finish();
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/share/BookMarkColumns.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/share/BookMarkColumns.java
new file mode 100755
index 0000000..0bcc262
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/share/BookMarkColumns.java
@@ -0,0 +1,68 @@
+package com.google.zxing.client.android.share;
+
+import android.graphics.BitmapFactory;
+import android.provider.BaseColumns;
+
+/**
+ * Created by shihan.zsh on 15/12/24.
+ */
+public class BookMarkColumns {
+ /**
+ * The URL of the bookmark or history item.
+ * <p>Type: TEXT (URL)</p>
+ */
+ public static final String URL = "url";
+
+ /**
+ * The number of time the item has been visited.
+ * <p>Type: NUMBER</p>
+ */
+ public static final String VISITS = "visits";
+
+ /**
+ * The date the item was last visited, in milliseconds since the epoch.
+ * <p>Type: NUMBER (date in milliseconds since January 1, 1970)</p>
+ */
+ public static final String DATE = "date";
+
+ /**
+ * Flag indicating that an item is a bookmark. A value of 1 indicates a bookmark, a value
+ * of 0 indicates a history item.
+ * <p>Type: INTEGER (boolean)</p>
+ */
+ public static final String BOOKMARK = "bookmark";
+
+ /**
+ * The user visible title of the bookmark or history item.
+ * <p>Type: TEXT</p>
+ */
+ public static final String TITLE = "title";
+
+ /**
+ * The date the item created, in milliseconds since the epoch.
+ * <p>Type: NUMBER (date in milliseconds since January 1, 1970)</p>
+ */
+ public static final String CREATED = "created";
+
+ /**
+ * The favicon of the bookmark. Must decode via {@link BitmapFactory#decodeByteArray}.
+ * <p>Type: BLOB (image)</p>
+ */
+ public static final String FAVICON = "favicon";
+
+ /**
+ * @hide
+ */
+ public static final String THUMBNAIL = "thumbnail";
+
+ /**
+ * @hide
+ */
+ public static final String TOUCH_ICON = "touch_icon";
+
+ /**
+ * @hide
+ */
+ public static final String USER_ENTERED = "user_entered";
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/share/BookmarkAdapter.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/share/BookmarkAdapter.java
new file mode 100755
index 0000000..020321a
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/share/BookmarkAdapter.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2011 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.share;
+
+
+import android.content.Context;
+import android.database.Cursor;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.alibaba.weex.R;
+
+
+/**
+ * A custom adapter designed to fetch bookmarks from a cursor. Before Honeycomb we used
+ * SimpleCursorAdapter, but it assumes the existence of an _id column, and the bookmark schema was
+ * rewritten for HC without one. This caused the app to crash, hence this new class, which is
+ * forwards and backwards compatible.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+final class BookmarkAdapter extends BaseAdapter {
+ private final Context context;
+ private final Cursor cursor;
+
+ BookmarkAdapter(Context context, Cursor cursor) {
+ this.context = context;
+ this.cursor = cursor;
+ }
+
+ @Override
+ public int getCount() {
+ return cursor.isClosed() ? 0 : cursor.getCount();
+ }
+
+ @Override
+ public Object getItem(int index) {
+ // Not used, so no point in retrieving it.
+ return null;
+ }
+
+ @Override
+ public long getItemId(int index) {
+ return index;
+ }
+
+ @Override
+ public View getView(int index, View view, ViewGroup viewGroup) {
+ View layout;
+ if (view instanceof LinearLayout) {
+ layout = view;
+ } else {
+ LayoutInflater factory = LayoutInflater.from(context);
+ layout = factory.inflate(R.layout.bookmark_picker_list_item, viewGroup, false);
+ }
+
+ if (!cursor.isClosed()) {
+ cursor.moveToPosition(index);
+ CharSequence title = cursor.getString(BookmarkPickerActivity.TITLE_COLUMN);
+ ((TextView) layout.findViewById(R.id.bookmark_title)).setText(title);
+ CharSequence url = cursor.getString(BookmarkPickerActivity.URL_COLUMN);
+ ((TextView) layout.findViewById(R.id.bookmark_url)).setText(url);
+ } // Otherwise... just don't update as the object is shutting down
+ return layout;
+ }
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/share/BookmarkPickerActivity.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/share/BookmarkPickerActivity.java
new file mode 100755
index 0000000..0464f0a
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/share/BookmarkPickerActivity.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.share;
+
+import android.app.ListActivity;
+import android.content.Intent;
+import android.database.Cursor;
+import android.net.Uri;
+import android.util.Log;
+import android.view.View;
+import android.widget.ListView;
+
+/**
+ * This class is only needed because I can't successfully send an ACTION_PICK intent to
+ * com.android.browser.BrowserBookmarksPage. It can go away if that starts working in the future.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+public final class BookmarkPickerActivity extends ListActivity {
+
+ private static final String TAG = BookmarkPickerActivity.class.getSimpleName();
+ public static final Uri BOOKMARKS_URI = Uri.parse("content://browser/bookmarks");
+
+ private static final String[] BOOKMARK_PROJECTION = {
+ BookMarkColumns.TITLE,
+ BookMarkColumns.URL
+ };
+
+ static final int TITLE_COLUMN = 0;
+ static final int URL_COLUMN = 1;
+
+ private static final String BOOKMARK_SELECTION =
+ BookMarkColumns.BOOKMARK + " = 1 AND " + BookMarkColumns.URL + " IS NOT NULL";
+
+ private Cursor cursor;
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ cursor = getContentResolver().query(BOOKMARKS_URI, BOOKMARK_PROJECTION,
+ BOOKMARK_SELECTION, null, null);
+
+// cursor = getContentResolver().query("url", BOOKMARK_PROJECTION,
+// BOOKMARK_SELECTION, null, null);
+ if (cursor == null) {
+ Log.w(TAG, "No cursor returned for bookmark query");
+ finish();
+ return;
+ }
+ setListAdapter(new BookmarkAdapter(this, cursor));
+ }
+
+ @Override
+ protected void onPause() {
+ if (cursor != null) {
+ cursor.close();
+ cursor = null;
+ }
+ super.onPause();
+ }
+
+ @Override
+ protected void onListItemClick(ListView l, View view, int position, long id) {
+ if (!cursor.isClosed() && cursor.moveToPosition(position)) {
+ Intent intent = new Intent();
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+ intent.putExtra(BookMarkColumns.TITLE, cursor.getString(TITLE_COLUMN));
+ intent.putExtra(BookMarkColumns.URL, cursor.getString(URL_COLUMN));
+ setResult(RESULT_OK, intent);
+ } else {
+ setResult(RESULT_CANCELED);
+ }
+ finish();
+ }
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/share/LoadPackagesAsyncTask.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/share/LoadPackagesAsyncTask.java
new file mode 100755
index 0000000..550f46f
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/share/LoadPackagesAsyncTask.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2009 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.share;
+
+import android.app.ListActivity;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageItemInfo;
+import android.content.pm.PackageManager;
+import android.graphics.drawable.Drawable;
+import android.os.AsyncTask;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.ImageView;
+import android.widget.ListAdapter;
+
+import com.alibaba.weex.R;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+
+/**
+ * Loads a list of packages installed on the device asynchronously.
+ *
+ * @author Sean Owen
+ */
+final class LoadPackagesAsyncTask extends AsyncTask<Object,Object,List<AppInfo>> {
+
+ private static final String[] PKG_PREFIX_WHITELIST = {
+ "com.google.android.apps.",
+ };
+ private static final String[] PKG_PREFIX_BLACKLIST = {
+ "com.android.",
+ "android",
+ "com.google.android.",
+ "com.htc",
+ };
+
+ private final ListActivity activity;
+
+ LoadPackagesAsyncTask(ListActivity activity) {
+ this.activity = activity;
+ }
+
+ @Override
+ protected List<AppInfo> doInBackground(Object... objects) {
+ List<AppInfo> labelsPackages = new ArrayList<>();
+ PackageManager packageManager = activity.getPackageManager();
+ Iterable<ApplicationInfo> appInfos = packageManager.getInstalledApplications(0);
+ for (PackageItemInfo appInfo : appInfos) {
+ String packageName = appInfo.packageName;
+ if (!isHidden(packageName)) {
+ CharSequence label = appInfo.loadLabel(packageManager);
+ Drawable icon = appInfo.loadIcon(packageManager);
+ if (label != null) {
+ labelsPackages.add(new AppInfo(packageName, label.toString(), icon));
+ }
+ }
+ }
+ Collections.sort(labelsPackages);
+ return labelsPackages;
+ }
+
+ private static boolean isHidden(String packageName) {
+ if (packageName == null) {
+ return true;
+ }
+ for (String prefix : PKG_PREFIX_WHITELIST) {
+ if (packageName.startsWith(prefix)) {
+ return false;
+ }
+ }
+ for (String prefix : PKG_PREFIX_BLACKLIST) {
+ if (packageName.startsWith(prefix)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ protected void onPostExecute(final List<AppInfo> results) {
+ ListAdapter listAdapter = new ArrayAdapter<AppInfo>(activity,
+ R.layout.app_picker_list_item,
+ R.id.app_picker_list_item_label,
+ results) {
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ View view = super.getView(position, convertView, parent);
+ Drawable icon = results.get(position).getIcon();
+ if (icon != null) {
+ ((ImageView) view.findViewById(R.id.app_picker_list_item_icon)).setImageDrawable(icon);
+ }
+ return view;
+ }
+ };
+ activity.setListAdapter(listAdapter);
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/share/ShareActivity.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/share/ShareActivity.java
new file mode 100755
index 0000000..25c8af4
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/share/ShareActivity.java
@@ -0,0 +1,299 @@
+/*
+ * Copyright (C) 2008 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.share;
+
+import android.app.Activity;
+import android.content.ContentResolver;
+import android.content.Intent;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.BaseColumns;
+import android.provider.ContactsContract;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.View;
+import android.widget.TextView;
+
+import com.alibaba.weex.R;
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.client.android.Contents;
+import com.google.zxing.client.android.Intents;
+import com.google.zxing.client.android.clipboard.ClipboardInterface;
+
+/**
+ * Barcode Scanner can share data like contacts and bookmarks by displaying a QR Code on screen,
+ * such that another user can scan the barcode with their phone.
+ *
+ * @author dswitkin@google.com (Daniel Switkin)
+ */
+public final class ShareActivity extends Activity {
+
+ private static final String TAG = ShareActivity.class.getSimpleName();
+
+ private static final int PICK_BOOKMARK = 0;
+ private static final int PICK_CONTACT = 1;
+ private static final int PICK_APP = 2;
+
+ private View clipboardButton;
+
+ private final View.OnClickListener contactListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+ startActivityForResult(intent, PICK_CONTACT);
+ }
+ };
+
+ private final View.OnClickListener bookmarkListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(Intent.ACTION_PICK);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+ intent.setClassName(ShareActivity.this, BookmarkPickerActivity.class.getName());
+ startActivityForResult(intent, PICK_BOOKMARK);
+ }
+ };
+
+ private final View.OnClickListener appListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(Intent.ACTION_PICK);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+ intent.setClassName(ShareActivity.this, AppPickerActivity.class.getName());
+ startActivityForResult(intent, PICK_APP);
+ }
+ };
+
+ private final View.OnClickListener clipboardListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // Should always be true, because we grey out the clipboard button in onResume() if it's empty
+ CharSequence text = ClipboardInterface.getText(ShareActivity.this);
+ if (text != null) {
+ launchSearch(text.toString());
+ }
+ }
+ };
+
+ private final View.OnKeyListener textListener = new View.OnKeyListener() {
+ @Override
+ public boolean onKey(View view, int keyCode, KeyEvent event) {
+ if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
+ String text = ((TextView) view).getText().toString();
+ if (text != null && !text.isEmpty()) {
+ launchSearch(text);
+ }
+ return true;
+ }
+ return false;
+ }
+ };
+
+ private void launchSearch(String text) {
+ Intent intent = new Intent(Intents.Encode.ACTION);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+ intent.putExtra(Intents.Encode.TYPE, Contents.Type.TEXT);
+ intent.putExtra(Intents.Encode.DATA, text);
+ intent.putExtra(Intents.Encode.FORMAT, BarcodeFormat.QR_CODE.toString());
+ startActivity(intent);
+ }
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ setContentView(R.layout.share);
+
+ findViewById(R.id.share_contact_button).setOnClickListener(contactListener);
+ findViewById(R.id.share_bookmark_button).setOnClickListener(bookmarkListener);
+ findViewById(R.id.share_app_button).setOnClickListener(appListener);
+ clipboardButton = findViewById(R.id.share_clipboard_button);
+ clipboardButton.setOnClickListener(clipboardListener);
+ findViewById(R.id.share_text_view).setOnKeyListener(textListener);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ clipboardButton.setEnabled(ClipboardInterface.hasText(this));
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent intent) {
+ if (resultCode == RESULT_OK) {
+ switch (requestCode) {
+ case PICK_BOOKMARK:
+ case PICK_APP:
+ showTextAsBarcode(intent.getStringExtra(BookMarkColumns.URL));
+ break;
+ case PICK_CONTACT:
+ // Data field is content://contacts/people/984
+ showContactAsBarcode(intent.getData());
+ break;
+ }
+ }
+ }
+
+ private void showTextAsBarcode(String text) {
+ Log.i(TAG, "Showing text as barcode: " + text);
+ if (text == null) {
+ return; // Show error?
+ }
+ Intent intent = new Intent(Intents.Encode.ACTION);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+ intent.putExtra(Intents.Encode.TYPE, Contents.Type.TEXT);
+ intent.putExtra(Intents.Encode.DATA, text);
+ intent.putExtra(Intents.Encode.FORMAT, BarcodeFormat.QR_CODE.toString());
+ startActivity(intent);
+ }
+
+ /**
+ * Takes a contact Uri and does the necessary database lookups to retrieve that person's info,
+ * then sends an Encode intent to render it as a QR Code.
+ *
+ * @param contactUri A Uri of the form content://contacts/people/17
+ */
+ private void showContactAsBarcode(Uri contactUri) {
+ Log.i(TAG, "Showing contact URI as barcode: " + contactUri);
+ if (contactUri == null) {
+ return; // Show error?
+ }
+ ContentResolver resolver = getContentResolver();
+
+ Cursor cursor;
+ try {
+ // We're seeing about six reports a week of this exception although I don't understand why.
+ cursor = resolver.query(contactUri, null, null, null, null);
+ } catch (IllegalArgumentException ignored) {
+ return;
+ }
+ if (cursor == null) {
+ return;
+ }
+
+ String id;
+ String name;
+ boolean hasPhone;
+ try {
+ if (!cursor.moveToFirst()) {
+ return;
+ }
+
+ id = cursor.getString(cursor.getColumnIndex(BaseColumns._ID));
+ name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
+ hasPhone = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)) > 0;
+
+
+ } finally {
+ cursor.close();
+ }
+
+ // Don't require a name to be present, this contact might be just a phone number.
+ Bundle bundle = new Bundle();
+ if (name != null && !name.isEmpty()) {
+ bundle.putString(ContactsContract.Intents.Insert.NAME, massageContactData(name));
+ }
+
+ if (hasPhone) {
+ Cursor phonesCursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
+ null,
+ ContactsContract.CommonDataKinds.Phone.CONTACT_ID + '=' + id,
+ null,
+ null);
+ if (phonesCursor != null) {
+ try {
+ int foundPhone = 0;
+ int phonesNumberColumn = phonesCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
+ int phoneTypeColumn = phonesCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
+ while (phonesCursor.moveToNext() && foundPhone < Contents.PHONE_KEYS.length) {
+ String number = phonesCursor.getString(phonesNumberColumn);
+ if (number != null && !number.isEmpty()) {
+ bundle.putString(Contents.PHONE_KEYS[foundPhone], massageContactData(number));
+ }
+ int type = phonesCursor.getInt(phoneTypeColumn);
+ bundle.putInt(Contents.PHONE_TYPE_KEYS[foundPhone], type);
+ foundPhone++;
+ }
+ } finally {
+ phonesCursor.close();
+ }
+ }
+ }
+
+ Cursor methodsCursor = resolver.query(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI,
+ null,
+ ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID + '=' + id,
+ null,
+ null);
+ if (methodsCursor != null) {
+ try {
+ if (methodsCursor.moveToNext()) {
+ String data = methodsCursor.getString(
+ methodsCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS));
+ if (data != null && !data.isEmpty()) {
+ bundle.putString(ContactsContract.Intents.Insert.POSTAL, massageContactData(data));
+ }
+ }
+ } finally {
+ methodsCursor.close();
+ }
+ }
+
+ Cursor emailCursor = resolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
+ null,
+ ContactsContract.CommonDataKinds.Email.CONTACT_ID + '=' + id,
+ null,
+ null);
+ if (emailCursor != null) {
+ try {
+ int foundEmail = 0;
+ int emailColumn = emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA);
+ while (emailCursor.moveToNext() && foundEmail < Contents.EMAIL_KEYS.length) {
+ String email = emailCursor.getString(emailColumn);
+ if (email != null && !email.isEmpty()) {
+ bundle.putString(Contents.EMAIL_KEYS[foundEmail], massageContactData(email));
+ }
+ foundEmail++;
+ }
+ } finally {
+ emailCursor.close();
+ }
+ }
+
+ Intent intent = new Intent(Intents.Encode.ACTION);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+ intent.putExtra(Intents.Encode.TYPE, Contents.Type.CONTACT);
+ intent.putExtra(Intents.Encode.DATA, bundle);
+ intent.putExtra(Intents.Encode.FORMAT, BarcodeFormat.QR_CODE.toString());
+
+ Log.i(TAG, "Sending bundle for encoding: " + bundle);
+ startActivity(intent);
+ }
+
+ private static String massageContactData(String data) {
+ // For now -- make sure we don't put newlines in shared contact data. It messes up
+ // any known encoding of contact data. Replace with space.
+ if (data.indexOf('\n') >= 0) {
+ data = data.replace("\n", " ");
+ }
+ if (data.indexOf('\r') >= 0) {
+ data = data.replace("\r", " ");
+ }
+ return data;
+ }
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/wifi/NetworkType.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/wifi/NetworkType.java
new file mode 100755
index 0000000..809e3c6
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/wifi/NetworkType.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2011 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.wifi;
+
+enum NetworkType {
+
+ WEP,
+ WPA,
+ NO_PASSWORD;
+
+ static NetworkType forIntentValue(String networkTypeString) {
+ if (networkTypeString == null) {
+ return NO_PASSWORD;
+ }
+ if ("WPA".equals(networkTypeString)) {
+ return WPA;
+ }
+ if ("WEP".equals(networkTypeString)) {
+ return WEP;
+ }
+ if ("nopass".equals(networkTypeString)) {
+ return NO_PASSWORD;
+ }
+ throw new IllegalArgumentException(networkTypeString);
+ }
+
+}
diff --git a/android/playground/src/main/java_zxing/com/google/zxing/client/android/wifi/WifiConfigManager.java b/android/playground/src/main/java_zxing/com/google/zxing/client/android/wifi/WifiConfigManager.java
new file mode 100755
index 0000000..5bde1f0
--- /dev/null
+++ b/android/playground/src/main/java_zxing/com/google/zxing/client/android/wifi/WifiConfigManager.java
@@ -0,0 +1,226 @@
+/*
+ * Copyright (C) 2011 ZXing authors
+ *
+ * Licensed 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.google.zxing.client.android.wifi;
+
+import java.util.regex.Pattern;
+
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiManager;
+import android.os.AsyncTask;
+import android.util.Log;
+
+import com.google.zxing.client.result.WifiParsedResult;
+
+/**
+ * @author Vikram Aggarwal
+ * @author Sean Owen
+ */
+public final class WifiConfigManager extends AsyncTask<WifiParsedResult,Object,Object> {
+
+ private static final String TAG = WifiConfigManager.class.getSimpleName();
+
+ private static final Pattern HEX_DIGITS = Pattern.compile("[0-9A-Fa-f]+");
+
+ private final WifiManager wifiManager;
+
+ public WifiConfigManager(WifiManager wifiManager) {
+ this.wifiManager = wifiManager;
+ }
+
+ @Override
+ protected Object doInBackground(WifiParsedResult... args) {
+ WifiParsedResult theWifiResult = args[0];
+ // Start WiFi, otherwise nothing will work
+ if (!wifiManager.isWifiEnabled()) {
+ Log.i(TAG, "Enabling wi-fi...");
+ if (wifiManager.setWifiEnabled(true)) {
+ Log.i(TAG, "Wi-fi enabled");
+ } else {
+ Log.w(TAG, "Wi-fi could not be enabled!");
+ return null;
+ }
+ // This happens very quickly, but need to wait for it to enable. A little busy wait?
+ int count = 0;
+ while (!wifiManager.isWifiEnabled()) {
+ if (count >= 10) {
+ Log.i(TAG, "Took too long to enable wi-fi, quitting");
+ return null;
+ }
+ Log.i(TAG, "Still waiting for wi-fi to enable...");
+ try {
+ Thread.sleep(1000L);
+ } catch (InterruptedException ie) {
+ // continue
+ }
+ count++;
+ }
+ }
+ String networkTypeString = theWifiResult.getNetworkEncryption();
+ NetworkType networkType;
+ try {
+ networkType = NetworkType.forIntentValue(networkTypeString);
+ } catch (IllegalArgumentException ignored) {
+ Log.w(TAG, "Bad network type; see NetworkType values: " + networkTypeString);
+ return null;
+ }
+ if (networkType == NetworkType.NO_PASSWORD) {
+ changeNetworkUnEncrypted(wifiManager, theWifiResult);
+ } else {
+ String password = theWifiResult.getPassword();
+ if (password != null && !password.isEmpty()) {
+ if (networkType == NetworkType.WEP) {
+ changeNetworkWEP(wifiManager, theWifiResult);
+ } else if (networkType == NetworkType.WPA) {
+ changeNetworkWPA(wifiManager, theWifiResult);
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Update the network: either create a new network or modify an existing network
+ * @param config the new network configuration
+ */
+ private static void updateNetwork(WifiManager wifiManager, WifiConfiguration config) {
+ Integer foundNetworkID = findNetworkInExistingConfig(wifiManager, config.SSID);
+ if (foundNetworkID != null) {
+ Log.i(TAG, "Removing old configuration for network " + config.SSID);
+ wifiManager.removeNetwork(foundNetworkID);
+ wifiManager.saveConfiguration();
+ }
+ int networkId = wifiManager.addNetwork(config);
+ if (networkId >= 0) {
+ // Try to disable the current network and start a new one.
+ if (wifiManager.enableNetwork(networkId, true)) {
+ Log.i(TAG, "Associating to network " + config.SSID);
+ wifiManager.saveConfiguration();
+ } else {
+ Log.w(TAG, "Failed to enable network " + config.SSID);
+ }
+ } else {
+ Log.w(TAG, "Unable to add network " + config.SSID);
+ }
+ }
+
+ private static WifiConfiguration changeNetworkCommon(WifiParsedResult wifiResult) {
+ WifiConfiguration config = new WifiConfiguration();
+ config.allowedAuthAlgorithms.clear();
+ config.allowedGroupCiphers.clear();
+ config.allowedKeyManagement.clear();
+ config.allowedPairwiseCiphers.clear();
+ config.allowedProtocols.clear();
+ // Android API insists that an ascii SSID must be quoted to be correctly handled.
+ config.SSID = quoteNonHex(wifiResult.getSsid());
+ config.hiddenSSID = wifiResult.isHidden();
+ return config;
+ }
+
+ // Adding a WEP network
+ private static void changeNetworkWEP(WifiManager wifiManager, WifiParsedResult wifiResult) {
+ WifiConfiguration config = changeNetworkCommon(wifiResult);
+ config.wepKeys[0] = quoteNonHex(wifiResult.getPassword(), 10, 26, 58);
+ config.wepTxKeyIndex = 0;
+ config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
+ config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
+ config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
+ config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
+ config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
+ config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
+ updateNetwork(wifiManager, config);
+ }
+
+ // Adding a WPA or WPA2 network
+ private static void changeNetworkWPA(WifiManager wifiManager, WifiParsedResult wifiResult) {
+ WifiConfiguration config = changeNetworkCommon(wifiResult);
+ // Hex passwords that are 64 bits long are not to be quoted.
+ config.preSharedKey = quoteNonHex(wifiResult.getPassword(), 64);
+ config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
+ config.allowedProtocols.set(WifiConfiguration.Protocol.WPA); // For WPA
+ config.allowedProtocols.set(WifiConfiguration.Protocol.RSN); // For WPA2
+ config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
+ config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
+ config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
+ config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
+ config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
+ config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
+ updateNetwork(wifiManager, config);
+ }
+
+ // Adding an open, unsecured network
+ private static void changeNetworkUnEncrypted(WifiManager wifiManager, WifiParsedResult wifiResult) {
+ WifiConfiguration config = changeNetworkCommon(wifiResult);
+ config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
+ updateNetwork(wifiManager, config);
+ }
+
+ private static Integer findNetworkInExistingConfig(WifiManager wifiManager, String ssid) {
+ Iterable<WifiConfiguration> existingConfigs = wifiManager.getConfiguredNetworks();
+ if (existingConfigs != null) {
+ for (WifiConfiguration existingConfig : existingConfigs) {
+ String existingSSID = existingConfig.SSID;
+ if (existingSSID != null && existingSSID.equals(ssid)) {
+ return existingConfig.networkId;
+ }
+ }
+ }
+ return null;
+ }
+
+ private static String quoteNonHex(String value, int... allowedLengths) {
+ return isHexOfLength(value, allowedLengths) ? value : convertToQuotedString(value);
+ }
+
+ /**
+ * Encloses the incoming string inside double quotes, if it isn't already quoted.
+ * @param s the input string
+ * @return a quoted string, of the form "input". If the input string is null, it returns null
+ * as well.
+ */
+ private static String convertToQuotedString(String s) {
+ if (s == null || s.isEmpty()) {
+ return null;
+ }
+ // If already quoted, return as-is
+ if (s.charAt(0) == '"' && s.charAt(s.length() - 1) == '"') {
+ return s;
+ }
+ return '\"' + s + '\"';
+ }
+
+ /**
+ * @param value input to check
+ * @param allowedLengths allowed lengths, if any
+ * @return true if value is a non-null, non-empty string of hex digits, and if allowed lengths are given, has
+ * an allowed length
+ */
+ private static boolean isHexOfLength(CharSequence value, int... allowedLengths) {
+ if (value == null || !HEX_DIGITS.matcher(value).matches()) {
+ return false;
+ }
+ if (allowedLengths.length == 0) {
+ return true;
+ }
+ for (int length : allowedLengths) {
+ if (value.length() == length) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/android/playground/src/main/res/drawable-hdpi/ic_action_refresh.png b/android/playground/src/main/res/drawable-hdpi/ic_action_refresh.png
new file mode 100755
index 0000000..dae2790
--- /dev/null
+++ b/android/playground/src/main/res/drawable-hdpi/ic_action_refresh.png
Binary files differ
diff --git a/android/playground/src/main/res/drawable-hdpi/ic_action_scan.png b/android/playground/src/main/res/drawable-hdpi/ic_action_scan.png
new file mode 100755
index 0000000..cb0ede8
--- /dev/null
+++ b/android/playground/src/main/res/drawable-hdpi/ic_action_scan.png
Binary files differ
diff --git a/android/playground/src/main/res/drawable-mdpi/ic_action_refresh.png b/android/playground/src/main/res/drawable-mdpi/ic_action_refresh.png
new file mode 100755
index 0000000..94ab6f4
--- /dev/null
+++ b/android/playground/src/main/res/drawable-mdpi/ic_action_refresh.png
Binary files differ
diff --git a/android/playground/src/main/res/drawable-mdpi/ic_action_scan.png b/android/playground/src/main/res/drawable-mdpi/ic_action_scan.png
new file mode 100755
index 0000000..c577af0
--- /dev/null
+++ b/android/playground/src/main/res/drawable-mdpi/ic_action_scan.png
Binary files differ
diff --git a/android/playground/src/main/res/drawable-v21/ic_menu_camera.xml b/android/playground/src/main/res/drawable-v21/ic_menu_camera.xml
new file mode 100755
index 0000000..344860a
--- /dev/null
+++ b/android/playground/src/main/res/drawable-v21/ic_menu_camera.xml
@@ -0,0 +1,30 @@
+<!--
+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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportHeight="24.0"
+ android:viewportWidth="24.0">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M12,12m-3.2,0a3.2,3.2 0,1 1,6.4 0a3.2,3.2 0,1 1,-6.4 0"/>
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M9,2L7.17,4H4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V6c0,-1.1 -0.9,-2 -2,-2h-3.17L15,2H9zm3,15c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5z"/>
+</vector>
diff --git a/android/playground/src/main/res/drawable-v21/ic_menu_gallery.xml b/android/playground/src/main/res/drawable-v21/ic_menu_gallery.xml
new file mode 100755
index 0000000..788b59b
--- /dev/null
+++ b/android/playground/src/main/res/drawable-v21/ic_menu_gallery.xml
@@ -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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportHeight="24.0"
+ android:viewportWidth="24.0">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M22,16V4c0,-1.1 -0.9,-2 -2,-2H8c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2zm-11,-4l2.03,2.71L16,11l4,5H8l3,-4zM2,6v14c0,1.1 0.9,2 2,2h14v-2H4V6H2z"/>
+</vector>
diff --git a/android/playground/src/main/res/drawable-v21/ic_menu_manage.xml b/android/playground/src/main/res/drawable-v21/ic_menu_manage.xml
new file mode 100755
index 0000000..1bb2478
--- /dev/null
+++ b/android/playground/src/main/res/drawable-v21/ic_menu_manage.xml
@@ -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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportHeight="24.0"
+ android:viewportWidth="24.0">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M22.7,19l-9.1,-9.1c0.9,-2.3 0.4,-5 -1.5,-6.9 -2,-2 -5,-2.4 -7.4,-1.3L9,6 6,9 1.6,4.7C0.4,7.1 0.9,10.1 2.9,12.1c1.9,1.9 4.6,2.4 6.9,1.5l9.1,9.1c0.4,0.4 1,0.4 1.4,0l2.3,-2.3c0.5,-0.4 0.5,-1.1 0.1,-1.4z"/>
+</vector>
\ No newline at end of file
diff --git a/android/playground/src/main/res/drawable-v21/ic_menu_send.xml b/android/playground/src/main/res/drawable-v21/ic_menu_send.xml
new file mode 100755
index 0000000..9094dfa
--- /dev/null
+++ b/android/playground/src/main/res/drawable-v21/ic_menu_send.xml
@@ -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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportHeight="24.0"
+ android:viewportWidth="24.0">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M2.01,21L23,12 2.01,3 2,10l15,2 -15,2z"/>
+</vector>
diff --git a/android/playground/src/main/res/drawable-v21/ic_menu_share.xml b/android/playground/src/main/res/drawable-v21/ic_menu_share.xml
new file mode 100755
index 0000000..c198eb0
--- /dev/null
+++ b/android/playground/src/main/res/drawable-v21/ic_menu_share.xml
@@ -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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportHeight="24.0"
+ android:viewportWidth="24.0">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z"/>
+</vector>
diff --git a/android/playground/src/main/res/drawable-v21/ic_menu_slideshow.xml b/android/playground/src/main/res/drawable-v21/ic_menu_slideshow.xml
new file mode 100755
index 0000000..bc8c64c
--- /dev/null
+++ b/android/playground/src/main/res/drawable-v21/ic_menu_slideshow.xml
@@ -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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportHeight="24.0"
+ android:viewportWidth="24.0">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M4,6H2v14c0,1.1 0.9,2 2,2h14v-2H4V6zm16,-4H8c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V4c0,-1.1 -0.9,-2 -2,-2zm-8,12.5v-9l6,4.5 -6,4.5z"/>
+</vector>
diff --git a/android/playground/src/main/res/drawable-xhdpi/ic_action_refresh.png b/android/playground/src/main/res/drawable-xhdpi/ic_action_refresh.png
new file mode 100755
index 0000000..ab4ab9d
--- /dev/null
+++ b/android/playground/src/main/res/drawable-xhdpi/ic_action_refresh.png
Binary files differ
diff --git a/android/playground/src/main/res/drawable-xhdpi/ic_action_scan.png b/android/playground/src/main/res/drawable-xhdpi/ic_action_scan.png
new file mode 100755
index 0000000..6c333a9
--- /dev/null
+++ b/android/playground/src/main/res/drawable-xhdpi/ic_action_scan.png
Binary files differ
diff --git a/android/playground/src/main/res/drawable-xxhdpi/ic_action_refresh.png b/android/playground/src/main/res/drawable-xxhdpi/ic_action_refresh.png
new file mode 100755
index 0000000..44ee117
--- /dev/null
+++ b/android/playground/src/main/res/drawable-xxhdpi/ic_action_refresh.png
Binary files differ
diff --git a/android/playground/src/main/res/drawable-xxhdpi/ic_action_scan.png b/android/playground/src/main/res/drawable-xxhdpi/ic_action_scan.png
new file mode 100755
index 0000000..f506629
--- /dev/null
+++ b/android/playground/src/main/res/drawable-xxhdpi/ic_action_scan.png
Binary files differ
diff --git a/android/playground/src/main/res/drawable/side_nav_bar.xml b/android/playground/src/main/res/drawable/side_nav_bar.xml
new file mode 100755
index 0000000..41946f9
--- /dev/null
+++ b/android/playground/src/main/res/drawable/side_nav_bar.xml
@@ -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.
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <gradient
+ android:angle="135"
+ android:centerColor="#4CAF50"
+ android:endColor="#2E7D32"
+ android:startColor="#81C784"
+ android:type="linear"/>
+</shape>
\ No newline at end of file
diff --git a/android/playground/src/main/res/layout/activity_index.xml b/android/playground/src/main/res/layout/activity_index.xml
new file mode 100755
index 0000000..6d2ee7f
--- /dev/null
+++ b/android/playground/src/main/res/layout/activity_index.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+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.
+-->
+<android.support.design.widget.CoordinatorLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:fitsSystemWindows="true"
+ tools:context=".IndexActivity">
+
+ <android.support.design.widget.AppBarLayout
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:theme="@style/AppTheme.AppBarOverlay">
+
+ <android.support.v7.widget.Toolbar
+ android:id="@+id/toolbar"
+ android:title="@string/app_name"
+ android:layout_width="match_parent"
+ android:layout_height="?attr/actionBarSize"
+ android:background="?attr/colorPrimary"
+ app:popupTheme="@style/AppTheme.PopupOverlay"/>
+
+ </android.support.design.widget.AppBarLayout>
+
+ <include layout="@layout/content_wx_main"/>
+
+</android.support.design.widget.CoordinatorLayout>
diff --git a/android/playground/src/main/res/layout/activity_slice_test.xml b/android/playground/src/main/res/layout/activity_slice_test.xml
new file mode 100644
index 0000000..dac9404
--- /dev/null
+++ b/android/playground/src/main/res/layout/activity_slice_test.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".SliceTestActivity">
+
+ <Button
+ android:id="@+id/button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:onClick="addCellClick"
+ android:text="ADD CELL"/>
+
+ <TextView
+ android:id="@+id/report_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignTop="@+id/button"
+ android:layout_alignBottom="@+id/button"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentTop="true"
+ android:gravity="center_vertical"
+ tools:text="create: 12ms, avg: 10ms
refresh: 12ms, avg: 10ms"/>
+
+ <android.support.v7.widget.RecyclerView
+ android:id="@+id/recycler_view"
+ android:layout_width="match_parent"
+ android:layout_height="210dp"
+ android:layout_below="@+id/button"/>
+</RelativeLayout>
\ No newline at end of file
diff --git a/android/playground/src/main/res/layout/activity_splash.xml b/android/playground/src/main/res/layout/activity_splash.xml
new file mode 100755
index 0000000..d67473a
--- /dev/null
+++ b/android/playground/src/main/res/layout/activity_splash.xml
@@ -0,0 +1,36 @@
+<!--
+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.
+-->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:id="@+id/container"
+ android:background="#0099cc"
+ tools:context="com.alibaba.weex.SplashActivity">
+
+ <TextView android:id="@+id/fullscreen_content"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:keepScreenOn="true"
+ android:textColor="#33b5e5"
+ android:textStyle="bold"
+ android:textSize="50sp"
+ android:gravity="center"
+ android:text="@string/dummy_content"/>
+</FrameLayout>
diff --git a/android/playground/src/main/res/layout/activity_wxpage.xml b/android/playground/src/main/res/layout/activity_wxpage.xml
new file mode 100755
index 0000000..892f405
--- /dev/null
+++ b/android/playground/src/main/res/layout/activity_wxpage.xml
@@ -0,0 +1,79 @@
+<!--
+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.
+-->
+<android.support.design.widget.CoordinatorLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:fitsSystemWindows="true"
+ tools:context="com.alibaba.weex.WXPageActivity">
+
+ <android.support.design.widget.AppBarLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:theme="@style/AppTheme.AppBarOverlay">
+
+ <android.support.v7.widget.Toolbar
+ android:id="@+id/toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="?attr/actionBarSize"
+ android:background="?attr/colorPrimary"
+ app:popupTheme="@style/AppTheme.PopupOverlay"/>
+
+ </android.support.design.widget.AppBarLayout>
+
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ app:layout_behavior="@string/appbar_scrolling_view_behavior">
+ <FrameLayout
+ android:id="@+id/container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="#ffffff">
+<!--
+ <WebView
+ android:id="@+id/webviewLayout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ </WebView> -->
+
+
+ </FrameLayout>
+
+ <!--<Button-->
+ <!--android:id="@+id/weex_refresh"-->
+ <!--android:layout_width="match_parent"-->
+ <!--android:layout_height="100dp" />-->
+
+ <ProgressBar
+ android:id="@+id/progress"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:visibility="gone"/>
+
+ </FrameLayout>
+
+</android.support.design.widget.CoordinatorLayout>
+
+
+
diff --git a/android/playground/src/main/res/layout/app_bar_main.xml b/android/playground/src/main/res/layout/app_bar_main.xml
new file mode 100755
index 0000000..fcefedf
--- /dev/null
+++ b/android/playground/src/main/res/layout/app_bar_main.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+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.
+-->
+<android.support.design.widget.CoordinatorLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:fitsSystemWindows="true"
+ tools:context=".WXHomeActivity">
+
+ <android.support.design.widget.AppBarLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:theme="@style/AppTheme.AppBarOverlay">
+
+ <android.support.v7.widget.Toolbar
+ android:id="@+id/toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="?attr/actionBarSize"
+ android:background="?attr/colorPrimary"
+ app:popupTheme="@style/AppTheme.PopupOverlay"/>
+
+ </android.support.design.widget.AppBarLayout>
+
+ <include layout="@layout/content_main"/>
+
+ <!--<android.support.design.widget.FloatingActionButton-->
+ <!--android:id="@+id/fab"-->
+ <!--android:layout_width="wrap_content"-->
+ <!--android:layout_height="wrap_content"-->
+ <!--android:layout_gravity="bottom|end"-->
+ <!--android:layout_margin="@dimen/fab_margin"-->
+ <!--android:src="@android:drawable/ic_dialog_email"/>-->
+
+</android.support.design.widget.CoordinatorLayout>
diff --git a/android/playground/src/main/res/layout/app_picker_list_item.xml b/android/playground/src/main/res/layout/app_picker_list_item.xml
new file mode 100755
index 0000000..37e7abc
--- /dev/null
+++ b/android/playground/src/main/res/layout/app_picker_list_item.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2008 ZXing authors
+
+ Licensed 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.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+
+ <ImageView android:id="@+id/app_picker_list_item_icon"
+ android:layout_width="64dip"
+ android:layout_height="64dip"
+ android:scaleType="centerInside"
+ android:padding="@dimen/half_padding"
+ tools:ignore="ContentDescription"/>
+
+ <TextView android:id="@+id/app_picker_list_item_label"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:gravity="center_vertical"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:singleLine="true"
+ android:padding="@dimen/half_padding"/>
+
+</LinearLayout>
diff --git a/android/playground/src/main/res/layout/bookmark_picker_list_item.xml b/android/playground/src/main/res/layout/bookmark_picker_list_item.xml
new file mode 100755
index 0000000..b8cb1ac
--- /dev/null
+++ b/android/playground/src/main/res/layout/bookmark_picker_list_item.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2008 ZXing authors
+
+ Licensed 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.
+ -->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:padding="@dimen/half_padding">
+
+ <TextView android:id="@+id/bookmark_title"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:singleLine="true"
+ android:textIsSelectable="false"/>
+
+ <TextView android:id="@+id/bookmark_url"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:singleLine="false"
+ android:textIsSelectable="false"/>
+
+</LinearLayout>
diff --git a/android/playground/src/main/res/layout/camera.xml b/android/playground/src/main/res/layout/camera.xml
new file mode 100755
index 0000000..a016c53
--- /dev/null
+++ b/android/playground/src/main/res/layout/camera.xml
@@ -0,0 +1,36 @@
+<!--
+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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" >
+
+ <SurfaceView
+ android:id="@+id/surface_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center" />
+
+ <com.taobao.ma.ui.ViewfinderTaobaoView
+ android:id="@+id/viewfinder_view"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerInParent="true" />
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/android/playground/src/main/res/layout/capture.xml b/android/playground/src/main/res/layout/capture.xml
new file mode 100755
index 0000000..fa3c603
--- /dev/null
+++ b/android/playground/src/main/res/layout/capture.xml
@@ -0,0 +1,204 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2008 ZXing authors
+
+ Licensed 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.
+ -->
+<merge xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools">
+
+ <SurfaceView android:id="@+id/preview_view"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"/>
+
+ <com.google.zxing.client.android.ViewfinderView
+ android:id="@+id/viewfinder_view"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"/>
+
+ <LinearLayout android:id="@+id/result_view"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:background="@color/result_view"
+ android:visibility="gone"
+ android:baselineAligned="false">
+
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:gravity="center"
+ android:padding="@dimen/standard_padding">
+
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:gravity="right|center_vertical">
+
+ <ImageView android:id="@+id/barcode_image_view"
+ android:layout_width="160dip"
+ android:layout_height="wrap_content"
+ android:maxWidth="160dip"
+ android:maxHeight="160dip"
+ android:layout_marginBottom="@dimen/half_padding"
+ android:adjustViewBounds="true"
+ android:scaleType="centerInside"
+ tools:ignore="ContentDescription"/>
+
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+
+ <TextView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/msg_default_format"
+ android:textColor="@color/result_minor_text"
+ android:textStyle="bold"
+ android:paddingRight="@dimen/half_padding"/>
+
+ <TextView android:id="@+id/format_text_view"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="@color/result_minor_text"/>
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+
+ <TextView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/msg_default_type"
+ android:textColor="@color/result_minor_text"
+ android:textStyle="bold"
+ android:paddingRight="@dimen/half_padding"/>
+
+ <TextView android:id="@+id/type_text_view"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="@color/result_minor_text"/>
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+
+ <TextView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/msg_default_time"
+ android:textColor="@color/result_minor_text"
+ android:textStyle="bold"
+ android:paddingRight="@dimen/half_padding"/>
+
+ <TextView android:id="@+id/time_text_view"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="@color/result_minor_text"/>
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+
+ <TextView android:id="@+id/meta_text_view_label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/msg_default_meta"
+ android:textColor="@color/result_minor_text"
+ android:textStyle="bold"
+ android:paddingRight="@dimen/half_padding"/>
+
+ <TextView android:id="@+id/meta_text_view"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="@color/result_minor_text"/>
+
+ </LinearLayout>
+
+ </LinearLayout>
+
+ <ScrollView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView android:id="@+id/contents_text_view"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="@color/result_text"
+ android:textColorLink="@color/result_text"
+ android:textSize="22sp"
+ android:paddingLeft="12dip"
+ android:autoLink="web"
+ android:textIsSelectable="true"/>
+
+ <TextView android:id="@+id/contents_supplement_text_view"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="@color/result_text"
+ android:textColorLink="@color/result_text"
+ android:paddingLeft="12dip"
+ android:autoLink="web"
+ android:textIsSelectable="true"/>
+
+ </LinearLayout>
+
+ </ScrollView>
+
+ </LinearLayout>
+
+ <LinearLayout android:id="@+id/result_button_view"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:gravity="center">
+
+ <Button style="@style/ResultButton"
+ android:visibility="gone"/>
+
+ <Button style="@style/ResultButton"
+ android:visibility="gone"/>
+
+ <Button style="@style/ResultButton"
+ android:visibility="gone"/>
+
+ <Button style="@style/ResultButton"
+ android:visibility="gone"/>
+
+ </LinearLayout>
+
+ </LinearLayout>
+
+ <TextView android:id="@+id/status_view"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom|center_horizontal"
+ android:background="@color/transparent"
+ android:text="@string/msg_default_status"
+ android:textColor="@color/status_text"/>
+
+</merge>
diff --git a/android/playground/src/main/res/layout/catalog_item.xml b/android/playground/src/main/res/layout/catalog_item.xml
new file mode 100755
index 0000000..56278ec
--- /dev/null
+++ b/android/playground/src/main/res/layout/catalog_item.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical" >
+
+ <TextView
+ android:id="@+id/text"
+ android:layout_width="match_parent"
+ android:layout_height="60dp"
+ android:gravity="center_vertical"
+ android:textSize="24sp"/>
+
+</LinearLayout>
diff --git a/android/playground/src/main/res/layout/common_update_notify_dialog.xml b/android/playground/src/main/res/layout/common_update_notify_dialog.xml
new file mode 100644
index 0000000..8b2987b
--- /dev/null
+++ b/android/playground/src/main/res/layout/common_update_notify_dialog.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:padding="16dp">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:text="@string/update_found_new_version"
+ android:textColor="#030303"
+ android:textSize="20sp" />
+
+ <TextView
+ android:id="@+id/common_update_dialog_msg"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="14dp"
+ android:textColor="#030303"
+ android:textSize="16sp" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/android/playground/src/main/res/layout/content_main.xml b/android/playground/src/main/res/layout/content_main.xml
new file mode 100755
index 0000000..b92e971
--- /dev/null
+++ b/android/playground/src/main/res/layout/content_main.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+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.
+-->
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ app:layout_behavior="@string/appbar_scrolling_view_behavior"
+ tools:context="com.alibaba.weex.fr"
+ android:id="@+id/main_container"
+ tools:showIn="@layout/app_bar_main">
+
+
+</FrameLayout>
diff --git a/android/playground/src/main/res/layout/content_wx_main.xml b/android/playground/src/main/res/layout/content_wx_main.xml
new file mode 100755
index 0000000..e5fffdb
--- /dev/null
+++ b/android/playground/src/main/res/layout/content_wx_main.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ app:layout_behavior="@string/appbar_scrolling_view_behavior"
+
+ android:layout_width="match_parent" android:layout_height="match_parent">
+ <FrameLayout
+ android:id="@+id/index_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ </FrameLayout>
+ <ProgressBar android:id="@+id/index_progressBar" android:layout_width="wrap_content"
+ android:layout_height="wrap_content" android:layout_centerInParent="true"
+ android:visibility="gone"/>
+ <TextView android:id="@+id/index_tip" android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@+id/index_progressBar"
+ android:layout_centerHorizontal="true"
+ android:layout_alignWithParentIfMissing="true"
+ android:layout_margin="10dp"
+ android:text="loading...." android:visibility="gone"/>
+</RelativeLayout>
\ No newline at end of file
diff --git a/android/playground/src/main/res/layout/encode.xml b/android/playground/src/main/res/layout/encode.xml
new file mode 100755
index 0000000..2a9a0c8
--- /dev/null
+++ b/android/playground/src/main/res/layout/encode.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2008 ZXing authors
+
+ Licensed 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.
+ -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:fillViewport="true"
+ android:background="@color/encode_view"
+ android:orientation="vertical"
+ android:gravity="center"
+ tools:ignore="Overdraw">
+
+ <ImageView android:id="@+id/image_view"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:scaleType="center"
+ tools:ignore="ContentDescription"/>
+
+ <ScrollView android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:gravity="center">
+
+ <TextView android:id="@+id/contents_text_view"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:gravity="center"
+ android:textColor="@color/contents_text"
+ android:paddingBottom="@dimen/standard_padding"
+ android:paddingLeft="@dimen/standard_padding"
+ android:paddingRight="@dimen/standard_padding"
+ android:textIsSelectable="true"/>
+
+ </ScrollView>
+
+</LinearLayout>
diff --git a/android/playground/src/main/res/layout/hello_weex.xml b/android/playground/src/main/res/layout/hello_weex.xml
new file mode 100644
index 0000000..2a60664
--- /dev/null
+++ b/android/playground/src/main/res/layout/hello_weex.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+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.
+-->
+
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+>
+ <FrameLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+ <TextView
+ android:text="Hello World"
+ android:textSize="140px"
+ android:textColor="@android:color/black"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
+ </FrameLayout>
+</FrameLayout>
\ No newline at end of file
diff --git a/android/playground/src/main/res/layout/help.xml b/android/playground/src/main/res/layout/help.xml
new file mode 100755
index 0000000..e02480a
--- /dev/null
+++ b/android/playground/src/main/res/layout/help.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2008 ZXing authors
+
+ Licensed 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.
+ -->
+<WebView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/help_contents"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:layout_weight="1"/>
\ No newline at end of file
diff --git a/android/playground/src/main/res/layout/history_list_item.xml b/android/playground/src/main/res/layout/history_list_item.xml
new file mode 100755
index 0000000..cb2180a
--- /dev/null
+++ b/android/playground/src/main/res/layout/history_list_item.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2008 ZXing authors
+
+ Licensed 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.
+ -->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:padding="@dimen/standard_padding">
+
+ <TextView android:id="@+id/history_title"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:singleLine="true"
+ android:textIsSelectable="false"/>
+
+ <TextView android:id="@+id/history_detail"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:singleLine="false"
+ android:textIsSelectable="false"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/android/playground/src/main/res/layout/id_stub.xml b/android/playground/src/main/res/layout/id_stub.xml
new file mode 100644
index 0000000..fe829cf
--- /dev/null
+++ b/android/playground/src/main/res/layout/id_stub.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <!-- Do not manual edit this file, it's gen by script-->
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4999"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4998"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4997"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4996"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4995"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4994"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4993"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4992"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4991"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4990"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4989"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4988"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4987"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4986"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4985"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4984"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4983"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4982"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4981"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4980"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4979"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4978"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4977"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4976"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4975"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4974"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4973"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4972"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4971"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4970"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4969"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4968"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4967"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4966"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4965"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4964"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4963"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4962"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4961"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4960"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4959"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4958"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4957"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4956"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4955"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4954"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4953"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4952"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4951"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4950"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4949"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4948"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4947"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4946"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4945"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4944"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4943"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4942"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4941"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4940"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4939"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4938"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4937"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4936"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4935"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4934"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4933"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4932"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4931"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4930"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4929"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4928"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4927"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4926"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4925"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4924"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4923"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4922"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4921"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4920"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4919"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4918"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4917"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4916"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4915"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4914"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4913"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4912"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4911"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4910"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4909"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4908"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4907"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4906"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4905"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4904"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4903"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4902"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4901"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4900"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4899"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4898"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4897"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4896"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4895"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4894"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4893"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4892"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4891"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4890"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4889"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4888"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4887"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4886"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4885"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4884"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4883"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4882"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4881"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4880"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4879"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4878"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4877"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4876"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4875"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4874"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4873"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4872"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4871"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4870"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4869"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4868"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4867"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4866"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4865"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4864"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4863"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4862"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4861"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4860"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4859"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4858"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4857"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4856"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4855"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4854"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4853"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4852"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4851"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4850"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4849"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4848"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4847"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4846"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4845"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4844"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4843"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4842"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4841"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4840"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4839"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4838"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4837"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4836"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4835"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4834"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4833"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4832"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4831"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4830"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4829"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4828"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4827"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4826"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4825"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4824"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4823"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4822"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4821"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4820"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4819"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4818"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4817"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4816"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4815"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4814"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4813"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4812"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4811"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4810"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4809"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4808"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4807"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4806"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4805"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4804"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4803"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4802"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4801"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4800"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4799"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4798"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4797"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4796"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4795"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4794"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4793"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4792"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4791"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4790"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4789"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4788"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4787"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4786"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4785"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4784"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4783"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4782"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4781"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4780"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4779"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4778"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4777"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4776"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4775"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4774"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4773"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4772"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4771"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4770"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4769"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4768"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4767"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4766"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4765"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4764"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4763"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4762"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4761"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4760"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4759"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4758"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4757"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4756"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4755"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4754"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4753"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4752"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4751"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4750"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4749"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4748"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4747"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4746"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4745"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4744"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4743"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4742"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4741"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4740"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4739"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4738"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4737"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4736"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4735"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4734"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4733"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4732"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4731"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4730"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4729"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4728"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4727"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4726"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4725"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4724"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4723"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4722"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4721"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4720"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4719"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4718"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4717"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4716"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4715"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4714"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4713"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4712"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4711"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4710"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4709"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4708"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4707"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4706"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4705"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4704"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4703"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4702"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4701"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4700"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4699"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4698"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4697"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4696"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4695"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4694"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4693"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4692"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4691"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4690"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4689"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4688"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4687"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4686"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4685"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4684"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4683"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4682"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4681"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4680"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4679"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4678"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4677"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4676"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4675"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4674"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4673"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4672"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4671"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4670"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4669"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4668"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4667"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4666"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4665"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4664"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4663"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4662"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4661"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4660"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4659"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4658"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4657"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4656"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4655"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4654"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4653"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4652"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4651"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4650"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4649"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4648"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4647"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4646"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4645"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4644"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4643"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4642"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4641"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4640"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4639"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4638"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4637"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4636"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4635"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4634"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4633"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4632"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4631"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4630"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4629"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4628"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4627"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4626"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4625"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4624"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4623"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4622"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4621"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4620"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4619"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4618"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4617"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4616"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4615"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4614"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4613"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4612"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4611"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4610"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4609"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4608"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4607"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4606"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4605"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4604"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4603"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4602"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4601"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4600"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4599"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4598"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4597"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4596"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4595"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4594"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4593"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4592"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4591"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4590"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4589"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4588"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4587"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4586"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4585"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4584"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4583"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4582"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4581"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4580"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4579"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4578"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4577"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4576"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4575"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4574"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4573"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4572"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4571"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4570"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4569"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4568"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4567"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4566"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4565"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4564"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4563"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4562"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4561"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4560"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4559"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4558"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4557"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4556"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4555"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4554"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4553"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4552"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4551"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4550"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4549"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4548"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4547"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4546"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4545"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4544"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4543"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4542"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4541"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4540"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4539"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4538"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4537"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4536"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4535"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4534"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4533"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4532"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4531"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4530"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4529"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4528"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4527"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4526"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4525"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4524"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4523"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4522"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4521"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4520"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4519"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4518"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4517"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4516"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4515"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4514"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4513"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4512"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4511"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4510"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4509"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4508"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4507"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4506"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4505"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4504"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4503"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4502"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4501"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4500"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4499"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4498"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4497"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4496"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4495"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4494"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4493"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4492"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4491"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4490"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4489"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4488"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4487"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4486"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4485"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4484"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4483"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4482"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4481"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4480"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4479"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4478"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4477"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4476"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4475"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4474"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4473"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4472"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4471"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4470"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4469"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4468"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4467"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4466"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4465"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4464"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4463"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4462"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4461"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4460"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4459"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4458"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4457"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4456"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4455"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4454"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4453"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4452"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4451"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4450"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4449"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4448"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4447"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4446"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4445"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4444"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4443"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4442"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4441"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4440"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4439"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4438"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4437"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4436"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4435"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4434"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4433"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4432"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4431"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4430"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4429"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4428"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4427"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4426"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4425"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4424"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4423"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4422"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4421"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4420"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4419"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4418"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4417"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4416"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4415"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4414"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4413"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4412"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4411"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4410"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4409"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4408"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4407"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4406"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4405"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4404"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4403"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4402"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4401"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4400"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4399"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4398"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4397"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4396"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4395"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4394"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4393"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4392"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4391"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4390"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4389"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4388"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4387"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4386"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4385"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4384"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4383"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4382"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4381"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4380"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4379"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4378"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4377"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4376"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4375"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4374"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4373"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4372"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4371"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4370"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4369"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4368"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4367"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4366"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4365"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4364"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4363"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4362"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4361"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4360"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4359"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4358"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4357"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4356"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4355"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4354"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4353"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4352"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4351"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4350"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4349"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4348"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4347"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4346"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4345"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4344"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4343"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4342"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4341"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4340"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4339"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4338"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4337"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4336"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4335"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4334"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4333"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4332"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4331"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4330"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4329"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4328"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4327"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4326"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4325"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4324"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4323"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4322"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4321"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4320"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4319"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4318"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4317"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4316"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4315"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4314"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4313"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4312"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4311"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4310"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4309"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4308"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4307"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4306"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4305"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4304"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4303"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4302"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4301"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4300"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4299"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4298"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4297"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4296"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4295"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4294"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4293"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4292"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4291"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4290"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4289"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4288"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4287"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4286"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4285"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4284"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4283"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4282"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4281"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4280"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4279"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4278"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4277"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4276"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4275"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4274"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4273"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4272"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4271"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4270"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4269"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4268"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4267"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4266"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4265"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4264"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4263"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4262"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4261"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4260"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4259"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4258"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4257"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4256"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4255"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4254"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4253"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4252"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4251"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4250"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4249"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4248"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4247"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4246"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4245"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4244"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4243"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4242"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4241"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4240"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4239"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4238"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4237"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4236"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4235"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4234"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4233"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4232"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4231"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4230"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4229"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4228"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4227"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4226"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4225"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4224"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4223"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4222"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4221"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4220"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4219"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4218"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4217"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4216"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4215"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4214"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4213"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4212"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4211"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4210"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4209"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4208"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4207"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4206"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4205"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4204"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4203"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4202"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4201"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4200"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4199"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4198"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4197"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4196"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4195"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4194"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4193"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4192"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4191"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4190"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4189"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4188"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4187"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4186"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4185"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4184"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4183"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4182"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4181"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4180"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4179"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4178"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4177"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4176"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4175"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4174"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4173"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4172"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4171"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4170"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4169"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4168"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4167"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4166"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4165"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4164"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4163"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4162"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4161"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4160"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4159"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4158"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4157"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4156"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4155"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4154"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4153"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4152"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4151"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4150"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4149"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4148"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4147"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4146"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4145"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4144"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4143"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4142"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4141"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4140"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4139"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4138"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4137"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4136"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4135"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4134"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4133"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4132"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4131"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4130"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4129"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4128"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4127"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4126"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4125"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4124"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4123"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4122"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4121"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4120"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4119"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4118"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4117"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4116"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4115"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4114"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4113"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4112"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4111"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4110"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4109"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4108"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4107"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4106"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4105"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4104"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4103"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4102"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4101"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4100"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4099"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4098"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4097"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4096"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4095"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4094"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4093"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4092"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4091"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4090"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4089"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4088"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4087"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4086"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4085"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4084"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4083"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4082"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4081"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4080"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4079"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4078"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4077"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4076"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4075"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4074"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4073"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4072"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4071"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4070"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4069"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4068"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4067"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4066"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4065"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4064"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4063"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4062"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4061"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4060"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4059"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4058"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4057"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4056"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4055"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4054"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4053"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4052"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4051"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4050"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4049"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4048"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4047"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4046"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4045"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4044"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4043"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4042"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4041"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4040"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4039"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4038"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4037"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4036"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4035"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4034"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4033"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4032"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4031"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4030"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4029"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4028"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4027"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4026"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4025"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4024"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4023"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4022"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4021"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4020"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4019"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4018"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4017"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4016"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4015"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4014"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4013"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4012"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4011"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4010"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4009"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4008"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4007"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4006"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4005"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4004"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4003"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4002"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4001"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4000"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3999"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3998"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3997"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3996"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3995"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3994"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3993"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3992"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3991"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3990"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3989"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3988"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3987"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3986"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3985"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3984"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3983"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3982"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3981"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3980"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3979"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3978"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3977"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3976"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3975"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3974"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3973"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3972"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3971"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3970"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3969"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3968"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3967"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3966"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3965"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3964"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3963"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3962"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3961"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3960"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3959"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3958"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3957"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3956"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3955"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3954"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3953"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3952"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3951"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3950"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3949"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3948"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3947"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3946"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3945"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3944"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3943"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3942"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3941"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3940"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3939"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3938"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3937"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3936"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3935"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3934"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3933"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3932"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3931"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3930"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3929"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3928"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3927"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3926"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3925"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3924"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3923"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3922"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3921"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3920"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3919"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3918"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3917"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3916"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3915"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3914"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3913"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3912"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3911"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3910"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3909"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3908"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3907"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3906"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3905"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3904"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3903"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3902"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3901"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3900"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3899"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3898"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3897"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3896"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3895"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3894"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3893"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3892"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3891"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3890"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3889"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3888"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3887"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3886"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3885"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3884"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3883"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3882"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3881"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3880"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3879"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3878"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3877"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3876"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3875"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3874"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3873"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3872"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3871"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3870"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3869"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3868"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3867"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3866"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3865"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3864"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3863"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3862"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3861"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3860"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3859"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3858"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3857"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3856"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3855"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3854"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3853"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3852"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3851"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3850"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3849"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3848"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3847"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3846"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3845"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3844"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3843"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3842"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3841"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3840"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3839"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3838"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3837"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3836"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3835"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3834"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3833"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3832"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3831"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3830"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3829"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3828"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3827"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3826"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3825"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3824"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3823"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3822"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3821"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3820"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3819"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3818"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3817"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3816"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3815"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3814"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3813"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3812"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3811"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3810"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3809"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3808"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3807"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3806"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3805"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3804"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3803"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3802"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3801"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3800"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3799"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3798"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3797"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3796"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3795"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3794"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3793"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3792"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3791"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3790"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3789"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3788"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3787"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3786"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3785"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3784"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3783"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3782"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3781"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3780"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3779"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3778"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3777"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3776"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3775"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3774"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3773"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3772"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3771"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3770"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3769"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3768"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3767"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3766"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3765"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3764"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3763"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3762"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3761"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3760"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3759"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3758"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3757"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3756"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3755"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3754"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3753"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3752"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3751"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3750"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3749"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3748"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3747"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3746"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3745"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3744"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3743"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3742"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3741"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3740"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3739"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3738"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3737"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3736"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3735"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3734"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3733"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3732"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3731"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3730"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3729"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3728"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3727"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3726"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3725"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3724"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3723"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3722"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3721"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3720"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3719"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3718"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3717"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3716"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3715"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3714"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3713"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3712"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3711"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3710"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3709"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3708"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3707"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3706"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3705"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3704"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3703"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3702"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3701"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3700"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3699"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3698"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3697"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3696"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3695"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3694"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3693"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3692"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3691"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3690"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3689"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3688"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3687"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3686"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3685"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3684"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3683"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3682"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3681"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3680"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3679"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3678"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3677"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3676"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3675"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3674"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3673"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3672"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3671"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3670"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3669"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3668"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3667"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3666"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3665"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3664"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3663"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3662"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3661"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3660"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3659"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3658"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3657"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3656"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3655"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3654"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3653"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3652"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3651"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3650"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3649"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3648"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3647"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3646"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3645"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3644"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3643"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3642"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3641"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3640"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3639"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3638"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3637"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3636"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3635"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3634"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3633"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3632"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3631"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3630"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3629"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3628"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3627"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3626"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3625"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3624"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3623"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3622"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3621"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3620"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3619"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3618"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3617"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3616"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3615"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3614"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3613"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3612"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3611"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3610"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3609"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3608"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3607"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3606"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3605"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3604"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3603"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3602"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3601"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3600"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3599"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3598"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3597"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3596"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3595"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3594"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3593"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3592"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3591"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3590"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3589"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3588"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3587"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3586"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3585"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3584"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3583"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3582"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3581"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3580"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3579"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3578"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3577"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3576"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3575"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3574"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3573"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3572"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3571"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3570"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3569"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3568"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3567"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3566"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3565"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3564"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3563"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3562"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3561"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3560"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3559"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3558"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3557"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3556"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3555"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3554"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3553"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3552"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3551"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3550"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3549"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3548"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3547"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3546"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3545"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3544"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3543"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3542"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3541"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3540"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3539"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3538"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3537"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3536"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3535"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3534"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3533"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3532"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3531"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3530"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3529"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3528"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3527"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3526"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3525"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3524"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3523"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3522"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3521"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3520"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3519"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3518"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3517"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3516"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3515"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3514"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3513"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3512"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3511"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3510"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3509"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3508"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3507"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3506"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3505"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3504"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3503"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3502"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3501"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3500"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3499"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3498"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3497"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3496"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3495"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3494"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3493"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3492"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3491"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3490"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3489"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3488"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3487"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3486"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3485"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3484"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3483"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3482"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3481"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3480"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3479"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3478"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3477"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3476"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3475"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3474"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3473"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3472"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3471"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3470"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3469"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3468"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3467"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3466"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3465"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3464"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3463"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3462"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3461"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3460"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3459"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3458"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3457"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3456"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3455"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3454"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3453"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3452"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3451"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3450"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3449"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3448"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3447"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3446"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3445"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3444"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3443"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3442"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3441"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3440"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3439"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3438"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3437"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3436"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3435"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3434"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3433"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3432"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3431"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3430"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3429"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3428"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3427"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3426"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3425"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3424"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3423"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3422"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3421"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3420"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3419"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3418"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3417"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3416"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3415"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3414"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3413"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3412"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3411"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3410"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3409"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3408"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3407"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3406"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3405"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3404"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3403"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3402"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3401"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3400"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3399"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3398"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3397"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3396"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3395"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3394"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3393"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3392"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3391"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3390"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3389"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3388"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3387"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3386"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3385"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3384"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3383"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3382"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3381"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3380"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3379"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3378"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3377"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3376"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3375"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3374"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3373"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3372"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3371"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3370"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3369"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3368"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3367"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3366"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3365"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3364"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3363"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3362"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3361"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3360"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3359"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3358"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3357"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3356"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3355"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3354"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3353"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3352"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3351"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3350"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3349"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3348"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3347"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3346"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3345"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3344"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3343"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3342"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3341"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3340"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3339"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3338"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3337"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3336"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3335"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3334"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3333"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3332"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3331"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3330"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3329"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3328"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3327"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3326"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3325"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3324"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3323"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3322"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3321"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3320"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3319"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3318"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3317"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3316"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3315"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3314"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3313"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3312"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3311"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3310"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3309"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3308"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3307"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3306"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3305"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3304"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3303"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3302"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3301"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3300"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3299"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3298"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3297"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3296"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3295"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3294"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3293"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3292"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3291"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3290"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3289"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3288"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3287"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3286"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3285"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3284"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3283"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3282"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3281"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3280"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3279"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3278"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3277"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3276"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3275"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3274"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3273"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3272"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3271"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3270"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3269"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3268"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3267"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3266"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3265"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3264"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3263"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3262"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3261"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3260"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3259"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3258"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3257"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3256"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3255"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3254"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3253"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3252"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3251"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3250"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3249"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3248"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3247"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3246"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3245"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3244"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3243"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3242"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3241"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3240"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3239"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3238"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3237"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3236"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3235"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3234"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3233"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3232"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3231"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3230"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3229"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3228"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3227"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3226"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3225"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3224"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3223"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3222"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3221"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3220"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3219"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3218"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3217"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3216"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3215"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3214"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3213"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3212"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3211"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3210"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3209"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3208"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3207"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3206"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3205"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3204"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3203"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3202"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3201"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3200"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3199"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3198"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3197"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3196"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3195"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3194"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3193"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3192"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3191"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3190"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3189"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3188"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3187"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3186"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3185"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3184"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3183"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3182"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3181"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3180"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3179"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3178"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3177"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3176"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3175"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3174"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3173"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3172"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3171"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3170"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3169"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3168"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3167"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3166"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3165"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3164"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3163"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3162"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3161"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3160"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3159"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3158"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3157"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3156"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3155"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3154"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3153"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3152"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3151"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3150"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3149"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3148"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3147"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3146"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3145"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3144"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3143"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3142"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3141"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3140"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3139"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3138"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3137"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3136"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3135"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3134"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3133"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3132"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3131"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3130"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3129"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3128"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3127"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3126"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3125"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3124"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3123"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3122"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3121"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3120"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3119"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3118"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3117"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3116"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3115"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3114"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3113"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3112"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3111"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3110"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3109"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3108"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3107"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3106"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3105"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3104"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3103"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3102"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3101"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3100"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3099"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3098"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3097"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3096"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3095"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3094"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3093"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3092"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3091"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3090"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3089"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3088"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3087"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3086"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3085"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3084"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3083"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3082"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3081"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3080"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3079"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3078"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3077"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3076"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3075"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3074"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3073"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3072"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3071"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3070"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3069"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3068"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3067"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3066"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3065"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3064"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3063"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3062"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3061"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3060"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3059"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3058"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3057"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3056"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3055"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3054"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3053"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3052"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3051"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3050"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3049"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3048"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3047"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3046"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3045"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3044"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3043"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3042"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3041"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3040"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3039"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3038"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3037"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3036"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3035"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3034"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3033"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3032"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3031"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3030"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3029"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3028"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3027"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3026"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3025"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3024"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3023"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3022"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3021"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3020"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3019"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3018"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3017"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3016"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3015"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3014"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3013"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3012"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3011"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3010"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3009"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3008"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3007"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3006"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3005"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3004"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3003"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3002"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3001"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3000"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2999"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2998"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2997"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2996"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2995"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2994"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2993"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2992"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2991"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2990"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2989"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2988"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2987"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2986"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2985"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2984"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2983"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2982"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2981"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2980"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2979"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2978"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2977"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2976"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2975"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2974"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2973"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2972"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2971"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2970"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2969"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2968"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2967"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2966"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2965"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2964"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2963"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2962"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2961"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2960"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2959"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2958"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2957"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2956"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2955"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2954"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2953"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2952"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2951"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2950"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2949"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2948"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2947"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2946"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2945"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2944"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2943"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2942"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2941"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2940"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2939"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2938"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2937"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2936"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2935"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2934"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2933"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2932"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2931"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2930"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2929"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2928"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2927"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2926"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2925"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2924"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2923"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2922"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2921"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2920"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2919"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2918"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2917"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2916"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2915"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2914"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2913"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2912"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2911"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2910"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2909"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2908"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2907"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2906"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2905"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2904"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2903"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2902"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2901"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2900"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2899"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2898"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2897"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2896"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2895"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2894"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2893"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2892"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2891"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2890"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2889"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2888"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2887"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2886"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2885"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2884"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2883"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2882"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2881"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2880"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2879"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2878"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2877"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2876"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2875"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2874"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2873"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2872"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2871"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2870"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2869"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2868"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2867"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2866"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2865"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2864"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2863"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2862"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2861"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2860"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2859"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2858"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2857"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2856"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2855"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2854"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2853"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2852"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2851"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2850"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2849"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2848"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2847"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2846"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2845"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2844"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2843"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2842"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2841"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2840"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2839"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2838"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2837"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2836"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2835"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2834"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2833"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2832"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2831"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2830"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2829"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2828"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2827"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2826"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2825"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2824"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2823"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2822"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2821"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2820"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2819"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2818"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2817"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2816"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2815"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2814"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2813"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2812"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2811"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2810"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2809"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2808"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2807"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2806"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2805"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2804"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2803"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2802"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2801"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2800"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2799"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2798"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2797"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2796"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2795"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2794"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2793"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2792"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2791"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2790"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2789"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2788"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2787"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2786"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2785"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2784"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2783"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2782"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2781"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2780"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2779"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2778"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2777"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2776"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2775"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2774"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2773"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2772"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2771"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2770"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2769"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2768"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2767"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2766"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2765"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2764"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2763"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2762"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2761"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2760"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2759"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2758"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2757"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2756"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2755"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2754"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2753"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2752"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2751"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2750"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2749"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2748"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2747"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2746"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2745"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2744"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2743"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2742"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2741"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2740"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2739"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2738"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2737"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2736"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2735"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2734"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2733"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2732"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2731"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2730"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2729"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2728"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2727"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2726"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2725"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2724"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2723"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2722"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2721"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2720"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2719"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2718"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2717"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2716"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2715"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2714"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2713"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2712"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2711"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2710"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2709"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2708"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2707"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2706"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2705"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2704"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2703"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2702"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2701"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2700"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2699"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2698"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2697"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2696"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2695"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2694"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2693"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2692"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2691"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2690"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2689"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2688"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2687"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2686"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2685"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2684"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2683"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2682"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2681"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2680"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2679"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2678"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2677"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2676"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2675"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2674"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2673"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2672"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2671"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2670"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2669"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2668"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2667"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2666"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2665"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2664"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2663"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2662"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2661"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2660"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2659"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2658"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2657"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2656"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2655"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2654"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2653"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2652"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2651"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2650"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2649"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2648"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2647"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2646"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2645"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2644"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2643"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2642"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2641"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2640"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2639"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2638"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2637"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2636"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2635"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2634"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2633"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2632"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2631"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2630"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2629"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2628"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2627"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2626"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2625"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2624"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2623"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2622"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2621"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2620"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2619"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2618"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2617"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2616"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2615"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2614"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2613"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2612"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2611"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2610"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2609"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2608"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2607"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2606"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2605"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2604"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2603"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2602"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2601"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2600"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2599"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2598"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2597"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2596"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2595"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2594"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2593"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2592"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2591"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2590"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2589"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2588"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2587"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2586"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2585"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2584"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2583"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2582"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2581"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2580"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2579"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2578"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2577"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2576"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2575"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2574"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2573"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2572"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2571"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2570"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2569"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2568"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2567"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2566"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2565"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2564"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2563"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2562"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2561"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2560"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2559"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2558"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2557"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2556"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2555"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2554"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2553"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2552"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2551"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2550"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2549"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2548"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2547"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2546"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2545"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2544"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2543"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2542"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2541"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2540"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2539"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2538"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2537"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2536"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2535"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2534"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2533"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2532"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2531"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2530"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2529"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2528"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2527"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2526"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2525"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2524"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2523"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2522"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2521"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2520"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2519"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2518"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2517"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2516"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2515"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2514"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2513"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2512"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2511"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2510"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2509"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2508"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2507"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2506"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2505"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2504"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2503"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2502"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2501"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2500"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2499"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2498"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2497"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2496"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2495"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2494"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2493"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2492"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2491"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2490"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2489"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2488"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2487"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2486"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2485"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2484"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2483"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2482"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2481"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2480"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2479"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2478"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2477"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2476"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2475"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2474"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2473"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2472"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2471"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2470"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2469"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2468"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2467"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2466"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2465"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2464"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2463"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2462"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2461"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2460"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2459"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2458"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2457"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2456"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2455"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2454"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2453"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2452"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2451"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2450"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2449"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2448"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2447"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2446"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2445"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2444"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2443"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2442"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2441"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2440"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2439"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2438"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2437"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2436"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2435"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2434"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2433"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2432"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2431"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2430"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2429"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2428"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2427"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2426"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2425"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2424"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2423"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2422"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2421"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2420"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2419"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2418"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2417"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2416"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2415"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2414"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2413"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2412"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2411"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2410"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2409"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2408"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2407"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2406"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2405"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2404"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2403"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2402"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2401"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2400"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2399"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2398"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2397"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2396"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2395"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2394"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2393"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2392"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2391"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2390"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2389"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2388"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2387"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2386"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2385"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2384"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2383"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2382"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2381"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2380"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2379"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2378"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2377"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2376"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2375"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2374"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2373"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2372"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2371"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2370"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2369"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2368"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2367"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2366"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2365"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2364"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2363"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2362"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2361"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2360"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2359"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2358"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2357"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2356"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2355"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2354"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2353"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2352"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2351"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2350"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2349"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2348"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2347"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2346"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2345"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2344"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2343"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2342"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2341"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2340"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2339"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2338"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2337"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2336"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2335"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2334"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2333"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2332"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2331"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2330"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2329"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2328"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2327"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2326"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2325"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2324"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2323"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2322"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2321"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2320"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2319"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2318"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2317"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2316"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2315"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2314"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2313"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2312"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2311"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2310"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2309"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2308"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2307"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2306"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2305"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2304"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2303"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2302"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2301"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2300"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2299"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2298"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2297"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2296"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2295"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2294"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2293"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2292"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2291"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2290"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2289"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2288"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2287"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2286"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2285"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2284"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2283"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2282"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2281"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2280"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2279"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2278"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2277"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2276"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2275"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2274"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2273"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2272"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2271"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2270"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2269"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2268"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2267"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2266"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2265"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2264"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2263"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2262"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2261"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2260"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2259"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2258"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2257"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2256"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2255"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2254"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2253"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2252"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2251"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2250"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2249"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2248"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2247"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2246"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2245"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2244"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2243"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2242"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2241"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2240"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2239"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2238"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2237"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2236"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2235"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2234"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2233"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2232"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2231"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2230"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2229"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2228"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2227"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2226"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2225"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2224"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2223"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2222"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2221"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2220"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2219"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2218"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2217"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2216"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2215"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2214"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2213"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2212"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2211"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2210"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2209"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2208"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2207"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2206"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2205"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2204"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2203"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2202"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2201"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2200"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2199"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2198"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2197"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2196"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2195"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2194"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2193"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2192"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2191"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2190"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2189"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2188"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2187"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2186"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2185"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2184"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2183"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2182"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2181"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2180"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2179"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2178"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2177"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2176"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2175"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2174"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2173"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2172"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2171"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2170"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2169"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2168"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2167"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2166"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2165"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2164"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2163"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2162"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2161"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2160"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2159"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2158"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2157"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2156"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2155"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2154"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2153"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2152"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2151"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2150"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2149"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2148"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2147"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2146"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2145"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2144"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2143"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2142"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2141"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2140"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2139"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2138"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2137"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2136"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2135"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2134"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2133"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2132"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2131"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2130"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2129"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2128"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2127"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2126"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2125"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2124"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2123"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2122"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2121"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2120"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2119"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2118"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2117"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2116"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2115"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2114"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2113"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2112"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2111"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2110"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2109"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2108"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2107"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2106"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2105"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2104"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2103"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2102"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2101"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2100"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2099"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2098"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2097"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2096"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2095"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2094"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2093"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2092"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2091"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2090"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2089"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2088"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2087"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2086"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2085"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2084"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2083"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2082"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2081"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2080"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2079"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2078"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2077"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2076"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2075"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2074"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2073"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2072"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2071"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2070"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2069"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2068"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2067"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2066"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2065"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2064"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2063"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2062"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2061"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2060"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2059"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2058"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2057"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2056"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2055"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2054"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2053"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2052"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2051"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2050"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2049"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2048"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2047"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2046"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2045"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2044"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2043"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2042"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2041"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2040"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2039"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2038"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2037"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2036"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2035"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2034"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2033"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2032"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2031"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2030"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2029"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2028"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2027"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2026"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2025"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2024"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2023"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2022"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2021"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2020"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2019"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2018"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2017"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2016"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2015"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2014"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2013"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2012"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2011"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2010"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2009"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2008"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2007"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2006"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2005"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2004"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2003"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2002"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2001"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2000"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1999"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1998"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1997"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1996"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1995"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1994"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1993"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1992"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1991"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1990"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1989"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1988"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1987"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1986"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1985"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1984"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1983"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1982"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1981"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1980"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1979"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1978"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1977"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1976"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1975"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1974"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1973"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1972"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1971"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1970"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1969"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1968"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1967"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1966"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1965"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1964"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1963"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1962"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1961"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1960"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1959"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1958"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1957"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1956"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1955"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1954"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1953"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1952"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1951"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1950"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1949"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1948"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1947"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1946"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1945"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1944"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1943"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1942"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1941"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1940"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1939"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1938"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1937"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1936"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1935"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1934"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1933"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1932"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1931"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1930"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1929"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1928"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1927"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1926"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1925"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1924"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1923"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1922"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1921"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1920"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1919"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1918"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1917"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1916"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1915"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1914"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1913"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1912"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1911"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1910"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1909"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1908"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1907"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1906"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1905"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1904"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1903"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1902"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1901"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1900"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1899"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1898"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1897"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1896"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1895"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1894"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1893"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1892"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1891"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1890"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1889"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1888"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1887"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1886"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1885"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1884"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1883"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1882"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1881"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1880"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1879"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1878"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1877"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1876"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1875"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1874"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1873"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1872"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1871"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1870"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1869"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1868"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1867"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1866"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1865"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1864"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1863"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1862"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1861"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1860"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1859"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1858"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1857"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1856"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1855"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1854"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1853"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1852"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1851"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1850"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1849"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1848"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1847"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1846"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1845"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1844"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1843"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1842"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1841"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1840"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1839"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1838"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1837"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1836"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1835"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1834"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1833"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1832"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1831"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1830"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1829"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1828"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1827"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1826"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1825"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1824"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1823"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1822"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1821"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1820"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1819"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1818"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1817"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1816"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1815"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1814"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1813"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1812"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1811"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1810"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1809"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1808"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1807"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1806"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1805"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1804"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1803"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1802"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1801"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1800"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1799"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1798"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1797"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1796"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1795"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1794"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1793"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1792"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1791"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1790"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1789"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1788"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1787"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1786"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1785"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1784"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1783"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1782"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1781"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1780"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1779"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1778"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1777"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1776"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1775"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1774"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1773"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1772"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1771"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1770"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1769"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1768"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1767"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1766"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1765"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1764"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1763"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1762"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1761"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1760"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1759"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1758"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1757"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1756"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1755"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1754"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1753"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1752"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1751"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1750"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1749"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1748"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1747"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1746"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1745"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1744"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1743"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1742"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1741"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1740"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1739"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1738"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1737"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1736"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1735"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1734"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1733"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1732"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1731"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1730"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1729"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1728"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1727"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1726"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1725"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1724"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1723"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1722"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1721"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1720"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1719"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1718"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1717"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1716"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1715"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1714"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1713"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1712"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1711"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1710"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1709"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1708"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1707"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1706"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1705"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1704"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1703"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1702"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1701"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1700"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1699"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1698"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1697"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1696"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1695"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1694"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1693"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1692"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1691"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1690"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1689"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1688"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1687"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1686"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1685"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1684"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1683"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1682"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1681"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1680"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1679"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1678"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1677"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1676"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1675"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1674"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1673"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1672"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1671"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1670"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1669"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1668"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1667"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1666"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1665"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1664"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1663"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1662"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1661"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1660"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1659"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1658"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1657"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1656"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1655"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1654"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1653"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1652"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1651"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1650"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1649"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1648"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1647"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1646"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1645"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1644"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1643"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1642"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1641"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1640"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1639"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1638"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1637"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1636"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1635"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1634"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1633"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1632"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1631"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1630"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1629"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1628"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1627"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1626"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1625"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1624"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1623"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1622"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1621"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1620"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1619"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1618"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1617"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1616"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1615"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1614"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1613"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1612"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1611"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1610"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1609"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1608"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1607"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1606"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1605"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1604"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1603"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1602"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1601"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1600"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1599"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1598"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1597"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1596"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1595"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1594"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1593"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1592"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1591"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1590"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1589"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1588"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1587"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1586"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1585"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1584"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1583"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1582"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1581"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1580"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1579"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1578"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1577"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1576"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1575"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1574"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1573"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1572"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1571"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1570"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1569"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1568"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1567"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1566"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1565"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1564"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1563"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1562"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1561"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1560"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1559"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1558"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1557"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1556"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1555"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1554"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1553"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1552"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1551"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1550"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1549"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1548"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1547"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1546"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1545"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1544"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1543"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1542"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1541"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1540"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1539"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1538"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1537"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1536"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1535"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1534"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1533"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1532"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1531"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1530"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1529"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1528"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1527"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1526"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1525"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1524"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1523"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1522"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1521"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1520"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1519"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1518"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1517"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1516"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1515"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1514"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1513"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1512"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1511"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1510"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1509"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1508"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1507"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1506"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1505"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1504"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1503"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1502"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1501"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1500"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1499"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1498"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1497"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1496"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1495"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1494"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1493"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1492"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1491"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1490"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1489"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1488"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1487"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1486"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1485"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1484"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1483"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1482"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1481"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1480"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1479"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1478"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1477"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1476"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1475"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1474"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1473"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1472"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1471"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1470"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1469"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1468"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1467"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1466"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1465"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1464"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1463"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1462"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1461"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1460"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1459"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1458"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1457"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1456"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1455"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1454"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1453"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1452"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1451"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1450"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1449"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1448"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1447"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1446"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1445"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1444"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1443"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1442"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1441"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1440"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1439"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1438"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1437"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1436"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1435"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1434"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1433"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1432"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1431"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1430"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1429"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1428"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1427"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1426"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1425"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1424"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1423"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1422"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1421"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1420"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1419"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1418"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1417"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1416"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1415"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1414"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1413"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1412"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1411"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1410"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1409"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1408"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1407"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1406"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1405"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1404"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1403"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1402"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1401"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1400"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1399"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1398"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1397"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1396"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1395"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1394"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1393"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1392"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1391"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1390"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1389"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1388"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1387"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1386"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1385"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1384"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1383"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1382"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1381"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1380"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1379"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1378"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1377"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1376"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1375"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1374"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1373"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1372"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1371"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1370"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1369"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1368"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1367"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1366"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1365"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1364"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1363"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1362"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1361"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1360"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1359"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1358"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1357"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1356"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1355"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1354"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1353"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1352"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1351"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1350"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1349"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1348"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1347"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1346"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1345"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1344"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1343"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1342"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1341"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1340"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1339"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1338"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1337"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1336"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1335"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1334"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1333"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1332"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1331"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1330"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1329"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1328"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1327"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1326"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1325"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1324"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1323"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1322"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1321"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1320"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1319"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1318"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1317"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1316"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1315"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1314"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1313"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1312"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1311"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1310"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1309"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1308"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1307"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1306"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1305"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1304"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1303"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1302"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1301"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1300"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1299"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1298"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1297"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1296"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1295"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1294"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1293"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1292"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1291"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1290"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1289"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1288"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1287"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1286"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1285"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1284"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1283"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1282"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1281"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1280"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1279"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1278"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1277"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1276"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1275"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1274"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1273"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1272"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1271"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1270"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1269"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1268"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1267"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1266"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1265"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1264"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1263"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1262"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1261"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1260"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1259"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1258"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1257"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1256"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1255"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1254"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1253"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1252"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1251"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1250"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1249"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1248"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1247"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1246"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1245"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1244"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1243"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1242"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1241"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1240"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1239"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1238"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1237"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1236"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1235"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1234"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1233"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1232"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1231"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1230"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1229"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1228"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1227"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1226"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1225"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1224"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1223"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1222"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1221"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1220"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1219"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1218"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1217"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1216"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1215"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1214"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1213"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1212"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1211"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1210"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1209"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1208"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1207"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1206"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1205"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1204"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1203"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1202"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1201"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1200"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1199"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1198"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1197"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1196"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1195"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1194"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1193"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1192"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1191"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1190"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1189"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1188"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1187"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1186"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1185"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1184"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1183"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1182"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1181"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1180"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1179"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1178"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1177"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1176"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1175"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1174"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1173"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1172"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1171"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1170"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1169"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1168"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1167"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1166"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1165"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1164"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1163"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1162"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1161"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1160"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1159"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1158"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1157"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1156"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1155"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1154"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1153"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1152"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1151"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1150"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1149"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1148"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1147"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1146"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1145"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1144"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1143"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1142"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1141"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1140"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1139"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1138"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1137"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1136"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1135"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1134"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1133"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1132"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1131"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1130"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1129"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1128"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1127"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1126"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1125"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1124"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1123"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1122"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1121"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1120"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1119"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1118"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1117"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1116"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1115"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1114"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1113"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1112"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1111"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1110"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1109"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1108"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1107"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1106"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1105"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1104"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1103"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1102"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1101"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1100"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1099"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1098"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1097"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1096"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1095"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1094"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1093"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1092"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1091"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1090"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1089"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1088"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1087"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1086"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1085"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1084"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1083"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1082"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1081"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1080"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1079"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1078"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1077"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1076"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1075"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1074"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1073"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1072"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1071"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1070"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1069"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1068"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1067"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1066"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1065"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1064"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1063"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1062"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1061"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1060"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1059"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1058"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1057"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1056"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1055"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1054"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1053"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1052"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1051"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1050"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1049"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1048"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1047"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1046"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1045"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1044"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1043"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1042"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1041"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1040"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1039"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1038"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1037"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1036"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1035"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1034"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1033"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1032"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1031"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1030"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1029"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1028"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1027"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1026"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1025"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1024"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1023"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1022"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1021"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1020"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1019"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1018"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1017"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1016"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1015"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1014"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1013"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1012"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1011"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1010"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1009"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1008"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1007"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1006"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1005"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1004"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1003"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1002"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1001"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1000"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_999"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_998"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_997"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_996"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_995"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_994"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_993"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_992"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_991"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_990"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_989"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_988"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_987"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_986"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_985"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_984"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_983"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_982"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_981"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_980"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_979"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_978"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_977"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_976"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_975"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_974"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_973"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_972"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_971"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_970"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_969"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_968"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_967"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_966"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_965"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_964"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_963"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_962"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_961"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_960"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_959"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_958"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_957"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_956"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_955"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_954"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_953"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_952"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_951"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_950"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_949"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_948"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_947"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_946"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_945"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_944"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_943"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_942"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_941"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_940"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_939"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_938"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_937"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_936"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_935"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_934"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_933"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_932"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_931"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_930"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_929"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_928"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_927"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_926"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_925"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_924"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_923"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_922"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_921"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_920"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_919"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_918"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_917"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_916"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_915"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_914"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_913"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_912"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_911"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_910"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_909"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_908"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_907"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_906"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_905"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_904"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_903"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_902"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_901"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_900"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_899"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_898"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_897"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_896"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_895"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_894"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_893"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_892"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_891"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_890"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_889"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_888"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_887"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_886"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_885"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_884"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_883"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_882"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_881"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_880"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_879"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_878"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_877"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_876"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_875"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_874"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_873"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_872"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_871"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_870"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_869"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_868"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_867"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_866"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_865"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_864"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_863"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_862"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_861"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_860"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_859"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_858"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_857"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_856"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_855"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_854"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_853"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_852"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_851"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_850"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_849"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_848"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_847"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_846"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_845"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_844"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_843"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_842"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_841"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_840"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_839"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_838"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_837"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_836"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_835"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_834"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_833"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_832"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_831"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_830"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_829"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_828"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_827"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_826"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_825"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_824"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_823"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_822"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_821"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_820"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_819"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_818"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_817"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_816"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_815"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_814"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_813"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_812"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_811"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_810"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_809"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_808"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_807"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_806"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_805"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_804"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_803"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_802"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_801"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_800"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_799"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_798"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_797"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_796"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_795"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_794"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_793"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_792"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_791"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_790"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_789"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_788"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_787"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_786"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_785"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_784"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_783"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_782"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_781"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_780"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_779"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_778"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_777"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_776"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_775"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_774"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_773"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_772"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_771"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_770"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_769"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_768"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_767"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_766"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_765"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_764"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_763"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_762"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_761"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_760"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_759"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_758"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_757"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_756"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_755"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_754"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_753"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_752"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_751"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_750"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_749"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_748"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_747"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_746"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_745"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_744"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_743"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_742"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_741"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_740"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_739"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_738"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_737"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_736"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_735"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_734"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_733"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_732"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_731"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_730"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_729"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_728"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_727"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_726"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_725"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_724"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_723"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_722"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_721"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_720"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_719"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_718"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_717"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_716"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_715"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_714"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_713"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_712"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_711"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_710"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_709"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_708"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_707"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_706"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_705"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_704"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_703"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_702"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_701"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_700"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_699"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_698"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_697"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_696"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_695"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_694"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_693"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_692"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_691"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_690"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_689"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_688"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_687"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_686"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_685"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_684"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_683"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_682"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_681"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_680"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_679"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_678"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_677"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_676"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_675"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_674"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_673"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_672"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_671"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_670"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_669"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_668"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_667"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_666"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_665"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_664"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_663"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_662"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_661"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_660"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_659"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_658"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_657"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_656"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_655"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_654"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_653"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_652"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_651"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_650"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_649"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_648"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_647"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_646"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_645"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_644"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_643"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_642"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_641"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_640"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_639"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_638"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_637"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_636"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_635"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_634"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_633"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_632"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_631"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_630"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_629"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_628"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_627"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_626"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_625"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_624"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_623"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_622"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_621"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_620"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_619"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_618"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_617"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_616"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_615"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_614"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_613"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_612"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_611"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_610"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_609"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_608"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_607"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_606"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_605"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_604"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_603"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_602"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_601"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_600"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_599"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_598"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_597"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_596"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_595"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_594"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_593"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_592"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_591"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_590"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_589"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_588"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_587"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_586"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_585"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_584"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_583"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_582"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_581"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_580"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_579"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_578"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_577"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_576"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_575"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_574"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_573"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_572"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_571"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_570"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_569"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_568"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_567"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_566"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_565"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_564"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_563"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_562"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_561"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_560"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_559"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_558"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_557"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_556"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_555"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_554"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_553"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_552"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_551"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_550"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_549"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_548"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_547"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_546"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_545"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_544"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_543"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_542"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_541"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_540"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_539"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_538"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_537"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_536"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_535"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_534"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_533"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_532"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_531"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_530"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_529"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_528"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_527"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_526"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_525"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_524"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_523"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_522"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_521"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_520"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_519"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_518"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_517"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_516"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_515"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_514"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_513"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_512"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_511"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_510"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_509"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_508"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_507"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_506"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_505"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_504"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_503"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_502"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_501"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_500"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_499"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_498"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_497"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_496"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_495"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_494"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_493"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_492"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_491"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_490"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_489"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_488"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_487"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_486"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_485"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_484"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_483"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_482"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_481"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_480"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_479"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_478"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_477"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_476"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_475"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_474"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_473"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_472"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_471"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_470"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_469"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_468"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_467"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_466"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_465"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_464"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_463"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_462"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_461"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_460"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_459"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_458"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_457"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_456"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_455"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_454"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_453"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_452"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_451"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_450"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_449"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_448"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_447"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_446"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_445"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_444"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_443"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_442"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_441"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_440"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_439"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_438"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_437"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_436"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_435"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_434"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_433"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_432"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_431"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_430"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_429"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_428"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_427"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_426"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_425"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_424"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_423"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_422"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_421"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_420"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_419"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_418"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_417"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_416"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_415"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_414"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_413"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_412"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_411"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_410"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_409"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_408"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_407"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_406"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_405"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_404"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_403"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_402"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_401"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_400"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_399"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_398"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_397"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_396"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_395"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_394"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_393"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_392"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_391"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_390"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_389"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_388"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_387"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_386"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_385"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_384"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_383"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_382"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_381"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_380"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_379"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_378"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_377"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_376"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_375"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_374"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_373"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_372"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_371"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_370"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_369"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_368"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_367"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_366"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_365"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_364"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_363"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_362"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_361"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_360"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_359"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_358"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_357"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_356"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_355"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_354"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_353"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_352"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_351"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_350"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_349"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_348"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_347"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_346"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_345"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_344"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_343"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_342"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_341"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_340"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_339"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_338"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_337"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_336"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_335"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_334"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_333"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_332"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_331"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_330"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_329"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_328"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_327"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_326"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_325"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_324"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_323"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_322"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_321"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_320"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_319"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_318"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_317"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_316"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_315"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_314"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_313"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_312"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_311"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_310"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_309"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_308"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_307"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_306"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_305"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_304"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_303"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_302"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_301"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_300"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_299"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_298"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_297"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_296"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_295"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_294"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_293"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_292"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_291"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_290"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_289"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_288"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_287"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_286"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_285"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_284"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_283"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_282"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_281"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_280"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_279"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_278"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_277"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_276"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_275"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_274"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_273"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_272"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_271"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_270"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_269"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_268"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_267"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_266"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_265"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_264"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_263"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_262"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_261"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_260"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_259"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_258"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_257"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_256"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_255"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_254"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_253"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_252"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_251"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_250"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_249"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_248"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_247"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_246"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_245"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_244"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_243"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_242"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_241"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_240"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_239"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_238"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_237"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_236"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_235"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_234"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_233"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_232"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_231"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_230"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_229"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_228"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_227"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_226"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_225"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_224"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_223"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_222"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_221"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_220"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_219"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_218"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_217"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_216"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_215"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_214"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_213"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_212"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_211"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_210"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_209"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_208"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_207"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_206"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_205"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_204"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_203"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_202"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_201"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_200"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_199"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_198"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_197"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_196"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_195"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_194"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_193"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_192"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_191"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_190"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_189"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_188"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_187"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_186"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_185"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_184"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_183"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_182"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_181"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_180"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_179"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_178"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_177"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_176"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_175"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_174"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_173"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_172"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_171"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_170"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_169"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_168"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_167"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_166"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_165"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_164"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_163"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_162"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_161"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_160"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_159"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_158"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_157"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_156"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_155"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_154"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_153"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_152"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_151"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_150"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_149"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_148"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_147"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_146"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_145"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_144"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_143"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_142"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_141"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_140"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_139"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_138"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_137"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_136"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_135"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_134"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_133"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_132"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_131"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_130"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_129"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_128"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_127"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_126"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_125"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_124"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_123"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_122"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_121"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_120"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_119"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_118"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_117"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_116"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_115"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_114"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_113"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_112"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_111"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_110"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_109"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_108"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_107"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_106"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_105"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_104"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_103"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_102"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_101"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_100"/>
+ <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_99"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_98"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_97"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_96"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_95"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_94"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_93"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_92"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_91"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_90"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_89"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_88"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_87"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_86"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_85"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_84"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_83"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_82"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_81"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_80"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_79"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_78"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_77"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_76"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_75"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_74"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_73"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_72"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_71"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_70"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_69"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_68"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_67"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_66"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_65"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_64"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_63"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_62"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_61"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_60"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_59"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_58"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_57"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_56"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_55"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_54"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_53"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_52"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_51"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_50"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_49"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_48"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_47"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_46"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_45"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_44"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_43"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_42"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_41"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_40"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_39"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_38"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_37"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_36"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_35"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_34"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_33"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_32"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_31"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_30"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_29"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_28"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_27"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_26"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_25"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_24"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_23"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_22"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_21"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_20"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_19"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_18"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_17"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_16"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_15"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_14"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_13"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_12"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_11"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_10"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_9"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_8"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_7"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_6"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_5"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_4"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_3"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_2"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_1"/> <View android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/weex_id_0"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/android/playground/src/main/res/layout/search_book_contents.xml b/android/playground/src/main/res/layout/search_book_contents.xml
new file mode 100755
index 0000000..3ecedcc
--- /dev/null
+++ b/android/playground/src/main/res/layout/search_book_contents.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2008 ZXing authors
+
+ Licensed 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.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="0">
+
+ <EditText android:id="@+id/query_text_view"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="left|center_vertical"
+ android:layout_weight="1"
+ android:singleLine="true"
+ android:selectAllOnFocus="true"
+ android:inputType="text"
+ tools:ignore="NestedWeights"/>
+
+ <Button android:id="@+id/query_button"
+ style="@android:style/Widget.Holo.Button.Borderless.Small"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="0"
+ android:text="@string/button_search_book_contents"/>
+
+ </LinearLayout>
+
+
+ <ListView android:id="@+id/result_list_view"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"/>
+
+</LinearLayout>
diff --git a/android/playground/src/main/res/layout/search_book_contents_header.xml b/android/playground/src/main/res/layout/search_book_contents_header.xml
new file mode 100755
index 0000000..14266a8
--- /dev/null
+++ b/android/playground/src/main/res/layout/search_book_contents_header.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2008 ZXing authors
+
+ Licensed 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.
+ -->
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingLeft="@dimen/standard_padding"
+ android:paddingBottom="@dimen/half_padding"
+ android:enabled="false"
+ android:singleLine="true"
+ android:textIsSelectable="false"/>
diff --git a/android/playground/src/main/res/layout/search_book_contents_list_item.xml b/android/playground/src/main/res/layout/search_book_contents_list_item.xml
new file mode 100755
index 0000000..889298b
--- /dev/null
+++ b/android/playground/src/main/res/layout/search_book_contents_list_item.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2008 ZXing authors
+
+ Licensed 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.
+ -->
+<com.google.zxing.client.android.book.SearchBookContentsListItem
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:padding="@dimen/standard_padding">
+
+ <TextView android:id="@+id/page_number_view"
+ android:layout_width="75dip"
+ android:layout_height="wrap_content"
+ android:layout_gravity="left|top"
+ android:layout_marginRight="@dimen/standard_padding"
+ android:singleLine="false"
+ android:textStyle="bold"
+ android:textIsSelectable="false"/>
+
+ <TextView android:id="@+id/snippet_view"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="left|top"
+ android:singleLine="false"
+ android:textIsSelectable="false"/>
+
+</com.google.zxing.client.android.book.SearchBookContentsListItem>
diff --git a/android/playground/src/main/res/layout/share.xml b/android/playground/src/main/res/layout/share.xml
new file mode 100755
index 0000000..1aa156a
--- /dev/null
+++ b/android/playground/src/main/res/layout/share.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2008 ZXing authors
+
+ Licensed 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.
+ -->
+
+<!-- ScrollView wrapper is to accommodate small screens. -->
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:gravity="center">
+
+ <!-- Must wrap the rest in one layout -->
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:orientation="vertical"
+ android:padding="@dimen/standard_padding">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:text="@string/msg_share_explanation"
+ android:paddingBottom="@dimen/standard_padding"
+ android:textIsSelectable="false"/>
+
+<!-- <ImageView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:scaleType="center"
+ android:src="@drawable/share_via_barcode"
+ android:paddingBottom="@dimen/standard_padding"
+ tools:ignore="ContentDescription"/> -->
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:paddingBottom="@dimen/standard_padding">
+
+ <Button android:id="@+id/share_app_button"
+ style="@style/ShareButton"
+ android:layout_weight="1"
+ android:text="@string/button_share_app"/>
+
+ <Button android:id="@+id/share_bookmark_button"
+ style="@style/ShareButton"
+ android:layout_weight="1"
+ android:text="@string/button_share_bookmark"/>
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:paddingBottom="@dimen/standard_padding">
+
+ <Button android:id="@+id/share_contact_button"
+ style="@style/ShareButton"
+ android:layout_weight="1"
+ android:text="@string/button_share_contact"/>
+
+ <Button android:id="@+id/share_clipboard_button"
+ style="@style/ShareButton"
+ android:layout_weight="1"
+ android:text="@string/button_share_clipboard"/>
+
+ </LinearLayout>
+
+ <EditText android:id="@+id/share_text_view"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:hint="@string/msg_share_text"
+ android:singleLine="true"
+ android:selectAllOnFocus="true"/>
+
+ </LinearLayout>
+
+</ScrollView>
\ No newline at end of file
diff --git a/android/playground/src/main/res/menu/capture.xml b/android/playground/src/main/res/menu/capture.xml
new file mode 100755
index 0000000..277032f
--- /dev/null
+++ b/android/playground/src/main/res/menu/capture.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2012 ZXing authors
+
+ Licensed 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.
+ -->
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+<!-- <item android:id="@+id/menu_share"
+ android:title="@string/menu_share"
+ android:icon="@android:drawable/ic_menu_share"
+ android:orderInCategory="1"
+ android:showAsAction="withText|ifRoom"/> -->
+ <item android:id="@+id/menu_history"
+ android:title="@string/menu_history"
+ android:icon="@android:drawable/ic_menu_recent_history"
+ android:orderInCategory="2"
+ android:showAsAction="withText|ifRoom"/>
+<!-- <item android:id="@+id/menu_settings"
+ android:title="@string/menu_settings"
+ android:icon="@android:drawable/ic_menu_preferences"
+ android:orderInCategory="3"
+ android:showAsAction="withText"/>
+ <item android:id="@+id/menu_help"
+ android:title="@string/menu_help"
+ android:icon="@android:drawable/ic_menu_help"
+ android:orderInCategory="4"
+ android:showAsAction="withText"/> -->
+</menu>
\ No newline at end of file
diff --git a/android/playground/src/main/res/menu/encode.xml b/android/playground/src/main/res/menu/encode.xml
new file mode 100755
index 0000000..eb0175b
--- /dev/null
+++ b/android/playground/src/main/res/menu/encode.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2012 ZXing authors
+
+ Licensed 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.
+ -->
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:id="@+id/menu_share"
+ android:title="@string/menu_share"
+ android:icon="@android:drawable/ic_menu_share"
+ android:orderInCategory="1"
+ android:showAsAction="withText|ifRoom"/>
+ <item android:id="@+id/menu_encode"
+ android:title="@string/menu_encode_vcard"
+ android:icon="@android:drawable/ic_menu_sort_alphabetically"
+ android:orderInCategory="2"
+ android:showAsAction="withText|ifRoom"/>
+</menu>
\ No newline at end of file
diff --git a/android/playground/src/main/res/menu/history.xml b/android/playground/src/main/res/menu/history.xml
new file mode 100755
index 0000000..273802b
--- /dev/null
+++ b/android/playground/src/main/res/menu/history.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2012 ZXing authors
+
+ Licensed 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.
+ -->
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:id="@+id/menu_history_send"
+ android:title="@string/history_send"
+ android:icon="@android:drawable/ic_menu_share"
+ android:orderInCategory="1"
+ android:showAsAction="withText|ifRoom"/>
+ <item android:id="@+id/menu_history_clear_text"
+ android:title="@string/history_clear_text"
+ android:icon="@android:drawable/ic_menu_delete"
+ android:orderInCategory="2"
+ android:showAsAction="withText|ifRoom"/>
+</menu>
\ No newline at end of file
diff --git a/android/playground/src/main/res/menu/main.xml b/android/playground/src/main/res/menu/main.xml
new file mode 100755
index 0000000..4e0533b
--- /dev/null
+++ b/android/playground/src/main/res/menu/main.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+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.
+-->
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
+ <item
+ android:id="@+id/action_scan"
+ android:title="扫码"
+ android:icon="@drawable/ic_action_scan"
+ app:showAsAction="ifRoom"/>
+ <item
+ android:title="refresh"
+ android:icon="@drawable/ic_action_refresh"
+ app:showAsAction="ifRoom"
+ android:id="@+id/action_refresh"/>
+</menu>
diff --git a/android/playground/src/main/res/menu/main_scan.xml b/android/playground/src/main/res/menu/main_scan.xml
new file mode 100755
index 0000000..b4be73e
--- /dev/null
+++ b/android/playground/src/main/res/menu/main_scan.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+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.
+-->
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
+ <item
+ android:id="@+id/action_scan"
+ android:title="扫码"
+ android:icon="@drawable/ic_action_scan"
+ app:showAsAction="ifRoom"/>
+</menu>
diff --git a/android/playground/src/main/res/menu/refresh.xml b/android/playground/src/main/res/menu/refresh.xml
new file mode 100755
index 0000000..8e3805c
--- /dev/null
+++ b/android/playground/src/main/res/menu/refresh.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+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.
+-->
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
+ <item
+ android:title="refresh"
+ android:icon="@drawable/ic_action_refresh"
+ app:showAsAction="ifRoom"
+ android:id="@+id/action_refresh"/>
+</menu>
diff --git a/android/playground/src/main/res/mipmap-hdpi/ic_launcher.png b/android/playground/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100755
index 0000000..0e70a40
--- /dev/null
+++ b/android/playground/src/main/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/android/playground/src/main/res/mipmap-mdpi/ic_launcher.png b/android/playground/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100755
index 0000000..0da5e44
--- /dev/null
+++ b/android/playground/src/main/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/android/playground/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/playground/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100755
index 0000000..5d95120
--- /dev/null
+++ b/android/playground/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/android/playground/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/playground/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100755
index 0000000..6901b4e
--- /dev/null
+++ b/android/playground/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/android/playground/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/playground/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100755
index 0000000..ac38da2
--- /dev/null
+++ b/android/playground/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/android/playground/src/main/res/raw/beep.ogg b/android/playground/src/main/res/raw/beep.ogg
new file mode 100755
index 0000000..1419947
--- /dev/null
+++ b/android/playground/src/main/res/raw/beep.ogg
Binary files differ
diff --git a/android/playground/src/main/res/values-v21/styles.xml b/android/playground/src/main/res/values-v21/styles.xml
new file mode 100755
index 0000000..9bd9d59
--- /dev/null
+++ b/android/playground/src/main/res/values-v21/styles.xml
@@ -0,0 +1,31 @@
+<!--
+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.
+-->
+<resources>
+
+ <style name="AppTheme.NoActionBar">
+ <item name="windowActionBar">false</item>
+ <item name="windowNoTitle">true</item>
+ <item name="android:windowDrawsSystemBarBackgrounds">true</item>
+ <item name="android:statusBarColor">@android:color/transparent</item>
+ </style>
+
+ <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
+ <item name="elevation">0dp</item>
+ </style>
+</resources>
diff --git a/android/playground/src/main/res/values-w820dp/dimens.xml b/android/playground/src/main/res/values-w820dp/dimens.xml
new file mode 100755
index 0000000..ec08727
--- /dev/null
+++ b/android/playground/src/main/res/values-w820dp/dimens.xml
@@ -0,0 +1,24 @@
+<!--
+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.
+-->
+<resources>
+ <!-- Example customization of dimensions originally defined in res/values/dimens.xml
+ (such as screen margins) for screens with more than 820dp of available width. This
+ would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
+ <dimen name="activity_horizontal_margin">64dp</dimen>
+</resources>
diff --git a/android/playground/src/main/res/values-zh-rCN/strings.xml b/android/playground/src/main/res/values-zh-rCN/strings.xml
new file mode 100755
index 0000000..e912d80
--- /dev/null
+++ b/android/playground/src/main/res/values-zh-rCN/strings.xml
@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2014 ZXing authors
+
+ Licensed 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.
+ -->
+<resources>
+ <string name="app_name">WEEX</string>
+ <string name="app_picker_name">应用</string>
+ <string name="bookmark_picker_name">书签</string>
+ <string name="button_add_calendar">添加至日程表</string>
+ <string name="button_add_contact">添加联系人</string>
+ <string name="button_book_search">打开图书搜索</string>
+ <string name="button_cancel">取消</string>
+ <string name="button_custom_product_search">自定义搜索</string>
+ <string name="button_dial">拨打电话</string>
+ <string name="button_email">发送 E-mail</string>
+ <string name="button_get_directions">获取地址</string>
+ <string name="button_mms">发送彩信</string>
+ <string name="button_ok">确定</string>
+ <string name="button_open_browser">打开浏览器</string>
+ <string name="button_product_search">打开商品搜索</string>
+ <string name="button_search_book_contents">搜索图书内容</string>
+ <string name="button_share_app">分享应用</string>
+ <string name="button_share_bookmark">分享书签</string>
+ <string name="button_share_by_email">通过 E-mail 分享</string>
+ <string name="button_share_by_sms">通过短信分享</string>
+ <string name="button_share_clipboard">分享剪切板</string>
+ <string name="button_share_contact">分享联系人</string>
+ <string name="button_show_map">显示地图</string>
+ <string name="button_sms">发送短信</string>
+ <string name="button_web_search">网页搜索</string>
+ <string name="button_wifi">连接到网络</string>
+ <string name="contents_contact">联系人信息</string>
+ <string name="contents_email">E-mail 地址</string>
+ <string name="contents_location">经纬度</string>
+ <string name="contents_phone">电话号码</string>
+ <string name="contents_sms">短信号码</string>
+ <string name="contents_text">纯文本</string>
+ <string name="history_clear_one_history_text">删除</string>
+ <string name="history_clear_text">删除历史记录</string>
+ <string name="history_email_title">条码扫描器的历史</string>
+ <string name="history_empty">空</string>
+ <string name="history_empty_detail">没有历史记录</string>
+ <string name="history_send">发送历史记录</string>
+ <string name="history_title">历史记录</string>
+ <string name="menu_encode_mecard">使用MECARD</string>
+ <string name="menu_encode_vcard">使用vCard</string>
+ <string name="menu_help">帮助</string>
+ <string name="menu_history">历史记录</string>
+ <string name="menu_settings">设置</string>
+ <string name="menu_share">创建二维码</string>
+ <string name="msg_bulk_mode_scanned">批量扫描模式:条码已扫描并保存</string>
+ <string name="msg_camera_framework_bug">很遗憾,Android 相机出现问题。你可能需要重启设备。</string>
+ <string name="msg_default_format">格式</string>
+ <string name="msg_default_meta">元数据</string>
+ <string name="msg_default_mms_subject">Hi</string>
+ <string name="msg_default_status">请将条码置于取景框内扫描。</string>
+ <string name="msg_default_time">时间</string>
+ <string name="msg_default_type">类型</string>
+ <string name="msg_encode_contents_failed">无法生成条码。</string>
+ <string name="msg_error">错误</string>
+ <string name="msg_google_books">Google</string>
+ <string name="msg_google_product">Google</string>
+ <string name="msg_intent_failed">抱歉,无法打开应用。条码内容可能无效。</string>
+ <string name="msg_invalid_value">值无效</string>
+ <string name="msg_redirect">重定向</string>
+ <string name="msg_sbc_book_not_searchable">抱歉,无法找到此图书。</string>
+ <string name="msg_sbc_failed">抱歉,搜索时遇到错误。</string>
+ <string name="msg_sbc_no_page_returned">无页面返回</string>
+ <string name="msg_sbc_page">页面</string>
+ <string name="msg_sbc_results">结果</string>
+ <string name="msg_sbc_searching_book">搜索图书…</string>
+ <string name="msg_sbc_snippet_unavailable">摘录不可用</string>
+ <string name="msg_share_explanation">您可以通过在自己的手机上显示条码,并使用其它手机扫描此条码的方式进行分享</string>
+ <string name="msg_share_text">或键入一些文字</string>
+ <string name="msg_sure">确定吗?</string>
+ <string name="msg_unmount_usb">抱歉,无法访问 SD 卡。</string>
+ <string name="preferences_actions_title">扫描成功</string>
+ <string name="preferences_auto_focus_title">自动对焦</string>
+ <string name="preferences_auto_open_web_title">自动打开网页</string>
+ <string name="preferences_bulk_mode_summary">连续扫描并保存多个条码</string>
+ <string name="preferences_bulk_mode_title">批量扫描模式</string>
+ <string name="preferences_copy_to_clipboard_title">复制到剪贴板</string>
+ <string name="preferences_custom_product_search_summary" formatted="false">替换:%s=内容,%f=格式,%t=类型</string>
+ <string name="preferences_custom_product_search_title">自定义搜索网址</string>
+ <string name="preferences_decode_1D_industrial_title">一维码:工业</string>
+ <string name="preferences_decode_1D_product_title">一维码:商品</string>
+ <string name="preferences_decode_Aztec_title">Aztec</string>
+ <string name="preferences_decode_Data_Matrix_title">Data Matrix</string>
+ <string name="preferences_decode_PDF417_title">PDF417 (测试)</string>
+ <string name="preferences_decode_QR_title">二维码</string>
+ <string name="preferences_device_bug_workarounds_title">设备适配</string>
+ <string name="preferences_disable_barcode_scene_mode_title">不进行条形码场景匹配</string>
+ <string name="preferences_disable_continuous_focus_summary">使用标准对焦模式</string>
+ <string name="preferences_disable_continuous_focus_title">不持续对焦</string>
+ <string name="preferences_disable_exposure_title">不曝光</string>
+ <string name="preferences_disable_metering_title">不使用距离测量</string>
+ <string name="preferences_front_light_auto">自动</string>
+ <string name="preferences_front_light_off">关</string>
+ <string name="preferences_front_light_on">开</string>
+ <string name="preferences_front_light_summary">设置闪光灯模式</string>
+ <string name="preferences_front_light_title">闪光灯</string>
+ <string name="preferences_general_title">扫描设置</string>
+ <string name="preferences_history_summary">自动将条码存入历史记录</string>
+ <string name="preferences_history_title">存入历史记录</string>
+ <string name="preferences_invert_scan_summary">扫描黑色背景上的白色条码。仅适用于部分设备。</string>
+ <string name="preferences_invert_scan_title">反色</string>
+ <string name="preferences_name">选项</string>
+ <string name="preferences_orientation_title">不自动旋转</string>
+ <string name="preferences_play_beep_title">播放提示音</string>
+ <string name="preferences_remember_duplicates_summary">在历史记录中保存重复的记录</string>
+ <string name="preferences_remember_duplicates_title">保存重复记录</string>
+ <string name="preferences_result_title">搜索设置</string>
+ <string name="preferences_scanning_title">条码类型</string>
+ <string name="preferences_search_country">搜索引擎国别</string>
+ <string name="preferences_supplemental_summary">尝试检索关于条码内容的更多信息</string>
+ <string name="preferences_supplemental_title">检索更多信息</string>
+ <string name="preferences_vibrate_title">振动</string>
+ <string name="result_address_book">找到联系人信息</string>
+ <string name="result_calendar">找到日程</string>
+ <string name="result_email_address">找到电子邮件地址</string>
+ <string name="result_geo">找到地理坐标</string>
+ <string name="result_isbn">找到图书</string>
+ <string name="result_product">找到商品</string>
+ <string name="result_sms">找到短信号码</string>
+ <string name="result_tel">找到电话号码</string>
+ <string name="result_text">找到纯文本</string>
+ <string name="result_uri">找到 URL </string>
+ <string name="result_wifi">找到 Wi-Fi 配置</string>
+ <string name="sbc_name">Google 图书搜索</string>
+ <string name="wifi_changing_network">连接到 Wi-Fi \u2026</string>
+
+ <string name="cpu_not_support_tip">对不起,您当前的设备是X86架构.\n我们只支持ARM架构的设备!</string>
+ <string name="update_found_new_version">发现新版本</string>
+ <string name="update_downloading">正在下载更新</string>
+ <string name="update_progress">进度:</string>
+ <string name="update_now">立即更新</string>
+ <string name="update_remind_later">稍后提醒</string>
+ <string name="update_version">版本号:</string>
+ <string name="update_date">更新日期:</string>
+ <string name="update_desc">更新内容:</string>
+
+</resources>
diff --git a/android/playground/src/main/res/values/attrs.xml b/android/playground/src/main/res/values/attrs.xml
new file mode 100755
index 0000000..6a3624e
--- /dev/null
+++ b/android/playground/src/main/res/values/attrs.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+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.
+-->
+<resources>
+ <declare-styleable name="CircleImageView">
+ <attr name="border_width" format="dimension"/>
+ <attr name="border_color" format="color"/>
+ <attr name="border_overlay" format="boolean"/>
+ </declare-styleable>
+
+ <!-- Declare custom theme attributes that allow changing which styles are
+ used for button bars depending on the API level.
+ ?android:attr/buttonBarStyle is new as of API 11 so this is
+ necessary to support previous API levels. -->
+ <declare-styleable name="ButtonBarContainerTheme">
+ <attr name="metaButtonBarStyle" format="reference"/>
+ <attr name="metaButtonBarButtonStyle" format="reference"/>
+ </declare-styleable>
+</resources>
\ No newline at end of file
diff --git a/android/playground/src/main/res/values/colors.xml b/android/playground/src/main/res/values/colors.xml
new file mode 100755
index 0000000..c115dc1
--- /dev/null
+++ b/android/playground/src/main/res/values/colors.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+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.
+-->
+<resources>
+ <color name="colorPrimary">#00B4FF</color>
+ <color name="colorPrimaryDark">#00B4FF</color>
+ <color name="colorAccent">#FF4081</color>
+
+ <color name="black_overlay">#66000000</color>
+</resources>
diff --git a/android/playground/src/main/res/values/dimens.xml b/android/playground/src/main/res/values/dimens.xml
new file mode 100755
index 0000000..84d904a
--- /dev/null
+++ b/android/playground/src/main/res/values/dimens.xml
@@ -0,0 +1,28 @@
+<!--
+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.
+-->
+<resources>
+ <!-- Default screen margins, per the Android Design guidelines. -->
+ <dimen name="nav_header_vertical_spacing">16dp</dimen>
+ <dimen name="nav_header_height">160dp</dimen>
+ <!-- Default screen margins, per the Android Design guidelines. -->
+ <dimen name="activity_horizontal_margin">16dp</dimen>
+ <dimen name="activity_vertical_margin">16dp</dimen>
+ <dimen name="fab_margin">16dp</dimen>
+ <dimen name="text_margin">16dp</dimen>
+</resources>
diff --git a/android/playground/src/main/res/values/drawables.xml b/android/playground/src/main/res/values/drawables.xml
new file mode 100755
index 0000000..bab1227
--- /dev/null
+++ b/android/playground/src/main/res/values/drawables.xml
@@ -0,0 +1,26 @@
+<!--
+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.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+ <item name="ic_menu_camera" type="drawable">@android:drawable/ic_menu_camera</item>
+ <item name="ic_menu_gallery" type="drawable">@android:drawable/ic_menu_gallery</item>
+ <item name="ic_menu_slideshow" type="drawable">@android:drawable/ic_menu_slideshow</item>
+ <item name="ic_menu_manage" type="drawable">@android:drawable/ic_menu_manage</item>
+ <item name="ic_menu_share" type="drawable">@android:drawable/ic_menu_share</item>
+ <item name="ic_menu_send" type="drawable">@android:drawable/ic_menu_send</item>
+</resources>
diff --git a/android/playground/src/main/res/values/scan_code_arrays.xml b/android/playground/src/main/res/values/scan_code_arrays.xml
new file mode 100755
index 0000000..1b34bba
--- /dev/null
+++ b/android/playground/src/main/res/values/scan_code_arrays.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2008 ZXing authors
+
+ Licensed 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.
+ -->
+<resources xmlns:tools="http://schemas.android.com/tools">
+ <string-array name="country_codes" tools:ignore="MissingTranslation">
+ <item>-</item>
+ <item>AR</item>
+ <item>AU</item>
+ <item>BR</item>
+ <item>BG</item>
+ <item>CA</item>
+ <item>CH</item>
+ <item>CN</item>
+ <item>CZ</item>
+ <item>DE</item>
+ <item>DK</item>
+ <item>ES</item>
+ <item>FI</item>
+ <item>FR</item>
+ <item>GB</item>
+ <item>GR</item>
+ <item>HU</item>
+ <item>ID</item>
+ <item>IT</item>
+ <item>JP</item>
+ <item>KR</item>
+ <item>NL</item>
+ <item>PL</item>
+ <item>PT</item>
+ <item>RO</item>
+ <item>RU</item>
+ <item>SE</item>
+ <item>SK</item>
+ <item>SI</item>
+ <item>TR</item>
+ <item>TW</item>
+ <item>US</item>
+ </string-array>
+ <string-array name="preferences_front_light_values" tools:ignore="MissingTranslation">
+ <item>ON</item>
+ <item>AUTO</item>
+ <item>OFF</item>
+ </string-array>
+ <string-array name="preferences_front_light_options">
+ <item>@string/preferences_front_light_on</item>
+ <item>@string/preferences_front_light_auto</item>
+ <item>@string/preferences_front_light_off</item>
+ </string-array>
+</resources>
diff --git a/android/playground/src/main/res/values/scan_code_colors.xml b/android/playground/src/main/res/values/scan_code_colors.xml
new file mode 100755
index 0000000..07b0f96
--- /dev/null
+++ b/android/playground/src/main/res/values/scan_code_colors.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2008 ZXing authors
+
+ Licensed 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.
+ -->
+<resources>
+ <color name="contents_text">#ff000000</color>
+ <color name="encode_view">#ffffffff</color>
+ <color name="possible_result_points">#c0ffbd21</color> <!-- Android standard ICS color -->
+ <color name="result_minor_text">#ffc0c0c0</color>
+ <color name="result_points">#c099cc00</color> <!-- Android standard ICS color -->
+ <color name="result_text">#ffffffff</color>
+ <color name="result_view">#b0000000</color>
+ <color name="status_text">#ffffffff</color>
+ <color name="transparent">#00000000</color>
+ <color name="viewfinder_laser">#ffcc0000</color> <!-- Android standard ICS color -->
+ <color name="viewfinder_mask">#60000000</color>
+</resources>
diff --git a/android/playground/src/main/res/values/scan_code_dimens.xml b/android/playground/src/main/res/values/scan_code_dimens.xml
new file mode 100755
index 0000000..3ac3025
--- /dev/null
+++ b/android/playground/src/main/res/values/scan_code_dimens.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2008 ZXing authors
+
+ Licensed 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.
+ -->
+<resources>
+ <dimen name="standard_padding">8dip</dimen>
+ <dimen name="half_padding">4dip</dimen>
+</resources>
\ No newline at end of file
diff --git a/android/playground/src/main/res/values/scan_code_ids.xml b/android/playground/src/main/res/values/scan_code_ids.xml
new file mode 100755
index 0000000..4c0ccb4
--- /dev/null
+++ b/android/playground/src/main/res/values/scan_code_ids.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2008 ZXing authors
+
+ Licensed 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.
+ -->
+<resources>
+ <item type="id" name="decode"/>
+ <item type="id" name="decode_failed"/>
+ <item type="id" name="decode_succeeded"/>
+ <item type="id" name="launch_product_query"/>
+ <item type="id" name="quit"/>
+ <item type="id" name="restart_preview"/>
+ <item type="id" name="return_scan_result"/>
+</resources>
diff --git a/android/playground/src/main/res/values/scan_code_strings.xml b/android/playground/src/main/res/values/scan_code_strings.xml
new file mode 100755
index 0000000..993cc83
--- /dev/null
+++ b/android/playground/src/main/res/values/scan_code_strings.xml
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2014 ZXing authors
+
+ Licensed 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.
+ -->
+<resources>
+ <string name="app_picker_name">Applications</string>
+ <string name="bookmark_picker_name">Bookmarks</string>
+ <string name="button_add_calendar">Add to calendar</string>
+ <string name="button_add_contact">Add contact</string>
+ <string name="button_book_search">Book Search</string>
+ <string name="button_cancel">Cancel</string>
+ <string name="button_custom_product_search">Custom search</string>
+ <string name="button_dial">Dial number</string>
+ <string name="button_email">Send email</string>
+ <string name="button_get_directions">Get directions</string>
+ <string name="button_mms">Send MMS</string>
+ <string name="button_ok">OK</string>
+ <string name="button_open_browser">Open browser</string>
+ <string name="button_product_search">Product search</string>
+ <string name="button_search_book_contents">Search contents</string>
+ <string name="button_share_app">Application</string>
+ <string name="button_share_bookmark">Bookmark</string>
+ <string name="button_share_by_email">Share via email</string>
+ <string name="button_share_by_sms">Share via SMS</string>
+ <string name="button_share_clipboard">Clipboard</string>
+ <string name="button_share_contact">Contact</string>
+ <string name="button_show_map">Show map</string>
+ <string name="button_sms">Send SMS</string>
+ <string name="button_web_search">Web search</string>
+ <string name="button_wifi">Connect to Network</string>
+ <string name="contents_contact">Contact info</string>
+ <string name="contents_email">Email address</string>
+ <string name="contents_location">Geographic coordinates</string>
+ <string name="contents_phone">Phone number</string>
+ <string name="contents_sms">SMS address</string>
+ <string name="contents_text">Plain text</string>
+ <string name="history_clear_text">Clear history</string>
+ <string name="history_clear_one_history_text">Clear</string>
+ <string name="history_email_title">Barcode Scanner history</string>
+ <string name="history_empty">Empty</string>
+ <string name="history_empty_detail">No barcode scans have been recorded</string>
+ <string name="history_send">Send history</string>
+ <string name="history_title">History</string>
+ <string name="menu_encode_mecard">Use MECARD</string>
+ <string name="menu_encode_vcard">Use vCard</string>
+ <string name="menu_help">Help</string>
+ <string name="menu_history">History</string>
+ <string name="menu_settings">Settings</string>
+ <string name="menu_share">Share</string>
+ <string name="msg_bulk_mode_scanned">Bulk mode: barcode scanned and saved</string>
+ <string name="msg_camera_framework_bug">Sorry, the Android camera encountered a problem. You may need to restart the device.</string>
+ <string name="msg_default_format">Format</string>
+ <string name="msg_default_meta">Metadata</string>
+ <string name="msg_default_mms_subject">Hi</string>
+ <string name="msg_default_status">请将二维码置于框内</string>
+ <string name="msg_default_time">Time</string>
+ <string name="msg_default_type">Type</string>
+ <string name="msg_encode_contents_failed">Could not encode a barcode from the data provided.</string>
+ <string name="msg_error">Error</string>
+ <string name="msg_google_books">Google</string>
+ <string name="msg_google_product">Google</string>
+ <string name="msg_intent_failed">Sorry, the requested application could not be launched. The barcode contents may be invalid.</string>
+ <string name="msg_invalid_value">Invalid value</string>
+ <string name="msg_redirect">Redirect</string>
+ <string name="msg_sbc_book_not_searchable">Sorry, this book is not searchable.</string>
+ <string name="msg_sbc_failed">Sorry, the search encountered a problem.</string>
+ <string name="msg_sbc_no_page_returned">No page returned</string>
+ <string name="msg_sbc_page">Page</string>
+ <string name="msg_sbc_results">Results</string>
+ <string name="msg_sbc_searching_book">Searching book\u2026</string>
+ <string name="msg_sbc_snippet_unavailable">Snippet not available</string>
+ <string name="msg_share_explanation">You can share data by displaying a barcode on your screen and scanning it with another phone.</string>
+ <string name="msg_share_text">Or type some text and press Enter</string>
+ <string name="msg_sure">Are you sure?</string>
+ <string name="msg_unmount_usb">Sorry, the SD card is not accessible.</string>
+ <string name="preferences_actions_title">When a barcode is found\u2026</string>
+ <string name="preferences_auto_focus_title">Use auto focus</string>
+ <string name="preferences_auto_open_web_title">Open web pages automatically</string>
+ <string name="preferences_bulk_mode_summary">Scan and save many barcodes continuously</string>
+ <string name="preferences_bulk_mode_title">Bulk scan mode</string>
+ <string name="preferences_copy_to_clipboard_title">Copy to clipboard</string>
+ <string name="preferences_custom_product_search_summary" formatted="false">Substitutions: %s = contents, %f = format, %t = type</string>
+ <string name="preferences_custom_product_search_title">Custom search URL</string>
+ <string name="preferences_decode_1D_industrial_title">1D Industrial</string>
+ <string name="preferences_decode_1D_product_title">1D Product</string>
+ <string name="preferences_decode_Aztec_title">Aztec</string>
+ <string name="preferences_decode_Data_Matrix_title">Data Matrix</string>
+ <string name="preferences_decode_PDF417_title">PDF417 (β)</string>
+ <string name="preferences_decode_QR_title">QR Codes</string>
+ <string name="preferences_device_bug_workarounds_title">Device Bug Workarounds</string>
+ <string name="preferences_disable_barcode_scene_mode_title">No barcode scene mode</string>
+ <string name="preferences_disable_continuous_focus_summary">Use only standard focus mode</string>
+ <string name="preferences_disable_continuous_focus_title">No continuous focus</string>
+ <string name="preferences_disable_exposure_title">No exposure</string>
+ <string name="preferences_disable_metering_title">No metering</string>
+ <string name="preferences_front_light_summary">Improves scanning in low light on some phones, but may cause glare. Does not work on all phones.</string>
+ <string name="preferences_front_light_title">Use front light</string>
+ <string name="preferences_front_light_auto">Automatic</string>
+ <string name="preferences_front_light_off">Off</string>
+ <string name="preferences_front_light_on">On</string>
+ <string name="preferences_general_title">General settings</string>
+ <string name="preferences_invert_scan_title">Invert scan</string>
+ <string name="preferences_invert_scan_summary">Scan for white barcodes on black background. Not available on some devices.</string>
+ <string name="preferences_name">Settings</string>
+ <string name="preferences_orientation_title">No automatic rotation</string>
+ <string name="preferences_play_beep_title">Beep</string>
+ <string name="preferences_remember_duplicates_summary">Store multiple scans of the same barcode in History</string>
+ <string name="preferences_remember_duplicates_title">Remember duplicates</string>
+ <string name="preferences_result_title">Result settings</string>
+ <string name="preferences_scanning_title">When scanning for barcodes, decode\u2026</string>
+ <string name="preferences_search_country">Search country</string>
+ <string name="preferences_supplemental_summary">Try to retrieve more information about the barcode contents</string>
+ <string name="preferences_supplemental_title">Retrieve more info</string>
+ <string name="preferences_vibrate_title">Vibrate</string>
+ <string name="result_address_book">Found contact info</string>
+ <string name="result_calendar">Found calendar event</string>
+ <string name="result_email_address">Found email address</string>
+ <string name="result_geo">Found geographic coordinates</string>
+ <string name="result_isbn">Found book</string>
+ <string name="result_product">Found product</string>
+ <string name="result_sms">Found SMS address</string>
+ <string name="result_tel">Found phone number</string>
+ <string name="result_text">Found plain text</string>
+ <string name="result_uri">Found URL</string>
+ <string name="result_wifi">Found WLAN Configuration</string>
+ <string name="sbc_name">Google Book Search</string>
+ <string name="wifi_changing_network">Requesting connection to network\u2026</string>
+</resources>
diff --git a/android/playground/src/main/res/values/scan_code_styles.xml b/android/playground/src/main/res/values/scan_code_styles.xml
new file mode 100755
index 0000000..9d89329
--- /dev/null
+++ b/android/playground/src/main/res/values/scan_code_styles.xml
@@ -0,0 +1,48 @@
+<!--
+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.
+-->
+<resources>
+
+ <!--
+ Base application theme, dependent on API level. This theme is replaced
+ by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
+ -->
+ <!--<style name="AppBaseTheme" parent="android:Theme.Light">-->
+ <!--<!–-->
+ <!--Theme customizations available in newer API levels can go in-->
+ <!--res/values-vXX/styles.xml, while customizations related to-->
+ <!--backward-compatibility can go here.-->
+ <!--–>-->
+ <!--</style>-->
+
+ <!--<!– Application theme. –>-->
+ <!--<style name="AppTheme" parent="AppBaseTheme">-->
+ <!--<!– All customizations that are NOT specific to a particular API-level can go here. –>-->
+ <!--</style>-->
+
+ <style name="ResultButton" parent="@android:style/Widget.Holo.Button.Borderless.Small">
+ <item name="android:layout_width">0dip</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_weight">1</item>
+ </style>
+ <style name="ShareButton" parent="@android:style/Widget.Holo.Button.Borderless.Small">
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ </style>
+
+</resources>
diff --git a/android/playground/src/main/res/values/strings.xml b/android/playground/src/main/res/values/strings.xml
new file mode 100755
index 0000000..f3160cb
--- /dev/null
+++ b/android/playground/src/main/res/values/strings.xml
@@ -0,0 +1,51 @@
+<!--
+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.
+-->
+<resources>
+ <string name="app_name">WEEX</string>
+
+ <string name="navigation_drawer_open">Open navigation drawer</string>
+ <string name="navigation_drawer_close">Close navigation drawer</string>
+
+ <string name="action_settings">Settings</string>
+ <string name="hello_blank_fragment">Hello blank fragment</string>
+ <string name="title_activity_main2">Main2Activity</string>
+ <string name="title_activity_wx_main">WXMainActivity</string>
+
+ <string name="title_activity_splash">SplashActivity</string>
+ <string name="dummy_button">Dummy Button</string>
+ <string name="dummy_content">WEEX\nPLAYGROUND</string>
+
+ <string name="cpu_not_support_tip">Sorry, your current device is x86 architecture.\n We only
+ support arm architecture devices!
+ </string>
+
+ <string name="index_tip">Network Error!\n1.Make sure you use the command "npm run serve"
+ launched local service\n2.Make sure you modify "your_current_ip" to your local IP in
+ "WXMainActivity"
+ </string>
+ <string name="title_activity_dynamic">DynamicActivity</string>
+ <string name="update_found_new_version">New version is available</string>
+ <string name="update_downloading">Downloading updates</string>
+ <string name="update_progress">Progress: </string>
+ <string name="update_now">Update Now</string>
+ <string name="update_remind_later">Remind Later</string>
+ <string name="update_version">Version: </string>
+ <string name="update_date">Date: </string>
+ <string name="update_desc">Updates: </string>
+</resources>
diff --git a/android/playground/src/main/res/values/styles.xml b/android/playground/src/main/res/values/styles.xml
new file mode 100755
index 0000000..52fd8ac
--- /dev/null
+++ b/android/playground/src/main/res/values/styles.xml
@@ -0,0 +1,52 @@
+<!--
+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.
+-->
+<resources>
+
+ <!-- Base application theme. -->
+ <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+ <!-- Customize your theme here. -->
+ <item name="colorPrimary">@color/colorPrimary</item>
+ <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+ <item name="colorAccent">@color/colorAccent</item>
+ </style>
+
+ <style name="AppTheme.NoActionBar">
+ <item name="windowActionBar">false</item>
+ <item name="windowNoTitle">true</item>
+ </style>
+
+ <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
+ <item name="elevation">0dp</item>
+ </style>
+
+ <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light"/>
+
+ <style name="FullscreenTheme" parent="AppTheme">
+ <item name="windowActionBar">false</item>
+ <item name="windowNoTitle">true</item>
+ <item name="android:windowActionBarOverlay">true</item>
+ <item name="android:windowBackground">@null</item>
+ <item name="android:windowFullscreen">true</item>
+ </style>
+
+ <style name="FullscreenActionBarStyle" parent="Widget.AppCompat.ActionBar">
+ <item name="android:background">@color/black_overlay</item>
+ </style>
+
+</resources>
diff --git a/android/playground/src/main/res/values/themes.xml b/android/playground/src/main/res/values/themes.xml
new file mode 100755
index 0000000..4b8e2be
--- /dev/null
+++ b/android/playground/src/main/res/values/themes.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2012 ZXing authors
+
+ Licensed 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.
+ -->
+<resources>
+ <style name="CaptureTheme" parent="android:Theme.Holo">
+ <item name="android:windowFullscreen">true</item>
+ <item name="android:windowContentOverlay">@null</item>
+ <item name="android:windowActionBarOverlay">true</item>
+ <item name="android:windowActionModeOverlay">true</item>
+ </style>
+</resources>
diff --git a/android/playground/src/main/res/xml/filepaths.xml b/android/playground/src/main/res/xml/filepaths.xml
new file mode 100644
index 0000000..8b373df
--- /dev/null
+++ b/android/playground/src/main/res/xml/filepaths.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<paths>
+ <cache-path
+ name="local_apk_cache"
+ path="."/>
+</paths>
\ No newline at end of file
diff --git a/android/playground/src/main/res/xml/preferences.xml b/android/playground/src/main/res/xml/preferences.xml
new file mode 100755
index 0000000..ce4c74e
--- /dev/null
+++ b/android/playground/src/main/res/xml/preferences.xml
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008 ZXing authors
+
+ Licensed 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.
+ -->
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+ <PreferenceCategory android:title="@string/preferences_scanning_title">
+ <CheckBoxPreference
+ android:key="preferences_decode_1D_product"
+ android:defaultValue="true"
+ android:title="@string/preferences_decode_1D_product_title"/>
+ <CheckBoxPreference
+ android:key="preferences_decode_1D_industrial"
+ android:defaultValue="true"
+ android:title="@string/preferences_decode_1D_industrial_title"/>
+ <CheckBoxPreference
+ android:key="preferences_decode_QR"
+ android:defaultValue="true"
+ android:title="@string/preferences_decode_QR_title"/>
+ <CheckBoxPreference
+ android:key="preferences_decode_Data_Matrix"
+ android:defaultValue="true"
+ android:title="@string/preferences_decode_Data_Matrix_title"/>
+ <CheckBoxPreference
+ android:key="preferences_decode_Aztec"
+ android:defaultValue="false"
+ android:title="@string/preferences_decode_Aztec_title"/>
+ <CheckBoxPreference
+ android:key="preferences_decode_PDF417"
+ android:defaultValue="false"
+ android:title="@string/preferences_decode_PDF417_title"/>
+ </PreferenceCategory>
+ <PreferenceCategory android:title="@string/preferences_actions_title">
+ <CheckBoxPreference
+ android:key="preferences_play_beep"
+ android:defaultValue="true"
+ android:title="@string/preferences_play_beep_title"/>
+ <CheckBoxPreference
+ android:key="preferences_vibrate"
+ android:defaultValue="false"
+ android:title="@string/preferences_vibrate_title"/>
+ <CheckBoxPreference
+ android:key="preferences_copy_to_clipboard"
+ android:defaultValue="true"
+ android:title="@string/preferences_copy_to_clipboard_title"/>
+ <CheckBoxPreference
+ android:key="preferences_auto_open_web"
+ android:defaultValue="false"
+ android:title="@string/preferences_auto_open_web_title"/>
+ <CheckBoxPreference
+ android:key="preferences_remember_duplicates"
+ android:defaultValue="false"
+ android:title="@string/preferences_remember_duplicates_title"
+ android:summary="@string/preferences_remember_duplicates_summary"/>
+ <CheckBoxPreference
+ android:key="preferences_history"
+ android:defaultValue="true"/>
+ <CheckBoxPreference
+ android:key="preferences_supplemental"
+ android:defaultValue="true"
+ android:title="@string/preferences_supplemental_title"
+ android:summary="@string/preferences_supplemental_summary"/>
+ </PreferenceCategory>
+ <PreferenceCategory android:title="@string/preferences_general_title">
+ <ListPreference
+ android:entries="@array/preferences_front_light_options"
+ android:entryValues="@array/preferences_front_light_values"
+ android:key="preferences_front_light_mode"
+ android:defaultValue="OFF"
+ android:title="@string/preferences_front_light_title"
+ android:summary="@string/preferences_front_light_summary"/>
+ <CheckBoxPreference
+ android:key="preferences_auto_focus"
+ android:defaultValue="true"
+ android:title="@string/preferences_auto_focus_title"/>
+ <CheckBoxPreference
+ android:key="preferences_invert_scan"
+ android:defaultValue="false"
+ android:title="@string/preferences_invert_scan_title"
+ android:summary="@string/preferences_invert_scan_summary"/>
+ <CheckBoxPreference
+ android:key="preferences_bulk_mode"
+ android:defaultValue="false"
+ android:title="@string/preferences_bulk_mode_title"
+ android:summary="@string/preferences_bulk_mode_summary"/>
+ <CheckBoxPreference
+ android:key="preferences_orientation"
+ android:defaultValue="true"
+ android:title="@string/preferences_orientation_title"/>
+ </PreferenceCategory>
+ <PreferenceCategory android:title="@string/preferences_result_title">
+ <EditTextPreference
+ android:key="preferences_custom_product_search"
+ android:title="@string/preferences_custom_product_search_title"
+ android:summary="@string/preferences_custom_product_search_summary"/>
+ <ListPreference
+ android:key="preferences_search_country"
+ android:defaultValue="-"
+ android:entries="@array/country_codes"
+ android:entryValues="@array/country_codes"
+ android:title="@string/preferences_search_country"/>
+ </PreferenceCategory>
+ <PreferenceCategory android:title="@string/preferences_device_bug_workarounds_title">
+ <CheckBoxPreference
+ android:key="preferences_disable_continuous_focus"
+ android:defaultValue="true"
+ android:title="@string/preferences_disable_continuous_focus_title"
+ android:summary="@string/preferences_disable_continuous_focus_summary"/>
+ <CheckBoxPreference
+ android:key="preferences_disable_exposure"
+ android:defaultValue="true"
+ android:title="@string/preferences_disable_exposure_title"/>
+ <CheckBoxPreference
+ android:key="preferences_disable_metering"
+ android:defaultValue="true"
+ android:title="@string/preferences_disable_metering_title"/>
+ <CheckBoxPreference
+ android:key="preferences_disable_barcode_scene_mode"
+ android:defaultValue="true"
+ android:title="@string/preferences_disable_barcode_scene_mode_title"/>
+ </PreferenceCategory>
+</PreferenceScreen>
diff --git a/android/playground/src/main/res/xml/scan_code_preferences.xml b/android/playground/src/main/res/xml/scan_code_preferences.xml
new file mode 100755
index 0000000..2af4481
--- /dev/null
+++ b/android/playground/src/main/res/xml/scan_code_preferences.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2008 ZXing authors
+
+ Licensed 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.
+ -->
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+ <PreferenceCategory android:title="@string/preferences_scanning_title">
+ <CheckBoxPreference
+ android:key="preferences_decode_1D_product"
+ android:defaultValue="true"
+ android:title="@string/preferences_decode_1D_product_title"/>
+ <CheckBoxPreference
+ android:key="preferences_decode_1D_industrial"
+ android:defaultValue="true"
+ android:title="@string/preferences_decode_1D_industrial_title"/>
+ <CheckBoxPreference
+ android:key="preferences_decode_QR"
+ android:defaultValue="true"
+ android:title="@string/preferences_decode_QR_title"/>
+ <CheckBoxPreference
+ android:key="preferences_decode_Data_Matrix"
+ android:defaultValue="true"
+ android:title="@string/preferences_decode_Data_Matrix_title"/>
+ <CheckBoxPreference
+ android:key="preferences_decode_Aztec"
+ android:defaultValue="false"
+ android:title="@string/preferences_decode_Aztec_title"/>
+ <CheckBoxPreference
+ android:key="preferences_decode_PDF417"
+ android:defaultValue="false"
+ android:title="@string/preferences_decode_PDF417_title"/>
+ </PreferenceCategory>
+ <PreferenceCategory android:title="@string/preferences_actions_title">
+ <CheckBoxPreference
+ android:key="preferences_play_beep"
+ android:defaultValue="true"
+ android:title="@string/preferences_play_beep_title"/>
+ <CheckBoxPreference
+ android:key="preferences_vibrate"
+ android:defaultValue="false"
+ android:title="@string/preferences_vibrate_title"/>
+ <CheckBoxPreference
+ android:key="preferences_copy_to_clipboard"
+ android:defaultValue="true"
+ android:title="@string/preferences_copy_to_clipboard_title"/>
+ <CheckBoxPreference
+ android:key="preferences_auto_open_web"
+ android:defaultValue="false"
+ android:title="@string/preferences_auto_open_web_title"/>
+ <CheckBoxPreference
+ android:key="preferences_remember_duplicates"
+ android:defaultValue="false"
+ android:title="@string/preferences_remember_duplicates_title"
+ android:summary="@string/preferences_remember_duplicates_summary"/>
+ <CheckBoxPreference
+ android:key="preferences_supplemental"
+ android:defaultValue="true"
+ android:title="@string/preferences_supplemental_title"
+ android:summary="@string/preferences_supplemental_summary"/>
+ </PreferenceCategory>
+ <PreferenceCategory android:title="@string/preferences_general_title">
+ <ListPreference
+ android:entries="@array/preferences_front_light_options"
+ android:entryValues="@array/preferences_front_light_values"
+ android:key="preferences_front_light_mode"
+ android:defaultValue="OFF"
+ android:title="@string/preferences_front_light_title"
+ android:summary="@string/preferences_front_light_summary"/>
+ <CheckBoxPreference
+ android:key="preferences_auto_focus"
+ android:defaultValue="true"
+ android:title="@string/preferences_auto_focus_title"/>
+ <CheckBoxPreference
+ android:key="preferences_invert_scan"
+ android:defaultValue="false"
+ android:title="@string/preferences_invert_scan_title"
+ android:summary="@string/preferences_invert_scan_summary"/>
+ <CheckBoxPreference
+ android:key="preferences_bulk_mode"
+ android:defaultValue="false"
+ android:title="@string/preferences_bulk_mode_title"
+ android:summary="@string/preferences_bulk_mode_summary"/>
+ <CheckBoxPreference
+ android:key="preferences_orientation"
+ android:defaultValue="true"
+ android:title="@string/preferences_orientation_title"/>
+ </PreferenceCategory>
+ <PreferenceCategory android:title="@string/preferences_result_title">
+ <EditTextPreference
+ android:key="preferences_custom_product_search"
+ android:title="@string/preferences_custom_product_search_title"
+ android:summary="@string/preferences_custom_product_search_summary"/>
+ <ListPreference
+ android:key="preferences_search_country"
+ android:defaultValue="-"
+ android:entries="@array/country_codes"
+ android:entryValues="@array/country_codes"
+ android:title="@string/preferences_search_country"/>
+ </PreferenceCategory>
+ <PreferenceCategory android:title="@string/preferences_device_bug_workarounds_title">
+ <CheckBoxPreference
+ android:key="preferences_disable_continuous_focus"
+ android:defaultValue="true"
+ android:title="@string/preferences_disable_continuous_focus_title"
+ android:summary="@string/preferences_disable_continuous_focus_summary"/>
+ <CheckBoxPreference
+ android:key="preferences_disable_exposure"
+ android:defaultValue="true"
+ android:title="@string/preferences_disable_exposure_title"/>
+ <CheckBoxPreference
+ android:key="preferences_disable_metering"
+ android:defaultValue="true"
+ android:title="@string/preferences_disable_metering_title"/>
+ <CheckBoxPreference
+ android:key="preferences_disable_barcode_scene_mode"
+ android:defaultValue="true"
+ android:title="@string/preferences_disable_barcode_scene_mode_title"/>
+ </PreferenceCategory>
+</PreferenceScreen>
diff --git a/android/playground/tools/weex.jks b/android/playground/tools/weex.jks
new file mode 100644
index 0000000..7e04506
--- /dev/null
+++ b/android/playground/tools/weex.jks
Binary files differ
diff --git a/android/settings.gradle b/android/settings.gradle
new file mode 100644
index 0000000..f752347
--- /dev/null
+++ b/android/settings.gradle
@@ -0,0 +1,5 @@
+rootProject.name = 'weex-playground'
+include ":playground"
+include ":commons"
+
+