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("&lt;");
+  private static final Pattern GT_ENTITY_PATTERN = Pattern.compile("&gt;");
+  private static final Pattern QUOTE_ENTITY_PATTERN = Pattern.compile("&#39;");
+  private static final Pattern QUOT_ENTITY_PATTERN = Pattern.compile("&quot;");
+
+  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&#xA;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">-->
+        <!--&lt;!&ndash;-->
+            <!--Theme customizations available in newer API levels can go in-->
+            <!--res/values-vXX/styles.xml, while customizations related to-->
+            <!--backward-compatibility can go here.-->
+        <!--&ndash;&gt;-->
+    <!--</style>-->
+
+    <!--&lt;!&ndash; Application theme. &ndash;&gt;-->
+    <!--<style name="AppTheme" parent="AppBaseTheme">-->
+        <!--&lt;!&ndash; All customizations that are NOT specific to a particular API-level can go here. &ndash;&gt;-->
+    <!--</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"
+
+