wennjie 6 years ago
parent
commit
1919eb1b4a
100 changed files with 15767 additions and 0 deletions
  1. 3 0
      HUILIAOAPP/.babelrc
  2. 6 0
      HUILIAOAPP/.buckconfig
  3. 67 0
      HUILIAOAPP/.flowconfig
  4. 1 0
      HUILIAOAPP/.gitattributes
  5. 56 0
      HUILIAOAPP/.gitignore
  6. 1 0
      HUILIAOAPP/.watchmanconfig
  7. 22 0
      HUILIAOAPP/App.js
  8. 65 0
      HUILIAOAPP/android/app/BUCK
  9. 150 0
      HUILIAOAPP/android/app/build.gradle
  10. 17 0
      HUILIAOAPP/android/app/proguard-rules.pro
  11. 26 0
      HUILIAOAPP/android/app/src/main/AndroidManifest.xml
  12. 15 0
      HUILIAOAPP/android/app/src/main/java/com/huiliaoapp/MainActivity.java
  13. 45 0
      HUILIAOAPP/android/app/src/main/java/com/huiliaoapp/MainApplication.java
  14. BIN
      HUILIAOAPP/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
  15. BIN
      HUILIAOAPP/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
  16. BIN
      HUILIAOAPP/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
  17. BIN
      HUILIAOAPP/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
  18. BIN
      HUILIAOAPP/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
  19. BIN
      HUILIAOAPP/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
  20. BIN
      HUILIAOAPP/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  21. BIN
      HUILIAOAPP/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
  22. BIN
      HUILIAOAPP/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  23. BIN
      HUILIAOAPP/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
  24. 3 0
      HUILIAOAPP/android/app/src/main/res/values/strings.xml
  25. 8 0
      HUILIAOAPP/android/app/src/main/res/values/styles.xml
  26. 40 0
      HUILIAOAPP/android/build.gradle
  27. 20 0
      HUILIAOAPP/android/gradle.properties
  28. BIN
      HUILIAOAPP/android/gradle/wrapper/gradle-wrapper.jar
  29. 5 0
      HUILIAOAPP/android/gradle/wrapper/gradle-wrapper.properties
  30. 164 0
      HUILIAOAPP/android/gradlew
  31. 90 0
      HUILIAOAPP/android/gradlew.bat
  32. 8 0
      HUILIAOAPP/android/keystores/BUCK
  33. 4 0
      HUILIAOAPP/android/keystores/debug.keystore.properties
  34. 3 0
      HUILIAOAPP/android/settings.gradle
  35. 24 0
      HUILIAOAPP/app 2.json
  36. 4 0
      HUILIAOAPP/app.json
  37. BIN
      HUILIAOAPP/assets/icons/icon.png
  38. BIN
      HUILIAOAPP/assets/icons/react-navigation.png
  39. BIN
      HUILIAOAPP/assets/icons/splash.png
  40. 32 0
      HUILIAOAPP/flow-typed/npm/babel-jest_vx.x.x.js
  41. 823 0
      HUILIAOAPP/flow-typed/npm/expo_vx.x.x.js
  42. 6 0
      HUILIAOAPP/flow-typed/npm/flow-bin_v0.x.x.js
  43. 46 0
      HUILIAOAPP/flow-typed/npm/jest-expo_vx.x.x.js
  44. 584 0
      HUILIAOAPP/flow-typed/npm/jest_v21.x.x.js
  45. 39 0
      HUILIAOAPP/flow-typed/npm/jest_vx.x.x.js
  46. 33 0
      HUILIAOAPP/flow-typed/npm/react-addons-test-utils_vx.x.x.js
  47. 123 0
      HUILIAOAPP/flow-typed/npm/react-native-scripts_vx.x.x.js
  48. 7663 0
      HUILIAOAPP/flow-typed/npm/react-native_vx.x.x.js
  49. 62 0
      HUILIAOAPP/flow-typed/npm/react-test-renderer_v16.x.x.js
  50. 66 0
      HUILIAOAPP/flow-typed/npm/react-test-renderer_vx.x.x.js
  51. 8 0
      HUILIAOAPP/index.js
  52. 54 0
      HUILIAOAPP/ios/HUILIAOAPP-tvOS/Info.plist
  53. 24 0
      HUILIAOAPP/ios/HUILIAOAPP-tvOSTests/Info.plist
  54. 1468 0
      HUILIAOAPP/ios/HUILIAOAPP.xcodeproj/project.pbxproj
  55. 129 0
      HUILIAOAPP/ios/HUILIAOAPP.xcodeproj/xcshareddata/xcschemes/HUILIAOAPP-tvOS.xcscheme
  56. 129 0
      HUILIAOAPP/ios/HUILIAOAPP.xcodeproj/xcshareddata/xcschemes/HUILIAOAPP.xcscheme
  57. 14 0
      HUILIAOAPP/ios/HUILIAOAPP/AppDelegate.h
  58. 35 0
      HUILIAOAPP/ios/HUILIAOAPP/AppDelegate.m
  59. 42 0
      HUILIAOAPP/ios/HUILIAOAPP/Base.lproj/LaunchScreen.xib
  60. 38 0
      HUILIAOAPP/ios/HUILIAOAPP/Images.xcassets/AppIcon.appiconset/Contents.json
  61. 6 0
      HUILIAOAPP/ios/HUILIAOAPP/Images.xcassets/Contents.json
  62. 57 0
      HUILIAOAPP/ios/HUILIAOAPP/Info.plist
  63. 16 0
      HUILIAOAPP/ios/HUILIAOAPP/main.m
  64. 68 0
      HUILIAOAPP/ios/HUILIAOAPPTests/HUILIAOAPPTests.m
  65. 24 0
      HUILIAOAPP/ios/HUILIAOAPPTests/Info.plist
  66. 410 0
      HUILIAOAPP/js/App.js
  67. 45 0
      HUILIAOAPP/js/Banner.js
  68. 121 0
      HUILIAOAPP/js/CustomTabs.js
  69. 117 0
      HUILIAOAPP/js/CustomTransitioner.js
  70. 96 0
      HUILIAOAPP/js/Drawer.js
  71. 96 0
      HUILIAOAPP/js/InactiveStack.js
  72. 63 0
      HUILIAOAPP/js/KeyboardHandlingExample.js
  73. 107 0
      HUILIAOAPP/js/ModalStack.js
  74. 75 0
      HUILIAOAPP/js/MultipleDrawer.js
  75. 22 0
      HUILIAOAPP/js/SampleText.js
  76. 255 0
      HUILIAOAPP/js/SimpleStack.js
  77. 204 0
      HUILIAOAPP/js/SimpleTabs.js
  78. 145 0
      HUILIAOAPP/js/StackWithCustomHeaderBackImage.js
  79. 123 0
      HUILIAOAPP/js/StackWithHeaderPreset.js
  80. 249 0
      HUILIAOAPP/js/StackWithTranslucentHeader.js
  81. 130 0
      HUILIAOAPP/js/StacksInTabs.js
  82. 129 0
      HUILIAOAPP/js/StacksOverTabs.js
  83. 142 0
      HUILIAOAPP/js/StacksOverTopTabs.js
  84. 102 0
      HUILIAOAPP/js/StacksWithKeys.js
  85. 121 0
      HUILIAOAPP/js/SwitchWithStacks.js
  86. 45 0
      HUILIAOAPP/js/TabsInDrawer.js
  87. 127 0
      HUILIAOAPP/js/TabsWithNavigationEvents.js
  88. 103 0
      HUILIAOAPP/js/TabsWithNavigationFocus.js
  89. BIN
      HUILIAOAPP/js/assets/NavLogo.png
  90. BIN
      HUILIAOAPP/js/assets/back.png
  91. BIN
      HUILIAOAPP/js/assets/dog-back.png
  92. 18 0
      HUILIAOAPP/js/commonComponents/ButtonWithMargin.js
  93. 16 0
      HUILIAOAPP/js/commonComponents/HeaderButtons.js
  94. 49 0
      HUILIAOAPP/package.json
  95. 6 0
      HUILIAOAPP/src/API/index.js
  96. 78 0
      HUILIAOAPP/src/API/leanCloudAPI.js
  97. 30 0
      HUILIAOAPP/src/components/AuthButton.js
  98. 65 0
      HUILIAOAPP/src/components/LoginScreen.js
  99. 42 0
      HUILIAOAPP/src/components/LoginStatusMessage.js
  100. 0 0
      HUILIAOAPP/src/components/MainScreen.js

+ 3 - 0
HUILIAOAPP/.babelrc

@@ -0,0 +1,3 @@
+{
+  "presets": ["react-native"]
+}

+ 6 - 0
HUILIAOAPP/.buckconfig

@@ -0,0 +1,6 @@
+
+[android]
+  target = Google Inc.:Google APIs:23
+
+[maven_repositories]
+  central = https://repo1.maven.org/maven2

+ 67 - 0
HUILIAOAPP/.flowconfig

@@ -0,0 +1,67 @@
+[ignore]
+; We fork some components by platform
+.*/*[.]android.js
+
+; Ignore "BUCK" generated dirs
+<PROJECT_ROOT>/\.buckd/
+
+; Ignore unexpected extra "@providesModule"
+.*/node_modules/.*/node_modules/fbjs/.*
+
+; Ignore duplicate module providers
+; For RN Apps installed via npm, "Libraries" folder is inside
+; "node_modules/react-native" but in the source repo it is in the root
+.*/Libraries/react-native/React.js
+
+; Ignore polyfills
+.*/Libraries/polyfills/.*
+
+; Ignore metro
+.*/node_modules/metro/.*
+
+[include]
+
+[libs]
+node_modules/react-native/Libraries/react-native/react-native-interface.js
+node_modules/react-native/flow/
+node_modules/react-native/flow-github/
+
+[options]
+emoji=true
+
+module.system=haste
+module.system.haste.use_name_reducers=true
+# get basename
+module.system.haste.name_reducers='^.*/\([a-zA-Z0-9$_.-]+\.js\(\.flow\)?\)$' -> '\1'
+# strip .js or .js.flow suffix
+module.system.haste.name_reducers='^\(.*\)\.js\(\.flow\)?$' -> '\1'
+# strip .ios suffix
+module.system.haste.name_reducers='^\(.*\)\.ios$' -> '\1'
+module.system.haste.name_reducers='^\(.*\)\.android$' -> '\1'
+module.system.haste.name_reducers='^\(.*\)\.native$' -> '\1'
+module.system.haste.paths.blacklist=.*/__tests__/.*
+module.system.haste.paths.blacklist=.*/__mocks__/.*
+module.system.haste.paths.blacklist=<PROJECT_ROOT>/node_modules/react-native/Libraries/Animated/src/polyfills/.*
+module.system.haste.paths.whitelist=<PROJECT_ROOT>/node_modules/react-native/Libraries/.*
+
+munge_underscores=true
+
+module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub'
+
+module.file_ext=.js
+module.file_ext=.jsx
+module.file_ext=.json
+module.file_ext=.native.js
+
+suppress_type=$FlowIssue
+suppress_type=$FlowFixMe
+suppress_type=$FlowFixMeProps
+suppress_type=$FlowFixMeState
+
+suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(<VERSION>\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)
+suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(<VERSION>\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+
+suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy
+suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError
+
+[version]
+^0.75.0

+ 1 - 0
HUILIAOAPP/.gitattributes

@@ -0,0 +1 @@
+*.pbxproj -text

+ 56 - 0
HUILIAOAPP/.gitignore

@@ -0,0 +1,56 @@
+# OSX
+#
+.DS_Store
+
+# Xcode
+#
+build/
+*.pbxuser
+!default.pbxuser
+*.mode1v3
+!default.mode1v3
+*.mode2v3
+!default.mode2v3
+*.perspectivev3
+!default.perspectivev3
+xcuserdata
+*.xccheckout
+*.moved-aside
+DerivedData
+*.hmap
+*.ipa
+*.xcuserstate
+project.xcworkspace
+
+# Android/IntelliJ
+#
+build/
+.idea
+.gradle
+local.properties
+*.iml
+
+# node.js
+#
+node_modules/
+npm-debug.log
+yarn-error.log
+
+# BUCK
+buck-out/
+\.buckd/
+*.keystore
+
+# fastlane
+#
+# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
+# screenshots whenever they are needed.
+# For more information about the recommended setup visit:
+# https://docs.fastlane.tools/best-practices/source-control/
+
+*/fastlane/report.xml
+*/fastlane/Preview.html
+*/fastlane/screenshots
+
+# Bundle artifact
+*.jsbundle

+ 1 - 0
HUILIAOAPP/.watchmanconfig

@@ -0,0 +1 @@
+{}

+ 22 - 0
HUILIAOAPP/App.js

@@ -0,0 +1,22 @@
+// import React from 'react';
+// import { AppRegistry } from 'react-native';
+// import { Provider } from 'react-redux';
+// import { createStore, applyMiddleware } from 'redux';
+// import AppReducer from './src/reducers';
+// import { AppNavigator, middleware } from './src/navigators/AppNavigator';
+
+
+// const store = createStore(AppReducer, applyMiddleware(middleware));
+
+// class HuiLiao extends React.Component {
+//   render() {
+//     return (
+//       <Provider store={store}>
+//         <AppNavigator />
+//       </Provider>
+//     );
+//   }
+// }
+// export default HuiLiao;
+import App from './js/App';
+export default App;

+ 65 - 0
HUILIAOAPP/android/app/BUCK

@@ -0,0 +1,65 @@
+# To learn about Buck see [Docs](https://buckbuild.com/).
+# To run your application with Buck:
+# - install Buck
+# - `npm start` - to start the packager
+# - `cd android`
+# - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"`
+# - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck
+# - `buck install -r android/app` - compile, install and run application
+#
+
+lib_deps = []
+
+for jarfile in glob(['libs/*.jar']):
+  name = 'jars__' + jarfile[jarfile.rindex('/') + 1: jarfile.rindex('.jar')]
+  lib_deps.append(':' + name)
+  prebuilt_jar(
+    name = name,
+    binary_jar = jarfile,
+  )
+
+for aarfile in glob(['libs/*.aar']):
+  name = 'aars__' + aarfile[aarfile.rindex('/') + 1: aarfile.rindex('.aar')]
+  lib_deps.append(':' + name)
+  android_prebuilt_aar(
+    name = name,
+    aar = aarfile,
+  )
+
+android_library(
+    name = "all-libs",
+    exported_deps = lib_deps,
+)
+
+android_library(
+    name = "app-code",
+    srcs = glob([
+        "src/main/java/**/*.java",
+    ]),
+    deps = [
+        ":all-libs",
+        ":build_config",
+        ":res",
+    ],
+)
+
+android_build_config(
+    name = "build_config",
+    package = "com.huiliaoapp",
+)
+
+android_resource(
+    name = "res",
+    package = "com.huiliaoapp",
+    res = "src/main/res",
+)
+
+android_binary(
+    name = "app",
+    keystore = "//android/keystores:debug",
+    manifest = "src/main/AndroidManifest.xml",
+    package_type = "debug",
+    deps = [
+        ":app-code",
+    ],
+)

+ 150 - 0
HUILIAOAPP/android/app/build.gradle

@@ -0,0 +1,150 @@
+apply plugin: "com.android.application"
+
+import com.android.build.OutputFile
+
+/**
+ * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
+ * and bundleReleaseJsAndAssets).
+ * These basically call `react-native bundle` with the correct arguments during the Android build
+ * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
+ * bundle directly from the development server. Below you can see all the possible configurations
+ * and their defaults. If you decide to add a configuration block, make sure to add it before the
+ * `apply from: "../../node_modules/react-native/react.gradle"` line.
+ *
+ * project.ext.react = [
+ *   // the name of the generated asset file containing your JS bundle
+ *   bundleAssetName: "index.android.bundle",
+ *
+ *   // the entry file for bundle generation
+ *   entryFile: "index.android.js",
+ *
+ *   // whether to bundle JS and assets in debug mode
+ *   bundleInDebug: false,
+ *
+ *   // whether to bundle JS and assets in release mode
+ *   bundleInRelease: true,
+ *
+ *   // whether to bundle JS and assets in another build variant (if configured).
+ *   // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
+ *   // The configuration property can be in the following formats
+ *   //         'bundleIn${productFlavor}${buildType}'
+ *   //         'bundleIn${buildType}'
+ *   // bundleInFreeDebug: true,
+ *   // bundleInPaidRelease: true,
+ *   // bundleInBeta: true,
+ *
+ *   // whether to disable dev mode in custom build variants (by default only disabled in release)
+ *   // for example: to disable dev mode in the staging build type (if configured)
+ *   devDisabledInStaging: true,
+ *   // The configuration property can be in the following formats
+ *   //         'devDisabledIn${productFlavor}${buildType}'
+ *   //         'devDisabledIn${buildType}'
+ *
+ *   // the root of your project, i.e. where "package.json" lives
+ *   root: "../../",
+ *
+ *   // where to put the JS bundle asset in debug mode
+ *   jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
+ *
+ *   // where to put the JS bundle asset in release mode
+ *   jsBundleDirRelease: "$buildDir/intermediates/assets/release",
+ *
+ *   // where to put drawable resources / React Native assets, e.g. the ones you use via
+ *   // require('./image.png')), in debug mode
+ *   resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
+ *
+ *   // where to put drawable resources / React Native assets, e.g. the ones you use via
+ *   // require('./image.png')), in release mode
+ *   resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
+ *
+ *   // by default the gradle tasks are skipped if none of the JS files or assets change; this means
+ *   // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
+ *   // date; if you have any other folders that you want to ignore for performance reasons (gradle
+ *   // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
+ *   // for example, you might want to remove it from here.
+ *   inputExcludes: ["android/**", "ios/**"],
+ *
+ *   // override which node gets called and with what additional arguments
+ *   nodeExecutableAndArgs: ["node"],
+ *
+ *   // supply additional arguments to the packager
+ *   extraPackagerArgs: []
+ * ]
+ */
+
+project.ext.react = [
+    entryFile: "index.js"
+]
+
+apply from: "../../node_modules/react-native/react.gradle"
+
+/**
+ * Set this to true to create two separate APKs instead of one:
+ *   - An APK that only works on ARM devices
+ *   - An APK that only works on x86 devices
+ * The advantage is the size of the APK is reduced by about 4MB.
+ * Upload all the APKs to the Play Store and people will download
+ * the correct one based on the CPU architecture of their device.
+ */
+def enableSeparateBuildPerCPUArchitecture = false
+
+/**
+ * Run Proguard to shrink the Java bytecode in release builds.
+ */
+def enableProguardInReleaseBuilds = false
+
+android {
+    compileSdkVersion rootProject.ext.compileSdkVersion
+    buildToolsVersion rootProject.ext.buildToolsVersion
+
+    defaultConfig {
+        applicationId "com.huiliaoapp"
+        minSdkVersion rootProject.ext.minSdkVersion
+        targetSdkVersion rootProject.ext.targetSdkVersion
+        versionCode 1
+        versionName "1.0"
+        ndk {
+            abiFilters "armeabi-v7a", "x86"
+        }
+    }
+    splits {
+        abi {
+            reset()
+            enable enableSeparateBuildPerCPUArchitecture
+            universalApk false  // If true, also generate a universal APK
+            include "armeabi-v7a", "x86"
+        }
+    }
+    buildTypes {
+        release {
+            minifyEnabled enableProguardInReleaseBuilds
+            proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
+        }
+    }
+    // applicationVariants are e.g. debug, release
+    applicationVariants.all { variant ->
+        variant.outputs.each { output ->
+            // For each separate APK per architecture, set a unique version code as described here:
+            // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
+            def versionCodes = ["armeabi-v7a":1, "x86":2]
+            def abi = output.getFilter(OutputFile.ABI)
+            if (abi != null) {  // null for the universal-debug, universal-release variants
+                output.versionCodeOverride =
+                        versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
+            }
+        }
+    }
+}
+
+dependencies {
+    compile fileTree(dir: "libs", include: ["*.jar"])
+    compile "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}"
+    compile "com.facebook.react:react-native:+"  // From node_modules
+}
+
+// Run this once to be able to run the application with BUCK
+// puts all compile dependencies into folder libs for BUCK to use
+task copyDownloadableDepsToLibs(type: Copy) {
+    from configurations.compile
+    into 'libs'
+}

+ 17 - 0
HUILIAOAPP/android/app/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 /usr/local/Cellar/android-sdk/24.3.3/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 *;
+#}

+ 26 - 0
HUILIAOAPP/android/app/src/main/AndroidManifest.xml

@@ -0,0 +1,26 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.huiliaoapp">
+
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
+
+    <application
+      android:name=".MainApplication"
+      android:label="@string/app_name"
+      android:icon="@mipmap/ic_launcher"
+      android:allowBackup="false"
+      android:theme="@style/AppTheme">
+      <activity
+        android:name=".MainActivity"
+        android:label="@string/app_name"
+        android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
+        android:windowSoftInputMode="adjustResize">
+        <intent-filter>
+            <action android:name="android.intent.action.MAIN" />
+            <category android:name="android.intent.category.LAUNCHER" />
+        </intent-filter>
+      </activity>
+      <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
+    </application>
+
+</manifest>

+ 15 - 0
HUILIAOAPP/android/app/src/main/java/com/huiliaoapp/MainActivity.java

@@ -0,0 +1,15 @@
+package com.huiliaoapp;
+
+import com.facebook.react.ReactActivity;
+
+public class MainActivity extends ReactActivity {
+
+    /**
+     * Returns the name of the main component registered from JavaScript.
+     * This is used to schedule rendering of the component.
+     */
+    @Override
+    protected String getMainComponentName() {
+        return "HUILIAOAPP";
+    }
+}

+ 45 - 0
HUILIAOAPP/android/app/src/main/java/com/huiliaoapp/MainApplication.java

@@ -0,0 +1,45 @@
+package com.huiliaoapp;
+
+import android.app.Application;
+
+import com.facebook.react.ReactApplication;
+import com.facebook.react.ReactNativeHost;
+import com.facebook.react.ReactPackage;
+import com.facebook.react.shell.MainReactPackage;
+import com.facebook.soloader.SoLoader;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class MainApplication extends Application implements ReactApplication {
+
+  private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
+    @Override
+    public boolean getUseDeveloperSupport() {
+      return BuildConfig.DEBUG;
+    }
+
+    @Override
+    protected List<ReactPackage> getPackages() {
+      return Arrays.<ReactPackage>asList(
+          new MainReactPackage()
+      );
+    }
+
+    @Override
+    protected String getJSMainModuleName() {
+      return "index";
+    }
+  };
+
+  @Override
+  public ReactNativeHost getReactNativeHost() {
+    return mReactNativeHost;
+  }
+
+  @Override
+  public void onCreate() {
+    super.onCreate();
+    SoLoader.init(this, /* native exopackage */ false);
+  }
+}

BIN
HUILIAOAPP/android/app/src/main/res/mipmap-hdpi/ic_launcher.png


BIN
HUILIAOAPP/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png


BIN
HUILIAOAPP/android/app/src/main/res/mipmap-mdpi/ic_launcher.png


BIN
HUILIAOAPP/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png


BIN
HUILIAOAPP/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png


BIN
HUILIAOAPP/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png


BIN
HUILIAOAPP/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png


BIN
HUILIAOAPP/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png


BIN
HUILIAOAPP/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png


BIN
HUILIAOAPP/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png


+ 3 - 0
HUILIAOAPP/android/app/src/main/res/values/strings.xml

@@ -0,0 +1,3 @@
+<resources>
+    <string name="app_name">HUILIAOAPP</string>
+</resources>

+ 8 - 0
HUILIAOAPP/android/app/src/main/res/values/styles.xml

@@ -0,0 +1,8 @@
+<resources>
+
+    <!-- Base application theme. -->
+    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
+        <!-- Customize your theme here. -->
+    </style>
+
+</resources>

+ 40 - 0
HUILIAOAPP/android/build.gradle

@@ -0,0 +1,40 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+    repositories {
+        jcenter()
+        maven {
+            url 'https://maven.google.com/'
+            name 'Google'
+        }
+    }
+    dependencies {
+        classpath 'com.android.tools.build:gradle:2.3.3'
+
+        // NOTE: Do not place your application dependencies here; they belong
+        // in the individual module build.gradle files
+    }
+}
+
+allprojects {
+    repositories {
+        mavenLocal()
+        jcenter()
+        maven {
+            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
+            url "$rootDir/../node_modules/react-native/android"
+        }
+        maven {
+            url 'https://maven.google.com/'
+            name 'Google'
+        }
+    }
+}
+
+ext {
+    buildToolsVersion = "26.0.3"
+    minSdkVersion = 16
+    compileSdkVersion = 26
+    targetSdkVersion = 26
+    supportLibVersion = "26.1.0"
+}

+ 20 - 0
HUILIAOAPP/android/gradle.properties

@@ -0,0 +1,20 @@
+# Project-wide Gradle settings.
+
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+
+# 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
+# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
+
+# 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
+# org.gradle.parallel=true
+
+android.useDeprecatedNdk=true

BIN
HUILIAOAPP/android/gradle/wrapper/gradle-wrapper.jar


+ 5 - 0
HUILIAOAPP/android/gradle/wrapper/gradle-wrapper.properties

@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-3.5.1-all.zip

+ 164 - 0
HUILIAOAPP/android/gradlew

@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# 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
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+esac
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+    [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# 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\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+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" ] ; 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"`
+
+    # 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
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+    JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"

+ 90 - 0
HUILIAOAPP/android/gradlew.bat

@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega

+ 8 - 0
HUILIAOAPP/android/keystores/BUCK

@@ -0,0 +1,8 @@
+keystore(
+    name = "debug",
+    properties = "debug.keystore.properties",
+    store = "debug.keystore",
+    visibility = [
+        "PUBLIC",
+    ],
+)

+ 4 - 0
HUILIAOAPP/android/keystores/debug.keystore.properties

@@ -0,0 +1,4 @@
+key.store=debug.keystore
+key.alias=androiddebugkey
+key.store.password=android
+key.alias.password=android

+ 3 - 0
HUILIAOAPP/android/settings.gradle

@@ -0,0 +1,3 @@
+rootProject.name = 'HUILIAOAPP'
+
+include ':app'

+ 24 - 0
HUILIAOAPP/app 2.json

@@ -0,0 +1,24 @@
+{
+  "expo": {
+    "name": "ReduxExample",
+    "description": "Try out react-navigation with this awesome Redux example",
+    "version": "1.0.0",
+    "slug": "ReduxExample",
+    "privacy": "public",
+    "orientation": "portrait",
+    "primaryColor": "#cccccc",
+    "icon": "./assets/icons/react-navigation.png",
+    "loading": {
+      "icon": "./assets/icons/react-navigation.png",
+      "hideExponentText": false
+    },
+    "sdkVersion": "27.0.0",
+    "entryPoint": "./node_modules/react-native-scripts/build/bin/crna-entry.js",
+    "packagerOpts": {
+      "assetExts": ["ttf", "mp4"]
+    },
+    "ios": {
+      "supportsTablet": true
+    }
+  }
+}

+ 4 - 0
HUILIAOAPP/app.json

@@ -0,0 +1,4 @@
+{
+  "name": "HUILIAOAPP",
+  "displayName": "HUILIAOAPP"
+}

BIN
HUILIAOAPP/assets/icons/icon.png


BIN
HUILIAOAPP/assets/icons/react-navigation.png


BIN
HUILIAOAPP/assets/icons/splash.png


+ 32 - 0
HUILIAOAPP/flow-typed/npm/babel-jest_vx.x.x.js

@@ -0,0 +1,32 @@
+// flow-typed signature: ee7b4028012cfdcd83cc6541a39b2282
+// flow-typed version: <<STUB>>/babel-jest_v^21.0.0/flow_v0.61.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ *   'babel-jest'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'babel-jest' {
+  declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'babel-jest/build/index' {
+  declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'babel-jest/build/index.js' {
+  declare module.exports: $Exports<'babel-jest/build/index'>;
+}

+ 823 - 0
HUILIAOAPP/flow-typed/npm/expo_vx.x.x.js

@@ -0,0 +1,823 @@
+// flow-typed signature: c1ecfe71fbb86c3602b7da3d7c141df1
+// flow-typed version: <<STUB>>/expo_v^24.0.2/flow_v0.61.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ *   'expo'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'expo' {
+  declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'expo/AppEntry' {
+  declare module.exports: any;
+}
+
+declare module 'expo/flow/metro-bundler' {
+  declare module.exports: any;
+}
+
+declare module 'expo/flow/react-native-gesture-handler' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/__mocks__/Constants-development' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/__tests__/Amplitude-test' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/__tests__/AuthSession-test' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/__tests__/Constants-test' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/__tests__/ErrorRecovery-test' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/__tests__/Expo-test' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/__tests__/Facebook-test' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/__tests__/Font-test' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/__tests__/Location-test' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/__tests__/Notifications-test' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/__tests__/SecureStore-test' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/__tests__/Segment-test' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/__tests__/WebBrowser-test' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/admob/RNAdMobBanner' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/admob/RNAdMobInterstitial' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/admob/RNAdMobRewarded' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/admob/RNPublisherBanner' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/Amplitude' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/apisAreAvailable' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/Asset' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/AuthSession' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/av/Audio' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/av/Audio/Recording' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/av/Audio/Sound' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/av/AV' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/av/Video' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/BarCodeScanner.android' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/BarCodeScanner.ios' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/Brightness' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/Camera' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/CameraBasedBarCodeScanner' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/Constants' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/Contacts' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/DangerZone' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/DocumentPicker' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/effects/BlurView.android' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/effects/BlurView.ios' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/effects/LinearGradient.android' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/effects/LinearGradient.ios' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/environment/__tests__/validate-test' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/environment/logging' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/environment/validate' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/ErrorRecovery' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/Expo' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/facebook-ads/AdSettings' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/facebook-ads/BannerViewManager' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/facebook-ads/index' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/facebook-ads/InterstitialAdManager' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/facebook-ads/NativeAdsManager' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/facebook-ads/withNativeAd' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/Facebook' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/FaceDetector' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/FileSystem' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/Fingerprint' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/Font' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/GLView' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/Google' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/Icon' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/ImageManipulator' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/ImagePicker' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/IntentLauncherAndroid' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/KeepAwake' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/launch/AppLoading' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/launch/AppLoadingNativeWrapper.android' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/launch/AppLoadingNativeWrapper.ios' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/launch/registerRootComponent' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/launch/RootErrorBoundary' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/lib/Queue' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/Location' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/logs/__tests__/Logs-test' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/logs/__tests__/LogSerialization-test' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/logs/__tests__/RemoteConsole-test' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/logs/__tests__/RemoteLogging-test' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/logs/__tests__/RemoteLogs-test' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/logs/Logs' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/logs/LogSerialization' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/logs/RemoteConsole' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/logs/RemoteLogging' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/modal/Modal' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/modal/ModalHost' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/modal/ModalImplementation' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/modal/PureContainer' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/Notifications' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/OldBarCodeScanner' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/Payments' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/Pedometer' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/Permissions' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/ScreenOrientation' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/SecureStore' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/Segment' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/sensor/__tests__/Accelerometer-test' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/sensor/__tests__/DeviceMotion-test' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/sensor/__tests__/DeviceSensor-test' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/sensor/__tests__/Gyroscope-test' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/sensor/__tests__/Magnetometer-test' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/sensor/Accelerometer' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/sensor/DeviceMotion' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/sensor/DeviceSensor' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/sensor/Gyroscope' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/sensor/Magnetometer' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/sensor/MagnetometerUncalibrated' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/sensor/ThreeAxisSensor' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/Speech' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/SQLite' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/Svg' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/takeSnapshotAsync' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/timer/polyfillNextTick' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/Util' {
+  declare module.exports: any;
+}
+
+declare module 'expo/src/WebBrowser' {
+  declare module.exports: any;
+}
+
+declare module 'expo/tools/hashAssetFiles' {
+  declare module.exports: any;
+}
+
+declare module 'expo/tools/LogReporter' {
+  declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'expo/AppEntry.js' {
+  declare module.exports: $Exports<'expo/AppEntry'>;
+}
+declare module 'expo/flow/metro-bundler.js' {
+  declare module.exports: $Exports<'expo/flow/metro-bundler'>;
+}
+declare module 'expo/flow/react-native-gesture-handler.js' {
+  declare module.exports: $Exports<'expo/flow/react-native-gesture-handler'>;
+}
+declare module 'expo/src/__mocks__/Constants-development.js' {
+  declare module.exports: $Exports<'expo/src/__mocks__/Constants-development'>;
+}
+declare module 'expo/src/__tests__/Amplitude-test.js' {
+  declare module.exports: $Exports<'expo/src/__tests__/Amplitude-test'>;
+}
+declare module 'expo/src/__tests__/AuthSession-test.js' {
+  declare module.exports: $Exports<'expo/src/__tests__/AuthSession-test'>;
+}
+declare module 'expo/src/__tests__/Constants-test.js' {
+  declare module.exports: $Exports<'expo/src/__tests__/Constants-test'>;
+}
+declare module 'expo/src/__tests__/ErrorRecovery-test.js' {
+  declare module.exports: $Exports<'expo/src/__tests__/ErrorRecovery-test'>;
+}
+declare module 'expo/src/__tests__/Expo-test.js' {
+  declare module.exports: $Exports<'expo/src/__tests__/Expo-test'>;
+}
+declare module 'expo/src/__tests__/Facebook-test.js' {
+  declare module.exports: $Exports<'expo/src/__tests__/Facebook-test'>;
+}
+declare module 'expo/src/__tests__/Font-test.js' {
+  declare module.exports: $Exports<'expo/src/__tests__/Font-test'>;
+}
+declare module 'expo/src/__tests__/Location-test.js' {
+  declare module.exports: $Exports<'expo/src/__tests__/Location-test'>;
+}
+declare module 'expo/src/__tests__/Notifications-test.js' {
+  declare module.exports: $Exports<'expo/src/__tests__/Notifications-test'>;
+}
+declare module 'expo/src/__tests__/SecureStore-test.js' {
+  declare module.exports: $Exports<'expo/src/__tests__/SecureStore-test'>;
+}
+declare module 'expo/src/__tests__/Segment-test.js' {
+  declare module.exports: $Exports<'expo/src/__tests__/Segment-test'>;
+}
+declare module 'expo/src/__tests__/WebBrowser-test.js' {
+  declare module.exports: $Exports<'expo/src/__tests__/WebBrowser-test'>;
+}
+declare module 'expo/src/admob/RNAdMobBanner.js' {
+  declare module.exports: $Exports<'expo/src/admob/RNAdMobBanner'>;
+}
+declare module 'expo/src/admob/RNAdMobInterstitial.js' {
+  declare module.exports: $Exports<'expo/src/admob/RNAdMobInterstitial'>;
+}
+declare module 'expo/src/admob/RNAdMobRewarded.js' {
+  declare module.exports: $Exports<'expo/src/admob/RNAdMobRewarded'>;
+}
+declare module 'expo/src/admob/RNPublisherBanner.js' {
+  declare module.exports: $Exports<'expo/src/admob/RNPublisherBanner'>;
+}
+declare module 'expo/src/Amplitude.js' {
+  declare module.exports: $Exports<'expo/src/Amplitude'>;
+}
+declare module 'expo/src/apisAreAvailable.js' {
+  declare module.exports: $Exports<'expo/src/apisAreAvailable'>;
+}
+declare module 'expo/src/Asset.js' {
+  declare module.exports: $Exports<'expo/src/Asset'>;
+}
+declare module 'expo/src/AuthSession.js' {
+  declare module.exports: $Exports<'expo/src/AuthSession'>;
+}
+declare module 'expo/src/av/Audio.js' {
+  declare module.exports: $Exports<'expo/src/av/Audio'>;
+}
+declare module 'expo/src/av/Audio/Recording.js' {
+  declare module.exports: $Exports<'expo/src/av/Audio/Recording'>;
+}
+declare module 'expo/src/av/Audio/Sound.js' {
+  declare module.exports: $Exports<'expo/src/av/Audio/Sound'>;
+}
+declare module 'expo/src/av/AV.js' {
+  declare module.exports: $Exports<'expo/src/av/AV'>;
+}
+declare module 'expo/src/av/Video.js' {
+  declare module.exports: $Exports<'expo/src/av/Video'>;
+}
+declare module 'expo/src/BarCodeScanner.android.js' {
+  declare module.exports: $Exports<'expo/src/BarCodeScanner.android'>;
+}
+declare module 'expo/src/BarCodeScanner.ios.js' {
+  declare module.exports: $Exports<'expo/src/BarCodeScanner.ios'>;
+}
+declare module 'expo/src/Brightness.js' {
+  declare module.exports: $Exports<'expo/src/Brightness'>;
+}
+declare module 'expo/src/Camera.js' {
+  declare module.exports: $Exports<'expo/src/Camera'>;
+}
+declare module 'expo/src/CameraBasedBarCodeScanner.js' {
+  declare module.exports: $Exports<'expo/src/CameraBasedBarCodeScanner'>;
+}
+declare module 'expo/src/Constants.js' {
+  declare module.exports: $Exports<'expo/src/Constants'>;
+}
+declare module 'expo/src/Contacts.js' {
+  declare module.exports: $Exports<'expo/src/Contacts'>;
+}
+declare module 'expo/src/DangerZone.js' {
+  declare module.exports: $Exports<'expo/src/DangerZone'>;
+}
+declare module 'expo/src/DocumentPicker.js' {
+  declare module.exports: $Exports<'expo/src/DocumentPicker'>;
+}
+declare module 'expo/src/effects/BlurView.android.js' {
+  declare module.exports: $Exports<'expo/src/effects/BlurView.android'>;
+}
+declare module 'expo/src/effects/BlurView.ios.js' {
+  declare module.exports: $Exports<'expo/src/effects/BlurView.ios'>;
+}
+declare module 'expo/src/effects/LinearGradient.android.js' {
+  declare module.exports: $Exports<'expo/src/effects/LinearGradient.android'>;
+}
+declare module 'expo/src/effects/LinearGradient.ios.js' {
+  declare module.exports: $Exports<'expo/src/effects/LinearGradient.ios'>;
+}
+declare module 'expo/src/environment/__tests__/validate-test.js' {
+  declare module.exports: $Exports<'expo/src/environment/__tests__/validate-test'>;
+}
+declare module 'expo/src/environment/logging.js' {
+  declare module.exports: $Exports<'expo/src/environment/logging'>;
+}
+declare module 'expo/src/environment/validate.js' {
+  declare module.exports: $Exports<'expo/src/environment/validate'>;
+}
+declare module 'expo/src/ErrorRecovery.js' {
+  declare module.exports: $Exports<'expo/src/ErrorRecovery'>;
+}
+declare module 'expo/src/Expo.js' {
+  declare module.exports: $Exports<'expo/src/Expo'>;
+}
+declare module 'expo/src/facebook-ads/AdSettings.js' {
+  declare module.exports: $Exports<'expo/src/facebook-ads/AdSettings'>;
+}
+declare module 'expo/src/facebook-ads/BannerViewManager.js' {
+  declare module.exports: $Exports<'expo/src/facebook-ads/BannerViewManager'>;
+}
+declare module 'expo/src/facebook-ads/index.js' {
+  declare module.exports: $Exports<'expo/src/facebook-ads/index'>;
+}
+declare module 'expo/src/facebook-ads/InterstitialAdManager.js' {
+  declare module.exports: $Exports<'expo/src/facebook-ads/InterstitialAdManager'>;
+}
+declare module 'expo/src/facebook-ads/NativeAdsManager.js' {
+  declare module.exports: $Exports<'expo/src/facebook-ads/NativeAdsManager'>;
+}
+declare module 'expo/src/facebook-ads/withNativeAd.js' {
+  declare module.exports: $Exports<'expo/src/facebook-ads/withNativeAd'>;
+}
+declare module 'expo/src/Facebook.js' {
+  declare module.exports: $Exports<'expo/src/Facebook'>;
+}
+declare module 'expo/src/FaceDetector.js' {
+  declare module.exports: $Exports<'expo/src/FaceDetector'>;
+}
+declare module 'expo/src/FileSystem.js' {
+  declare module.exports: $Exports<'expo/src/FileSystem'>;
+}
+declare module 'expo/src/Fingerprint.js' {
+  declare module.exports: $Exports<'expo/src/Fingerprint'>;
+}
+declare module 'expo/src/Font.js' {
+  declare module.exports: $Exports<'expo/src/Font'>;
+}
+declare module 'expo/src/GLView.js' {
+  declare module.exports: $Exports<'expo/src/GLView'>;
+}
+declare module 'expo/src/Google.js' {
+  declare module.exports: $Exports<'expo/src/Google'>;
+}
+declare module 'expo/src/Icon.js' {
+  declare module.exports: $Exports<'expo/src/Icon'>;
+}
+declare module 'expo/src/ImageManipulator.js' {
+  declare module.exports: $Exports<'expo/src/ImageManipulator'>;
+}
+declare module 'expo/src/ImagePicker.js' {
+  declare module.exports: $Exports<'expo/src/ImagePicker'>;
+}
+declare module 'expo/src/IntentLauncherAndroid.js' {
+  declare module.exports: $Exports<'expo/src/IntentLauncherAndroid'>;
+}
+declare module 'expo/src/KeepAwake.js' {
+  declare module.exports: $Exports<'expo/src/KeepAwake'>;
+}
+declare module 'expo/src/launch/AppLoading.js' {
+  declare module.exports: $Exports<'expo/src/launch/AppLoading'>;
+}
+declare module 'expo/src/launch/AppLoadingNativeWrapper.android.js' {
+  declare module.exports: $Exports<'expo/src/launch/AppLoadingNativeWrapper.android'>;
+}
+declare module 'expo/src/launch/AppLoadingNativeWrapper.ios.js' {
+  declare module.exports: $Exports<'expo/src/launch/AppLoadingNativeWrapper.ios'>;
+}
+declare module 'expo/src/launch/registerRootComponent.js' {
+  declare module.exports: $Exports<'expo/src/launch/registerRootComponent'>;
+}
+declare module 'expo/src/launch/RootErrorBoundary.js' {
+  declare module.exports: $Exports<'expo/src/launch/RootErrorBoundary'>;
+}
+declare module 'expo/src/lib/Queue.js' {
+  declare module.exports: $Exports<'expo/src/lib/Queue'>;
+}
+declare module 'expo/src/Location.js' {
+  declare module.exports: $Exports<'expo/src/Location'>;
+}
+declare module 'expo/src/logs/__tests__/Logs-test.js' {
+  declare module.exports: $Exports<'expo/src/logs/__tests__/Logs-test'>;
+}
+declare module 'expo/src/logs/__tests__/LogSerialization-test.js' {
+  declare module.exports: $Exports<'expo/src/logs/__tests__/LogSerialization-test'>;
+}
+declare module 'expo/src/logs/__tests__/RemoteConsole-test.js' {
+  declare module.exports: $Exports<'expo/src/logs/__tests__/RemoteConsole-test'>;
+}
+declare module 'expo/src/logs/__tests__/RemoteLogging-test.js' {
+  declare module.exports: $Exports<'expo/src/logs/__tests__/RemoteLogging-test'>;
+}
+declare module 'expo/src/logs/__tests__/RemoteLogs-test.js' {
+  declare module.exports: $Exports<'expo/src/logs/__tests__/RemoteLogs-test'>;
+}
+declare module 'expo/src/logs/Logs.js' {
+  declare module.exports: $Exports<'expo/src/logs/Logs'>;
+}
+declare module 'expo/src/logs/LogSerialization.js' {
+  declare module.exports: $Exports<'expo/src/logs/LogSerialization'>;
+}
+declare module 'expo/src/logs/RemoteConsole.js' {
+  declare module.exports: $Exports<'expo/src/logs/RemoteConsole'>;
+}
+declare module 'expo/src/logs/RemoteLogging.js' {
+  declare module.exports: $Exports<'expo/src/logs/RemoteLogging'>;
+}
+declare module 'expo/src/modal/Modal.js' {
+  declare module.exports: $Exports<'expo/src/modal/Modal'>;
+}
+declare module 'expo/src/modal/ModalHost.js' {
+  declare module.exports: $Exports<'expo/src/modal/ModalHost'>;
+}
+declare module 'expo/src/modal/ModalImplementation.js' {
+  declare module.exports: $Exports<'expo/src/modal/ModalImplementation'>;
+}
+declare module 'expo/src/modal/PureContainer.js' {
+  declare module.exports: $Exports<'expo/src/modal/PureContainer'>;
+}
+declare module 'expo/src/Notifications.js' {
+  declare module.exports: $Exports<'expo/src/Notifications'>;
+}
+declare module 'expo/src/OldBarCodeScanner.js' {
+  declare module.exports: $Exports<'expo/src/OldBarCodeScanner'>;
+}
+declare module 'expo/src/Payments.js' {
+  declare module.exports: $Exports<'expo/src/Payments'>;
+}
+declare module 'expo/src/Pedometer.js' {
+  declare module.exports: $Exports<'expo/src/Pedometer'>;
+}
+declare module 'expo/src/Permissions.js' {
+  declare module.exports: $Exports<'expo/src/Permissions'>;
+}
+declare module 'expo/src/ScreenOrientation.js' {
+  declare module.exports: $Exports<'expo/src/ScreenOrientation'>;
+}
+declare module 'expo/src/SecureStore.js' {
+  declare module.exports: $Exports<'expo/src/SecureStore'>;
+}
+declare module 'expo/src/Segment.js' {
+  declare module.exports: $Exports<'expo/src/Segment'>;
+}
+declare module 'expo/src/sensor/__tests__/Accelerometer-test.js' {
+  declare module.exports: $Exports<'expo/src/sensor/__tests__/Accelerometer-test'>;
+}
+declare module 'expo/src/sensor/__tests__/DeviceMotion-test.js' {
+  declare module.exports: $Exports<'expo/src/sensor/__tests__/DeviceMotion-test'>;
+}
+declare module 'expo/src/sensor/__tests__/DeviceSensor-test.js' {
+  declare module.exports: $Exports<'expo/src/sensor/__tests__/DeviceSensor-test'>;
+}
+declare module 'expo/src/sensor/__tests__/Gyroscope-test.js' {
+  declare module.exports: $Exports<'expo/src/sensor/__tests__/Gyroscope-test'>;
+}
+declare module 'expo/src/sensor/__tests__/Magnetometer-test.js' {
+  declare module.exports: $Exports<'expo/src/sensor/__tests__/Magnetometer-test'>;
+}
+declare module 'expo/src/sensor/Accelerometer.js' {
+  declare module.exports: $Exports<'expo/src/sensor/Accelerometer'>;
+}
+declare module 'expo/src/sensor/DeviceMotion.js' {
+  declare module.exports: $Exports<'expo/src/sensor/DeviceMotion'>;
+}
+declare module 'expo/src/sensor/DeviceSensor.js' {
+  declare module.exports: $Exports<'expo/src/sensor/DeviceSensor'>;
+}
+declare module 'expo/src/sensor/Gyroscope.js' {
+  declare module.exports: $Exports<'expo/src/sensor/Gyroscope'>;
+}
+declare module 'expo/src/sensor/Magnetometer.js' {
+  declare module.exports: $Exports<'expo/src/sensor/Magnetometer'>;
+}
+declare module 'expo/src/sensor/MagnetometerUncalibrated.js' {
+  declare module.exports: $Exports<'expo/src/sensor/MagnetometerUncalibrated'>;
+}
+declare module 'expo/src/sensor/ThreeAxisSensor.js' {
+  declare module.exports: $Exports<'expo/src/sensor/ThreeAxisSensor'>;
+}
+declare module 'expo/src/Speech.js' {
+  declare module.exports: $Exports<'expo/src/Speech'>;
+}
+declare module 'expo/src/SQLite.js' {
+  declare module.exports: $Exports<'expo/src/SQLite'>;
+}
+declare module 'expo/src/Svg.js' {
+  declare module.exports: $Exports<'expo/src/Svg'>;
+}
+declare module 'expo/src/takeSnapshotAsync.js' {
+  declare module.exports: $Exports<'expo/src/takeSnapshotAsync'>;
+}
+declare module 'expo/src/timer/polyfillNextTick.js' {
+  declare module.exports: $Exports<'expo/src/timer/polyfillNextTick'>;
+}
+declare module 'expo/src/Util.js' {
+  declare module.exports: $Exports<'expo/src/Util'>;
+}
+declare module 'expo/src/WebBrowser.js' {
+  declare module.exports: $Exports<'expo/src/WebBrowser'>;
+}
+declare module 'expo/tools/hashAssetFiles.js' {
+  declare module.exports: $Exports<'expo/tools/hashAssetFiles'>;
+}
+declare module 'expo/tools/LogReporter.js' {
+  declare module.exports: $Exports<'expo/tools/LogReporter'>;
+}

+ 6 - 0
HUILIAOAPP/flow-typed/npm/flow-bin_v0.x.x.js

@@ -0,0 +1,6 @@
+// flow-typed signature: 6a5610678d4b01e13bbfbbc62bdaf583
+// flow-typed version: 3817bc6980/flow-bin_v0.x.x/flow_>=v0.25.x
+
+declare module "flow-bin" {
+  declare module.exports: string;
+}

+ 46 - 0
HUILIAOAPP/flow-typed/npm/jest-expo_vx.x.x.js

@@ -0,0 +1,46 @@
+// flow-typed signature: b1e3826a494aecf4ff482336321b54bd
+// flow-typed version: <<STUB>>/jest-expo_v^24.0.0/flow_v0.61.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ *   'jest-expo'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'jest-expo' {
+  declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'jest-expo/src/createMockConstants' {
+  declare module.exports: any;
+}
+
+declare module 'jest-expo/src/expoModules' {
+  declare module.exports: any;
+}
+
+declare module 'jest-expo/src/setup' {
+  declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'jest-expo/src/createMockConstants.js' {
+  declare module.exports: $Exports<'jest-expo/src/createMockConstants'>;
+}
+declare module 'jest-expo/src/expoModules.js' {
+  declare module.exports: $Exports<'jest-expo/src/expoModules'>;
+}
+declare module 'jest-expo/src/setup.js' {
+  declare module.exports: $Exports<'jest-expo/src/setup'>;
+}

+ 584 - 0
HUILIAOAPP/flow-typed/npm/jest_v21.x.x.js

@@ -0,0 +1,584 @@
+// flow-typed signature: 107cf7068b8835594e97f938e8848244
+// flow-typed version: 8b4dd96654/jest_v21.x.x/flow_>=v0.39.x
+
+type JestMockFn<TArguments: $ReadOnlyArray<*>, TReturn> = {
+  (...args: TArguments): TReturn,
+  /**
+   * An object for introspecting mock calls
+   */
+  mock: {
+    /**
+     * An array that represents all calls that have been made into this mock
+     * function. Each call is represented by an array of arguments that were
+     * passed during the call.
+     */
+    calls: Array<TArguments>,
+    /**
+     * An array that contains all the object instances that have been
+     * instantiated from this mock function.
+     */
+    instances: Array<TReturn>
+  },
+  /**
+   * Resets all information stored in the mockFn.mock.calls and
+   * mockFn.mock.instances arrays. Often this is useful when you want to clean
+   * up a mock's usage data between two assertions.
+   */
+  mockClear(): void,
+  /**
+   * Resets all information stored in the mock. This is useful when you want to
+   * completely restore a mock back to its initial state.
+   */
+  mockReset(): void,
+  /**
+   * Removes the mock and restores the initial implementation. This is useful
+   * when you want to mock functions in certain test cases and restore the
+   * original implementation in others. Beware that mockFn.mockRestore only
+   * works when mock was created with jest.spyOn. Thus you have to take care of
+   * restoration yourself when manually assigning jest.fn().
+   */
+  mockRestore(): void,
+  /**
+   * Accepts a function that should be used as the implementation of the mock.
+   * The mock itself will still record all calls that go into and instances
+   * that come from itself -- the only difference is that the implementation
+   * will also be executed when the mock is called.
+   */
+  mockImplementation(
+    fn: (...args: TArguments) => TReturn
+  ): JestMockFn<TArguments, TReturn>,
+  /**
+   * Accepts a function that will be used as an implementation of the mock for
+   * one call to the mocked function. Can be chained so that multiple function
+   * calls produce different results.
+   */
+  mockImplementationOnce(
+    fn: (...args: TArguments) => TReturn
+  ): JestMockFn<TArguments, TReturn>,
+  /**
+   * Just a simple sugar function for returning `this`
+   */
+  mockReturnThis(): void,
+  /**
+   * Deprecated: use jest.fn(() => value) instead
+   */
+  mockReturnValue(value: TReturn): JestMockFn<TArguments, TReturn>,
+  /**
+   * Sugar for only returning a value once inside your mock
+   */
+  mockReturnValueOnce(value: TReturn): JestMockFn<TArguments, TReturn>
+};
+
+type JestAsymmetricEqualityType = {
+  /**
+   * A custom Jasmine equality tester
+   */
+  asymmetricMatch(value: mixed): boolean
+};
+
+type JestCallsType = {
+  allArgs(): mixed,
+  all(): mixed,
+  any(): boolean,
+  count(): number,
+  first(): mixed,
+  mostRecent(): mixed,
+  reset(): void
+};
+
+type JestClockType = {
+  install(): void,
+  mockDate(date: Date): void,
+  tick(milliseconds?: number): void,
+  uninstall(): void
+};
+
+type JestMatcherResult = {
+  message?: string | (() => string),
+  pass: boolean
+};
+
+type JestMatcher = (actual: any, expected: any) => JestMatcherResult;
+
+type JestPromiseType = {
+  /**
+   * Use rejects to unwrap the reason of a rejected promise so any other
+   * matcher can be chained. If the promise is fulfilled the assertion fails.
+   */
+  rejects: JestExpectType,
+  /**
+   * Use resolves to unwrap the value of a fulfilled promise so any other
+   * matcher can be chained. If the promise is rejected the assertion fails.
+   */
+  resolves: JestExpectType
+};
+
+/**
+ *  Plugin: jest-enzyme
+ */
+type EnzymeMatchersType = {
+  toBeChecked(): void,
+  toBeDisabled(): void,
+  toBeEmpty(): void,
+  toBePresent(): void,
+  toContainReact(element: React$Element<any>): void,
+  toHaveClassName(className: string): void,
+  toHaveHTML(html: string): void,
+  toHaveProp(propKey: string, propValue?: any): void,
+  toHaveRef(refName: string): void,
+  toHaveState(stateKey: string, stateValue?: any): void,
+  toHaveStyle(styleKey: string, styleValue?: any): void,
+  toHaveTagName(tagName: string): void,
+  toHaveText(text: string): void,
+  toIncludeText(text: string): void,
+  toHaveValue(value: any): void,
+  toMatchElement(element: React$Element<any>): void,
+  toMatchSelector(selector: string): void
+};
+
+type JestExpectType = {
+  not: JestExpectType & EnzymeMatchersType,
+  /**
+   * If you have a mock function, you can use .lastCalledWith to test what
+   * arguments it was last called with.
+   */
+  lastCalledWith(...args: Array<any>): void,
+  /**
+   * toBe just checks that a value is what you expect. It uses === to check
+   * strict equality.
+   */
+  toBe(value: any): void,
+  /**
+   * Use .toHaveBeenCalled to ensure that a mock function got called.
+   */
+  toBeCalled(): void,
+  /**
+   * Use .toBeCalledWith to ensure that a mock function was called with
+   * specific arguments.
+   */
+  toBeCalledWith(...args: Array<any>): void,
+  /**
+   * Using exact equality with floating point numbers is a bad idea. Rounding
+   * means that intuitive things fail.
+   */
+  toBeCloseTo(num: number, delta: any): void,
+  /**
+   * Use .toBeDefined to check that a variable is not undefined.
+   */
+  toBeDefined(): void,
+  /**
+   * Use .toBeFalsy when you don't care what a value is, you just want to
+   * ensure a value is false in a boolean context.
+   */
+  toBeFalsy(): void,
+  /**
+   * To compare floating point numbers, you can use toBeGreaterThan.
+   */
+  toBeGreaterThan(number: number): void,
+  /**
+   * To compare floating point numbers, you can use toBeGreaterThanOrEqual.
+   */
+  toBeGreaterThanOrEqual(number: number): void,
+  /**
+   * To compare floating point numbers, you can use toBeLessThan.
+   */
+  toBeLessThan(number: number): void,
+  /**
+   * To compare floating point numbers, you can use toBeLessThanOrEqual.
+   */
+  toBeLessThanOrEqual(number: number): void,
+  /**
+   * Use .toBeInstanceOf(Class) to check that an object is an instance of a
+   * class.
+   */
+  toBeInstanceOf(cls: Class<*>): void,
+  /**
+   * .toBeNull() is the same as .toBe(null) but the error messages are a bit
+   * nicer.
+   */
+  toBeNull(): void,
+  /**
+   * Use .toBeTruthy when you don't care what a value is, you just want to
+   * ensure a value is true in a boolean context.
+   */
+  toBeTruthy(): void,
+  /**
+   * Use .toBeUndefined to check that a variable is undefined.
+   */
+  toBeUndefined(): void,
+  /**
+   * Use .toContain when you want to check that an item is in a list. For
+   * testing the items in the list, this uses ===, a strict equality check.
+   */
+  toContain(item: any): void,
+  /**
+   * Use .toContainEqual when you want to check that an item is in a list. For
+   * testing the items in the list, this matcher recursively checks the
+   * equality of all fields, rather than checking for object identity.
+   */
+  toContainEqual(item: any): void,
+  /**
+   * Use .toEqual when you want to check that two objects have the same value.
+   * This matcher recursively checks the equality of all fields, rather than
+   * checking for object identity.
+   */
+  toEqual(value: any): void,
+  /**
+   * Use .toHaveBeenCalled to ensure that a mock function got called.
+   */
+  toHaveBeenCalled(): void,
+  /**
+   * Use .toHaveBeenCalledTimes to ensure that a mock function got called exact
+   * number of times.
+   */
+  toHaveBeenCalledTimes(number: number): void,
+  /**
+   * Use .toHaveBeenCalledWith to ensure that a mock function was called with
+   * specific arguments.
+   */
+  toHaveBeenCalledWith(...args: Array<any>): void,
+  /**
+   * Use .toHaveBeenLastCalledWith to ensure that a mock function was last called
+   * with specific arguments.
+   */
+  toHaveBeenLastCalledWith(...args: Array<any>): void,
+  /**
+   * Check that an object has a .length property and it is set to a certain
+   * numeric value.
+   */
+  toHaveLength(number: number): void,
+  /**
+   *
+   */
+  toHaveProperty(propPath: string, value?: any): void,
+  /**
+   * Use .toMatch to check that a string matches a regular expression or string.
+   */
+  toMatch(regexpOrString: RegExp | string): void,
+  /**
+   * Use .toMatchObject to check that a javascript object matches a subset of the properties of an object.
+   */
+  toMatchObject(object: Object | Array<Object>): void,
+  /**
+   * This ensures that a React component matches the most recent snapshot.
+   */
+  toMatchSnapshot(name?: string): void,
+  /**
+   * Use .toThrow to test that a function throws when it is called.
+   * If you want to test that a specific error gets thrown, you can provide an
+   * argument to toThrow. The argument can be a string for the error message,
+   * a class for the error, or a regex that should match the error.
+   *
+   * Alias: .toThrowError
+   */
+  toThrow(message?: string | Error | Class<Error> | RegExp): void,
+  toThrowError(message?: string | Error | Class<Error> | RegExp): void,
+  /**
+   * Use .toThrowErrorMatchingSnapshot to test that a function throws a error
+   * matching the most recent snapshot when it is called.
+   */
+  toThrowErrorMatchingSnapshot(): void
+};
+
+type JestObjectType = {
+  /**
+   *  Disables automatic mocking in the module loader.
+   *
+   *  After this method is called, all `require()`s will return the real
+   *  versions of each module (rather than a mocked version).
+   */
+  disableAutomock(): JestObjectType,
+  /**
+   * An un-hoisted version of disableAutomock
+   */
+  autoMockOff(): JestObjectType,
+  /**
+   * Enables automatic mocking in the module loader.
+   */
+  enableAutomock(): JestObjectType,
+  /**
+   * An un-hoisted version of enableAutomock
+   */
+  autoMockOn(): JestObjectType,
+  /**
+   * Clears the mock.calls and mock.instances properties of all mocks.
+   * Equivalent to calling .mockClear() on every mocked function.
+   */
+  clearAllMocks(): JestObjectType,
+  /**
+   * Resets the state of all mocks. Equivalent to calling .mockReset() on every
+   * mocked function.
+   */
+  resetAllMocks(): JestObjectType,
+  /**
+   * Removes any pending timers from the timer system.
+   */
+  clearAllTimers(): void,
+  /**
+   * The same as `mock` but not moved to the top of the expectation by
+   * babel-jest.
+   */
+  doMock(moduleName: string, moduleFactory?: any): JestObjectType,
+  /**
+   * The same as `unmock` but not moved to the top of the expectation by
+   * babel-jest.
+   */
+  dontMock(moduleName: string): JestObjectType,
+  /**
+   * Returns a new, unused mock function. Optionally takes a mock
+   * implementation.
+   */
+  fn<TArguments: $ReadOnlyArray<*>, TReturn>(
+    implementation?: (...args: TArguments) => TReturn
+  ): JestMockFn<TArguments, TReturn>,
+  /**
+   * Determines if the given function is a mocked function.
+   */
+  isMockFunction(fn: Function): boolean,
+  /**
+   * Given the name of a module, use the automatic mocking system to generate a
+   * mocked version of the module for you.
+   */
+  genMockFromModule(moduleName: string): any,
+  /**
+   * Mocks a module with an auto-mocked version when it is being required.
+   *
+   * The second argument can be used to specify an explicit module factory that
+   * is being run instead of using Jest's automocking feature.
+   *
+   * The third argument can be used to create virtual mocks -- mocks of modules
+   * that don't exist anywhere in the system.
+   */
+  mock(
+    moduleName: string,
+    moduleFactory?: any,
+    options?: Object
+  ): JestObjectType,
+  /**
+   * Returns the actual module instead of a mock, bypassing all checks on
+   * whether the module should receive a mock implementation or not.
+   */
+  requireActual(moduleName: string): any,
+  /**
+   * Returns a mock module instead of the actual module, bypassing all checks
+   * on whether the module should be required normally or not.
+   */
+  requireMock(moduleName: string): any,
+  /**
+   * Resets the module registry - the cache of all required modules. This is
+   * useful to isolate modules where local state might conflict between tests.
+   */
+  resetModules(): JestObjectType,
+  /**
+   * Exhausts the micro-task queue (usually interfaced in node via
+   * process.nextTick).
+   */
+  runAllTicks(): void,
+  /**
+   * Exhausts the macro-task queue (i.e., all tasks queued by setTimeout(),
+   * setInterval(), and setImmediate()).
+   */
+  runAllTimers(): void,
+  /**
+   * Exhausts all tasks queued by setImmediate().
+   */
+  runAllImmediates(): void,
+  /**
+   * Executes only the macro task queue (i.e. all tasks queued by setTimeout()
+   * or setInterval() and setImmediate()).
+   */
+  runTimersToTime(msToRun: number): void,
+  /**
+   * Executes only the macro-tasks that are currently pending (i.e., only the
+   * tasks that have been queued by setTimeout() or setInterval() up to this
+   * point)
+   */
+  runOnlyPendingTimers(): void,
+  /**
+   * Explicitly supplies the mock object that the module system should return
+   * for the specified module. Note: It is recommended to use jest.mock()
+   * instead.
+   */
+  setMock(moduleName: string, moduleExports: any): JestObjectType,
+  /**
+   * Indicates that the module system should never return a mocked version of
+   * the specified module from require() (e.g. that it should always return the
+   * real module).
+   */
+  unmock(moduleName: string): JestObjectType,
+  /**
+   * Instructs Jest to use fake versions of the standard timer functions
+   * (setTimeout, setInterval, clearTimeout, clearInterval, nextTick,
+   * setImmediate and clearImmediate).
+   */
+  useFakeTimers(): JestObjectType,
+  /**
+   * Instructs Jest to use the real versions of the standard timer functions.
+   */
+  useRealTimers(): JestObjectType,
+  /**
+   * Creates a mock function similar to jest.fn but also tracks calls to
+   * object[methodName].
+   */
+  spyOn(object: Object, methodName: string): JestMockFn<any, any>,
+  /**
+   * Set the default timeout interval for tests and before/after hooks in milliseconds.
+   * Note: The default timeout interval is 5 seconds if this method is not called.
+   */
+  setTimeout(timeout: number): JestObjectType
+};
+
+type JestSpyType = {
+  calls: JestCallsType
+};
+
+/** Runs this function after every test inside this context */
+declare function afterEach(
+  fn: (done: () => void) => ?Promise<mixed>,
+  timeout?: number
+): void;
+/** Runs this function before every test inside this context */
+declare function beforeEach(
+  fn: (done: () => void) => ?Promise<mixed>,
+  timeout?: number
+): void;
+/** Runs this function after all tests have finished inside this context */
+declare function afterAll(
+  fn: (done: () => void) => ?Promise<mixed>,
+  timeout?: number
+): void;
+/** Runs this function before any tests have started inside this context */
+declare function beforeAll(
+  fn: (done: () => void) => ?Promise<mixed>,
+  timeout?: number
+): void;
+
+/** A context for grouping tests together */
+declare var describe: {
+  /**
+   * Creates a block that groups together several related tests in one "test suite"
+   */
+  (name: string, fn: () => void): void,
+
+  /**
+   * Only run this describe block
+   */
+  only(name: string, fn: () => void): void,
+
+  /**
+   * Skip running this describe block
+   */
+  skip(name: string, fn: () => void): void
+};
+
+/** An individual test unit */
+declare var it: {
+  /**
+   * An individual test unit
+   *
+   * @param {string} Name of Test
+   * @param {Function} Test
+   * @param {number} Timeout for the test, in milliseconds.
+   */
+  (
+    name: string,
+    fn?: (done: () => void) => ?Promise<mixed>,
+    timeout?: number
+  ): void,
+  /**
+   * Only run this test
+   *
+   * @param {string} Name of Test
+   * @param {Function} Test
+   * @param {number} Timeout for the test, in milliseconds.
+   */
+  only(
+    name: string,
+    fn?: (done: () => void) => ?Promise<mixed>,
+    timeout?: number
+  ): void,
+  /**
+   * Skip running this test
+   *
+   * @param {string} Name of Test
+   * @param {Function} Test
+   * @param {number} Timeout for the test, in milliseconds.
+   */
+  skip(
+    name: string,
+    fn?: (done: () => void) => ?Promise<mixed>,
+    timeout?: number
+  ): void,
+  /**
+   * Run the test concurrently
+   *
+   * @param {string} Name of Test
+   * @param {Function} Test
+   * @param {number} Timeout for the test, in milliseconds.
+   */
+  concurrent(
+    name: string,
+    fn?: (done: () => void) => ?Promise<mixed>,
+    timeout?: number
+  ): void
+};
+declare function fit(
+  name: string,
+  fn: (done: () => void) => ?Promise<mixed>,
+  timeout?: number
+): void;
+/** An individual test unit */
+declare var test: typeof it;
+/** A disabled group of tests */
+declare var xdescribe: typeof describe;
+/** A focused group of tests */
+declare var fdescribe: typeof describe;
+/** A disabled individual test */
+declare var xit: typeof it;
+/** A disabled individual test */
+declare var xtest: typeof it;
+
+/** The expect function is used every time you want to test a value */
+declare var expect: {
+  /** The object that you want to make assertions against */
+  (value: any): JestExpectType & JestPromiseType & EnzymeMatchersType,
+  /** Add additional Jasmine matchers to Jest's roster */
+  extend(matchers: { [name: string]: JestMatcher }): void,
+  /** Add a module that formats application-specific data structures. */
+  addSnapshotSerializer(serializer: (input: Object) => string): void,
+  assertions(expectedAssertions: number): void,
+  hasAssertions(): void,
+  any(value: mixed): JestAsymmetricEqualityType,
+  anything(): void,
+  arrayContaining(value: Array<mixed>): void,
+  objectContaining(value: Object): void,
+  /** Matches any received string that contains the exact expected string. */
+  stringContaining(value: string): void,
+  stringMatching(value: string | RegExp): void
+};
+
+// TODO handle return type
+// http://jasmine.github.io/2.4/introduction.html#section-Spies
+declare function spyOn(value: mixed, method: string): Object;
+
+/** Holds all functions related to manipulating test runner */
+declare var jest: JestObjectType;
+
+/**
+ * The global Jasmine object, this is generally not exposed as the public API,
+ * using features inside here could break in later versions of Jest.
+ */
+declare var jasmine: {
+  DEFAULT_TIMEOUT_INTERVAL: number,
+  any(value: mixed): JestAsymmetricEqualityType,
+  anything(): void,
+  arrayContaining(value: Array<mixed>): void,
+  clock(): JestClockType,
+  createSpy(name: string): JestSpyType,
+  createSpyObj(
+    baseName: string,
+    methodNames: Array<string>
+  ): { [methodName: string]: JestSpyType },
+  objectContaining(value: Object): void,
+  stringMatching(value: string): void
+};

+ 39 - 0
HUILIAOAPP/flow-typed/npm/jest_vx.x.x.js

@@ -0,0 +1,39 @@
+// flow-typed signature: 3ba80f288ae054d394dca2d025d14dd9
+// flow-typed version: <<STUB>>/jest_v^21.0.1/flow_v0.53.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ *   'jest'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'jest' {
+  declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'jest/bin/jest' {
+  declare module.exports: any;
+}
+
+declare module 'jest/build/jest' {
+  declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'jest/bin/jest.js' {
+  declare module.exports: $Exports<'jest/bin/jest'>;
+}
+declare module 'jest/build/jest.js' {
+  declare module.exports: $Exports<'jest/build/jest'>;
+}

+ 33 - 0
HUILIAOAPP/flow-typed/npm/react-addons-test-utils_vx.x.x.js

@@ -0,0 +1,33 @@
+// flow-typed signature: fe3ce80849031f84c8c106122bef896a
+// flow-typed version: <<STUB>>/react-addons-test-utils_v16.0.0-alpha.3/flow_v0.53.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ *   'react-addons-test-utils'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'react-addons-test-utils' {
+  declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+
+
+// Filename aliases
+declare module 'react-addons-test-utils/index' {
+  declare module.exports: $Exports<'react-addons-test-utils'>;
+}
+declare module 'react-addons-test-utils/index.js' {
+  declare module.exports: $Exports<'react-addons-test-utils'>;
+}

+ 123 - 0
HUILIAOAPP/flow-typed/npm/react-native-scripts_vx.x.x.js

@@ -0,0 +1,123 @@
+// flow-typed signature: 42d8cd2e84e894c09d28f891fef9f01d
+// flow-typed version: <<STUB>>/react-native-scripts_v^1.5.0/flow_v0.61.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ *   'react-native-scripts'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'react-native-scripts' {
+  declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'react-native-scripts/build/bin/crna-entry' {
+  declare module.exports: any;
+}
+
+declare module 'react-native-scripts/build/bin/react-native-scripts' {
+  declare module.exports: any;
+}
+
+declare module 'react-native-scripts/build/scripts/android' {
+  declare module.exports: any;
+}
+
+declare module 'react-native-scripts/build/scripts/eject' {
+  declare module.exports: any;
+}
+
+declare module 'react-native-scripts/build/scripts/init' {
+  declare module.exports: any;
+}
+
+declare module 'react-native-scripts/build/scripts/ios' {
+  declare module.exports: any;
+}
+
+declare module 'react-native-scripts/build/scripts/start' {
+  declare module.exports: any;
+}
+
+declare module 'react-native-scripts/build/util/clearConsole' {
+  declare module.exports: any;
+}
+
+declare module 'react-native-scripts/build/util/expo' {
+  declare module.exports: any;
+}
+
+declare module 'react-native-scripts/build/util/install' {
+  declare module.exports: any;
+}
+
+declare module 'react-native-scripts/build/util/log' {
+  declare module.exports: any;
+}
+
+declare module 'react-native-scripts/build/util/packager' {
+  declare module.exports: any;
+}
+
+declare module 'react-native-scripts/template/App' {
+  declare module.exports: any;
+}
+
+declare module 'react-native-scripts/template/App.test' {
+  declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'react-native-scripts/build/bin/crna-entry.js' {
+  declare module.exports: $Exports<'react-native-scripts/build/bin/crna-entry'>;
+}
+declare module 'react-native-scripts/build/bin/react-native-scripts.js' {
+  declare module.exports: $Exports<'react-native-scripts/build/bin/react-native-scripts'>;
+}
+declare module 'react-native-scripts/build/scripts/android.js' {
+  declare module.exports: $Exports<'react-native-scripts/build/scripts/android'>;
+}
+declare module 'react-native-scripts/build/scripts/eject.js' {
+  declare module.exports: $Exports<'react-native-scripts/build/scripts/eject'>;
+}
+declare module 'react-native-scripts/build/scripts/init.js' {
+  declare module.exports: $Exports<'react-native-scripts/build/scripts/init'>;
+}
+declare module 'react-native-scripts/build/scripts/ios.js' {
+  declare module.exports: $Exports<'react-native-scripts/build/scripts/ios'>;
+}
+declare module 'react-native-scripts/build/scripts/start.js' {
+  declare module.exports: $Exports<'react-native-scripts/build/scripts/start'>;
+}
+declare module 'react-native-scripts/build/util/clearConsole.js' {
+  declare module.exports: $Exports<'react-native-scripts/build/util/clearConsole'>;
+}
+declare module 'react-native-scripts/build/util/expo.js' {
+  declare module.exports: $Exports<'react-native-scripts/build/util/expo'>;
+}
+declare module 'react-native-scripts/build/util/install.js' {
+  declare module.exports: $Exports<'react-native-scripts/build/util/install'>;
+}
+declare module 'react-native-scripts/build/util/log.js' {
+  declare module.exports: $Exports<'react-native-scripts/build/util/log'>;
+}
+declare module 'react-native-scripts/build/util/packager.js' {
+  declare module.exports: $Exports<'react-native-scripts/build/util/packager'>;
+}
+declare module 'react-native-scripts/template/App.js' {
+  declare module.exports: $Exports<'react-native-scripts/template/App'>;
+}
+declare module 'react-native-scripts/template/App.test.js' {
+  declare module.exports: $Exports<'react-native-scripts/template/App.test'>;
+}

File diff suppressed because it is too large
+ 7663 - 0
HUILIAOAPP/flow-typed/npm/react-native_vx.x.x.js


+ 62 - 0
HUILIAOAPP/flow-typed/npm/react-test-renderer_v16.x.x.js

@@ -0,0 +1,62 @@
+// flow-typed signature: 2d946f2ec4aba5210b19d053c411a59d
+// flow-typed version: 95b3e05165/react-test-renderer_v16.x.x/flow_>=v0.47.x
+
+// Type definitions for react-test-renderer 16.x.x
+// Ported from: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/react-test-renderer
+
+type ReactTestRendererJSON = {
+  type: string,
+  props: { [propName: string]: any },
+  children: null | ReactTestRendererJSON[]
+};
+
+type ReactTestRendererTree = ReactTestRendererJSON & {
+  nodeType: "component" | "host",
+  instance: any,
+  rendered: null | ReactTestRendererTree
+};
+
+type ReactTestInstance = {
+  instance: any,
+  type: string,
+  props: { [propName: string]: any },
+  parent: null | ReactTestInstance,
+  children: Array<ReactTestInstance | string>,
+
+  find(predicate: (node: ReactTestInstance) => boolean): ReactTestInstance,
+  findByType(type: React$ElementType): ReactTestInstance,
+  findByProps(props: { [propName: string]: any }): ReactTestInstance,
+
+  findAll(
+    predicate: (node: ReactTestInstance) => boolean,
+    options?: { deep: boolean }
+  ): ReactTestInstance[],
+  findAllByType(
+    type: React$ElementType,
+    options?: { deep: boolean }
+  ): ReactTestInstance[],
+  findAllByProps(
+    props: { [propName: string]: any },
+    options?: { deep: boolean }
+  ): ReactTestInstance[]
+};
+
+type ReactTestRenderer = {
+  toJSON(): null | ReactTestRendererJSON,
+  toTree(): null | ReactTestRendererTree,
+  unmount(nextElement?: React$Element<any>): void,
+  update(nextElement: React$Element<any>): void,
+  getInstance(): null | ReactTestInstance,
+  root: ReactTestInstance
+};
+
+type TestRendererOptions = {
+  createNodeMock(element: React$Element<any>): any
+};
+
+declare module "react-test-renderer" {
+  declare function create(
+    nextElement: React$Element<any>,
+    options?: TestRendererOptions
+  ): ReactTestRenderer;
+}

+ 66 - 0
HUILIAOAPP/flow-typed/npm/react-test-renderer_vx.x.x.js

@@ -0,0 +1,66 @@
+// flow-typed signature: bc77d9125cee5869fd1f9ffe55231e21
+// flow-typed version: <<STUB>>/react-test-renderer_v16.0.0-alpha.12/flow_v0.53.0
+
+/**
+ * This is an autogenerated libdef stub for:
+ *
+ *   'react-test-renderer'
+ *
+ * Fill this stub out by replacing all the `any` types.
+ *
+ * Once filled out, we encourage you to share your work with the
+ * community by sending a pull request to:
+ * https://github.com/flowtype/flow-typed
+ */
+
+declare module 'react-test-renderer' {
+  declare module.exports: any;
+}
+
+/**
+ * We include stubs for each file inside this npm package in case you need to
+ * require those files directly. Feel free to delete any files that aren't
+ * needed.
+ */
+declare module 'react-test-renderer/cjs/react-test-renderer-shallow.development' {
+  declare module.exports: any;
+}
+
+declare module 'react-test-renderer/cjs/react-test-renderer-stack.development' {
+  declare module.exports: any;
+}
+
+declare module 'react-test-renderer/cjs/react-test-renderer.development' {
+  declare module.exports: any;
+}
+
+declare module 'react-test-renderer/shallow' {
+  declare module.exports: any;
+}
+
+declare module 'react-test-renderer/stack' {
+  declare module.exports: any;
+}
+
+// Filename aliases
+declare module 'react-test-renderer/cjs/react-test-renderer-shallow.development.js' {
+  declare module.exports: $Exports<'react-test-renderer/cjs/react-test-renderer-shallow.development'>;
+}
+declare module 'react-test-renderer/cjs/react-test-renderer-stack.development.js' {
+  declare module.exports: $Exports<'react-test-renderer/cjs/react-test-renderer-stack.development'>;
+}
+declare module 'react-test-renderer/cjs/react-test-renderer.development.js' {
+  declare module.exports: $Exports<'react-test-renderer/cjs/react-test-renderer.development'>;
+}
+declare module 'react-test-renderer/index' {
+  declare module.exports: $Exports<'react-test-renderer'>;
+}
+declare module 'react-test-renderer/index.js' {
+  declare module.exports: $Exports<'react-test-renderer'>;
+}
+declare module 'react-test-renderer/shallow.js' {
+  declare module.exports: $Exports<'react-test-renderer/shallow'>;
+}
+declare module 'react-test-renderer/stack.js' {
+  declare module.exports: $Exports<'react-test-renderer/stack'>;
+}

+ 8 - 0
HUILIAOAPP/index.js

@@ -0,0 +1,8 @@
+/** @format */
+
+import {AppRegistry} from 'react-native';
+import App from './App';
+import {name as appName} from './app.json';
+
+
+AppRegistry.registerComponent(appName, () => App);

+ 54 - 0
HUILIAOAPP/ios/HUILIAOAPP-tvOS/Info.plist

@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>en</string>
+	<key>CFBundleExecutable</key>
+	<string>$(EXECUTABLE_NAME)</string>
+	<key>CFBundleIdentifier</key>
+	<string>org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>$(PRODUCT_NAME)</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1</string>
+	<key>LSRequiresIPhoneOS</key>
+	<true/>
+	<key>UILaunchStoryboardName</key>
+	<string>LaunchScreen</string>
+	<key>UIRequiredDeviceCapabilities</key>
+	<array>
+		<string>armv7</string>
+	</array>
+	<key>UISupportedInterfaceOrientations</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+	<key>UIViewControllerBasedStatusBarAppearance</key>
+	<false/>
+	<key>NSLocationWhenInUseUsageDescription</key>
+	<string></string>
+	<key>NSAppTransportSecurity</key>
+	<!--See http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/ -->
+	<dict>
+		<key>NSExceptionDomains</key>
+		<dict>
+			<key>localhost</key>
+			<dict>
+				<key>NSExceptionAllowsInsecureHTTPLoads</key>
+				<true/>
+			</dict>
+		</dict>
+	</dict>
+</dict>
+</plist>

+ 24 - 0
HUILIAOAPP/ios/HUILIAOAPP-tvOSTests/Info.plist

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>en</string>
+	<key>CFBundleExecutable</key>
+	<string>$(EXECUTABLE_NAME)</string>
+	<key>CFBundleIdentifier</key>
+	<string>org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>$(PRODUCT_NAME)</string>
+	<key>CFBundlePackageType</key>
+	<string>BNDL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1</string>
+</dict>
+</plist>

File diff suppressed because it is too large
+ 1468 - 0
HUILIAOAPP/ios/HUILIAOAPP.xcodeproj/project.pbxproj


+ 129 - 0
HUILIAOAPP/ios/HUILIAOAPP.xcodeproj/xcshareddata/xcschemes/HUILIAOAPP-tvOS.xcscheme

@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "0820"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "NO"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "2D2A28121D9B038B00D4039D"
+               BuildableName = "libReact.a"
+               BlueprintName = "React-tvOS"
+               ReferencedContainer = "container:../node_modules/react-native/React/React.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "2D02E47A1E0B4A5D006451C7"
+               BuildableName = "HUILIAOAPP-tvOS.app"
+               BlueprintName = "HUILIAOAPP-tvOS"
+               ReferencedContainer = "container:HUILIAOAPP.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "NO"
+            buildForArchiving = "NO"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "2D02E48F1E0B4A5D006451C7"
+               BuildableName = "HUILIAOAPP-tvOSTests.xctest"
+               BlueprintName = "HUILIAOAPP-tvOSTests"
+               ReferencedContainer = "container:HUILIAOAPP.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <Testables>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "2D02E48F1E0B4A5D006451C7"
+               BuildableName = "HUILIAOAPP-tvOSTests.xctest"
+               BlueprintName = "HUILIAOAPP-tvOSTests"
+               ReferencedContainer = "container:HUILIAOAPP.xcodeproj">
+            </BuildableReference>
+         </TestableReference>
+      </Testables>
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "2D02E47A1E0B4A5D006451C7"
+            BuildableName = "HUILIAOAPP-tvOS.app"
+            BlueprintName = "HUILIAOAPP-tvOS"
+            ReferencedContainer = "container:HUILIAOAPP.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "2D02E47A1E0B4A5D006451C7"
+            BuildableName = "HUILIAOAPP-tvOS.app"
+            BlueprintName = "HUILIAOAPP-tvOS"
+            ReferencedContainer = "container:HUILIAOAPP.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "2D02E47A1E0B4A5D006451C7"
+            BuildableName = "HUILIAOAPP-tvOS.app"
+            BlueprintName = "HUILIAOAPP-tvOS"
+            ReferencedContainer = "container:HUILIAOAPP.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>

+ 129 - 0
HUILIAOAPP/ios/HUILIAOAPP.xcodeproj/xcshareddata/xcschemes/HUILIAOAPP.xcscheme

@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "0620"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "NO"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "83CBBA2D1A601D0E00E9B192"
+               BuildableName = "libReact.a"
+               BlueprintName = "React"
+               ReferencedContainer = "container:../node_modules/react-native/React/React.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
+               BuildableName = "HUILIAOAPP.app"
+               BlueprintName = "HUILIAOAPP"
+               ReferencedContainer = "container:HUILIAOAPP.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "NO"
+            buildForArchiving = "NO"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "00E356ED1AD99517003FC87E"
+               BuildableName = "HUILIAOAPPTests.xctest"
+               BlueprintName = "HUILIAOAPPTests"
+               ReferencedContainer = "container:HUILIAOAPP.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <Testables>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "00E356ED1AD99517003FC87E"
+               BuildableName = "HUILIAOAPPTests.xctest"
+               BlueprintName = "HUILIAOAPPTests"
+               ReferencedContainer = "container:HUILIAOAPP.xcodeproj">
+            </BuildableReference>
+         </TestableReference>
+      </Testables>
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
+            BuildableName = "HUILIAOAPP.app"
+            BlueprintName = "HUILIAOAPP"
+            ReferencedContainer = "container:HUILIAOAPP.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
+            BuildableName = "HUILIAOAPP.app"
+            BlueprintName = "HUILIAOAPP"
+            ReferencedContainer = "container:HUILIAOAPP.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
+            BuildableName = "HUILIAOAPP.app"
+            BlueprintName = "HUILIAOAPP"
+            ReferencedContainer = "container:HUILIAOAPP.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>

+ 14 - 0
HUILIAOAPP/ios/HUILIAOAPP/AppDelegate.h

@@ -0,0 +1,14 @@
+/**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#import <UIKit/UIKit.h>
+
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
+
+@property (nonatomic, strong) UIWindow *window;
+
+@end

+ 35 - 0
HUILIAOAPP/ios/HUILIAOAPP/AppDelegate.m

@@ -0,0 +1,35 @@
+/**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#import "AppDelegate.h"
+
+#import <React/RCTBundleURLProvider.h>
+#import <React/RCTRootView.h>
+
+@implementation AppDelegate
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+  NSURL *jsCodeLocation;
+
+  jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
+
+  RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
+                                                      moduleName:@"HUILIAOAPP"
+                                               initialProperties:nil
+                                                   launchOptions:launchOptions];
+  rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
+
+  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
+  UIViewController *rootViewController = [UIViewController new];
+  rootViewController.view = rootView;
+  self.window.rootViewController = rootViewController;
+  [self.window makeKeyAndVisible];
+  return YES;
+}
+
+@end

+ 42 - 0
HUILIAOAPP/ios/HUILIAOAPP/Base.lproj/LaunchScreen.xib

@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7702" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/>
+        <capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB">
+            <rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Powered by React Native" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="8ie-xW-0ye">
+                    <rect key="frame" x="20" y="439" width="441" height="21"/>
+                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                    <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="HUILIAOAPP" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX">
+                    <rect key="frame" x="20" y="140" width="441" height="43"/>
+                    <fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
+                    <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+                    <nil key="highlightedColor"/>
+                </label>
+            </subviews>
+            <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+            <constraints>
+                <constraint firstItem="kId-c2-rCX" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="bottom" multiplier="1/3" constant="1" id="5cJ-9S-tgC"/>
+                <constraint firstAttribute="centerX" secondItem="kId-c2-rCX" secondAttribute="centerX" id="Koa-jz-hwk"/>
+                <constraint firstAttribute="bottom" secondItem="8ie-xW-0ye" secondAttribute="bottom" constant="20" id="Kzo-t9-V3l"/>
+                <constraint firstItem="8ie-xW-0ye" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="MfP-vx-nX0"/>
+                <constraint firstAttribute="centerX" secondItem="8ie-xW-0ye" secondAttribute="centerX" id="ZEH-qu-HZ9"/>
+                <constraint firstItem="kId-c2-rCX" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="fvb-Df-36g"/>
+            </constraints>
+            <nil key="simulatedStatusBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <point key="canvasLocation" x="548" y="455"/>
+        </view>
+    </objects>
+</document>

+ 38 - 0
HUILIAOAPP/ios/HUILIAOAPP/Images.xcassets/AppIcon.appiconset/Contents.json

@@ -0,0 +1,38 @@
+{
+  "images" : [
+    {
+      "idiom" : "iphone",
+      "size" : "29x29",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "29x29",
+      "scale" : "3x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "40x40",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "40x40",
+      "scale" : "3x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "60x60",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "60x60",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

+ 6 - 0
HUILIAOAPP/ios/HUILIAOAPP/Images.xcassets/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

+ 57 - 0
HUILIAOAPP/ios/HUILIAOAPP/Info.plist

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>en</string>
+	<key>CFBundleDisplayName</key>
+	<string>HUILIAOAPP</string>
+	<key>CFBundleExecutable</key>
+	<string>$(EXECUTABLE_NAME)</string>
+	<key>CFBundleIdentifier</key>
+	<string>org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>$(PRODUCT_NAME)</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1</string>
+	<key>LSRequiresIPhoneOS</key>
+	<true/>
+	<key>NSAppTransportSecurity</key>
+	<dict>
+		<key>NSAllowsArbitraryLoads</key>
+		<true/>
+		<key>NSExceptionDomains</key>
+		<dict>
+			<key>localhost</key>
+			<dict>
+				<key>NSExceptionAllowsInsecureHTTPLoads</key>
+				<true/>
+			</dict>
+		</dict>
+	</dict>
+	<key>NSLocationWhenInUseUsageDescription</key>
+	<string></string>
+	<key>UILaunchStoryboardName</key>
+	<string>LaunchScreen</string>
+	<key>UIRequiredDeviceCapabilities</key>
+	<array>
+		<string>armv7</string>
+	</array>
+	<key>UISupportedInterfaceOrientations</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+	<key>UIViewControllerBasedStatusBarAppearance</key>
+	<false/>
+</dict>
+</plist>

+ 16 - 0
HUILIAOAPP/ios/HUILIAOAPP/main.m

@@ -0,0 +1,16 @@
+/**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#import <UIKit/UIKit.h>
+
+#import "AppDelegate.h"
+
+int main(int argc, char * argv[]) {
+  @autoreleasepool {
+    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
+  }
+}

+ 68 - 0
HUILIAOAPP/ios/HUILIAOAPPTests/HUILIAOAPPTests.m

@@ -0,0 +1,68 @@
+/**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#import <UIKit/UIKit.h>
+#import <XCTest/XCTest.h>
+
+#import <React/RCTLog.h>
+#import <React/RCTRootView.h>
+
+#define TIMEOUT_SECONDS 600
+#define TEXT_TO_LOOK_FOR @"Welcome to React Native!"
+
+@interface HUILIAOAPPTests : XCTestCase
+
+@end
+
+@implementation HUILIAOAPPTests
+
+- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test
+{
+  if (test(view)) {
+    return YES;
+  }
+  for (UIView *subview in [view subviews]) {
+    if ([self findSubviewInView:subview matching:test]) {
+      return YES;
+    }
+  }
+  return NO;
+}
+
+- (void)testRendersWelcomeScreen
+{
+  UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController];
+  NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS];
+  BOOL foundElement = NO;
+
+  __block NSString *redboxError = nil;
+  RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) {
+    if (level >= RCTLogLevelError) {
+      redboxError = message;
+    }
+  });
+
+  while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) {
+    [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
+    [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
+
+    foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) {
+      if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) {
+        return YES;
+      }
+      return NO;
+    }];
+  }
+
+  RCTSetLogFunction(RCTDefaultLogFunction);
+
+  XCTAssertNil(redboxError, @"RedBox error: %@", redboxError);
+  XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS);
+}
+
+
+@end

+ 24 - 0
HUILIAOAPP/ios/HUILIAOAPPTests/Info.plist

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>en</string>
+	<key>CFBundleExecutable</key>
+	<string>$(EXECUTABLE_NAME)</string>
+	<key>CFBundleIdentifier</key>
+	<string>org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>$(PRODUCT_NAME)</string>
+	<key>CFBundlePackageType</key>
+	<string>BNDL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1</string>
+</dict>
+</plist>

+ 410 - 0
HUILIAOAPP/js/App.js

@@ -0,0 +1,410 @@
+/* @flow */
+
+import React from 'react';
+import { Asset, Constants, ScreenOrientation } from 'expo';
+
+ScreenOrientation.allow(ScreenOrientation.Orientation.ALL);
+
+import {
+  Animated,
+  Image,
+  Platform,
+  ScrollView,
+  StyleSheet,
+  TouchableOpacity,
+  Text,
+  StatusBar,
+  View,
+} from 'react-native';
+import { SafeAreaView, createStackNavigator } from 'react-navigation';
+
+import CustomTabs from './CustomTabs';
+import CustomTransitioner from './CustomTransitioner';
+import Drawer from './Drawer';
+import MultipleDrawer from './MultipleDrawer';
+import TabsInDrawer from './TabsInDrawer';
+import ModalStack from './ModalStack';
+import StacksInTabs from './StacksInTabs';
+import StacksOverTabs from './StacksOverTabs';
+import StacksOverTopTabs from './StacksOverTopTabs';
+import StacksWithKeys from './StacksWithKeys';
+import InactiveStack from './InactiveStack';
+import StackWithCustomHeaderBackImage from './StackWithCustomHeaderBackImage';
+import SimpleStack from './SimpleStack';
+import StackWithHeaderPreset from './StackWithHeaderPreset';
+import StackWithTranslucentHeader from './StackWithTranslucentHeader';
+import SimpleTabs from './SimpleTabs';
+import SwitchWithStacks from './SwitchWithStacks';
+import TabsWithNavigationFocus from './TabsWithNavigationFocus';
+import TabsWithNavigationEvents from './TabsWithNavigationEvents';
+import KeyboardHandlingExample from './KeyboardHandlingExample';
+
+const ExampleInfo = {
+  SimpleStack: {
+    name: 'Stack Example',
+    description: 'A card stack',
+  },
+  SwitchWithStacks: {
+    name: 'Switch between routes',
+    description: 'Jump between routes',
+  },
+  InactiveStack: {
+    name: 'Navigate idempotently to stacks in inactive routes',
+    description:
+      'An inactive route in a stack should be given the opportunity to handle actions',
+  },
+  StackWithCustomHeaderBackImage: {
+    name: 'Custom header back image',
+    description: 'Stack with custom header back image',
+  },
+  SimpleTabs: {
+    name: 'Tabs Example',
+    description: 'Tabs following platform conventions',
+  },
+  Drawer: {
+    name: 'Drawer Example',
+    description: 'Android-style drawer navigation',
+  },
+  StackWithHeaderPreset: {
+    name: 'UIKit-style Header Transitions',
+    description: 'Masked back button and sliding header items. iOS only.',
+  },
+  StackWithTranslucentHeader: {
+    name: 'Translucent Header',
+    description: 'Render arbitrary translucent content in header background.',
+  },
+  // MultipleDrawer: {
+  //   name: 'Multiple Drawer Example',
+  //   description: 'Add any drawer you need',
+  // },
+  TabsInDrawer: {
+    name: 'Drawer + Tabs Example',
+    description: 'A drawer combined with tabs',
+  },
+  CustomTabs: {
+    name: 'Custom Tabs',
+    description: 'Custom tabs with tab router',
+  },
+  CustomTransitioner: {
+    name: 'Custom Transitioner',
+    description: 'Custom transitioner with stack router',
+  },
+  ModalStack: {
+    name:
+      Platform.OS === 'ios'
+        ? 'Modal Stack Example'
+        : 'Stack with Dynamic Header',
+    description:
+      Platform.OS === 'ios'
+        ? 'Stack navigation with modals'
+        : 'Dynamically showing and hiding the header',
+  },
+  StacksInTabs: {
+    name: 'Stacks in Tabs',
+    description: 'Nested stack navigation in tabs',
+  },
+  StacksOverTabs: {
+    name: 'Stacks over Tabs',
+    description: 'Nested stack navigation that pushes on top of tabs',
+  },
+  StacksOverTopTabs: {
+    name: 'Stacks with non-standard header height',
+    description: 'Tab navigator in stack with custom header heights',
+  },
+  StacksWithKeys: {
+    name: 'Link in Stack with keys',
+    description: 'Use keys to link between screens',
+  },
+  LinkStack: {
+    name: 'Link in Stack',
+    description: 'Deep linking into a route in stack',
+  },
+  LinkTabs: {
+    name: 'Link to Settings Tab',
+    description: 'Deep linking into a route in tab',
+  },
+  TabsWithNavigationFocus: {
+    name: 'withNavigationFocus',
+    description: 'Receive the focus prop to know when a screen is focused',
+  },
+  TabsWithNavigationEvents: {
+    name: 'NavigationEvents',
+    description:
+      'Declarative NavigationEvents component to subscribe to navigation events',
+  },
+  KeyboardHandlingExample: {
+    name: 'Keyboard Handling Example',
+    description:
+      'Demo automatic handling of keyboard showing/hiding inside StackNavigator',
+  },
+};
+
+const ExampleRoutes = {
+  SimpleStack,
+  SwitchWithStacks,
+  SimpleTabs: SimpleTabs,
+  Drawer: Drawer,
+  // MultipleDrawer: {
+  //   screen: MultipleDrawer,
+  // },
+  StackWithCustomHeaderBackImage: StackWithCustomHeaderBackImage,
+  ...Platform.select({
+    ios: {
+      StackWithHeaderPreset: StackWithHeaderPreset,
+    },
+    android: {},
+  }),
+  StackWithTranslucentHeader: StackWithTranslucentHeader,
+  TabsInDrawer: TabsInDrawer,
+  CustomTabs: CustomTabs,
+  CustomTransitioner: CustomTransitioner,
+  ModalStack: ModalStack,
+  StacksWithKeys: StacksWithKeys,
+  StacksInTabs: StacksInTabs,
+  StacksOverTabs: StacksOverTabs,
+  StacksOverTopTabs: StacksOverTopTabs,
+  LinkStack: {
+    screen: SimpleStack,
+    path: 'people/Jordan',
+  },
+  LinkTabs: {
+    screen: SimpleTabs,
+    path: 'settings',
+  },
+  TabsWithNavigationFocus,
+  TabsWithNavigationEvents,
+  KeyboardHandlingExample,
+  // This is commented out because it's rarely useful
+  // InactiveStack,
+};
+
+type State = {
+  scrollY: Animated.Value,
+};
+class MainScreen extends React.Component<any, State> {
+  state = {
+    scrollY: new Animated.Value(0),
+  };
+
+  componentDidMount() {
+    Asset.fromModule(
+      require('react-navigation/src/views/assets/back-icon-mask.png')
+    ).downloadAsync();
+    Asset.fromModule(
+      require('react-navigation/src/views/assets/back-icon.png')
+    ).downloadAsync();
+  }
+
+  render() {
+    const { navigation } = this.props;
+
+    const scale = this.state.scrollY.interpolate({
+      inputRange: [-450, 0, 100],
+      outputRange: [2, 1, 0.8],
+      extrapolate: 'clamp',
+    });
+
+    const translateY = this.state.scrollY.interpolate({
+      inputRange: [-450, 0, 100],
+      outputRange: [-150, 0, 40],
+    });
+
+    const opacity = this.state.scrollY.interpolate({
+      inputRange: [0, 50],
+      outputRange: [1, 0],
+      extrapolate: 'clamp',
+    });
+
+    const underlayOpacity = this.state.scrollY.interpolate({
+      inputRange: [0, 50],
+      outputRange: [0, 1],
+      extrapolate: 'clamp',
+    });
+
+    const backgroundScale = this.state.scrollY.interpolate({
+      inputRange: [-450, 0],
+      outputRange: [3, 1],
+      extrapolate: 'clamp',
+    });
+
+    const backgroundTranslateY = this.state.scrollY.interpolate({
+      inputRange: [-450, 0],
+      outputRange: [0, 0],
+    });
+
+    return (
+      <View style={{ flex: 1 }}>
+        <Animated.ScrollView
+          style={{ flex: 1 }}
+          scrollEventThrottle={1}
+          onScroll={Animated.event(
+            [
+              {
+                nativeEvent: { contentOffset: { y: this.state.scrollY } },
+              },
+            ],
+            { useNativeDriver: true }
+          )}
+        >
+          <Animated.View
+            style={[
+              styles.backgroundUnderlay,
+              {
+                transform: [
+                  { scale: backgroundScale },
+                  { translateY: backgroundTranslateY },
+                ],
+              },
+            ]}
+          />
+          <Animated.View
+            style={{ opacity, transform: [{ scale }, { translateY }] }}
+          >
+            <SafeAreaView
+              style={styles.bannerContainer}
+              forceInset={{ top: 'always', bottom: 'never' }}
+            >
+              <View style={styles.banner}>
+                <Image
+                  source={require('./assets/NavLogo.png')}
+                  style={styles.bannerImage}
+                />
+                <Text style={styles.bannerTitle}>
+                  React Navigation Examples
+                </Text>
+              </View>
+            </SafeAreaView>
+          </Animated.View>
+
+          <SafeAreaView forceInset={{ bottom: 'always', horizontal: 'never' }}>
+            <View style={{ backgroundColor: '#fff' }}>
+              {Object.keys(ExampleRoutes).map((routeName: string) => (
+                <TouchableOpacity
+                  key={routeName}
+                  onPress={() => {
+                    let route = ExampleRoutes[routeName];
+                    if (route.screen || route.path || route.params) {
+                      const { path, params, screen } = route;
+                      const { router } = screen;
+                      const action =
+                        path && router.getActionForPathAndParams(path, params);
+                      navigation.navigate(routeName, {}, action);
+                    } else {
+                      navigation.navigate(routeName);
+                    }
+                  }}
+                >
+                  <SafeAreaView
+                    style={styles.itemContainer}
+                    forceInset={{ veritcal: 'never', bottom: 'never' }}
+                  >
+                    <View style={styles.item}>
+                      <Text style={styles.title}>
+                        {ExampleInfo[routeName].name}
+                      </Text>
+                      <Text style={styles.description}>
+                        {ExampleInfo[routeName].description}
+                      </Text>
+                    </View>
+                  </SafeAreaView>
+                </TouchableOpacity>
+              ))}
+            </View>
+          </SafeAreaView>
+        </Animated.ScrollView>
+        <StatusBar barStyle="light-content" />
+        <Animated.View
+          style={[styles.statusBarUnderlay, { opacity: underlayOpacity }]}
+        />
+      </View>
+    );
+  }
+}
+
+const AppNavigator = createStackNavigator(
+  {
+    ...ExampleRoutes,
+    Index: {
+      screen: MainScreen,
+    },
+  },
+  {
+    initialRouteName: 'Index',
+    headerMode: 'none',
+
+    /*
+   * Use modal on iOS because the card mode comes from the right,
+   * which conflicts with the drawer example gesture
+   */
+    mode: Platform.OS === 'ios' ? 'modal' : 'card',
+  }
+);
+
+export default AppNavigator;
+
+const styles = StyleSheet.create({
+  item: {
+    paddingHorizontal: 16,
+    paddingVertical: 12,
+  },
+  itemContainer: {
+    backgroundColor: '#fff',
+    borderBottomWidth: StyleSheet.hairlineWidth,
+    borderBottomColor: '#ddd',
+  },
+  image: {
+    width: 120,
+    height: 120,
+    alignSelf: 'center',
+    marginBottom: 20,
+    resizeMode: 'contain',
+  },
+  statusBarUnderlay: {
+    backgroundColor: '#673ab7',
+    position: 'absolute',
+    top: 0,
+    left: 0,
+    right: 0,
+    height: Constants.statusBarHeight,
+  },
+  title: {
+    fontSize: 16,
+    fontWeight: 'bold',
+    color: '#444',
+  },
+  description: {
+    fontSize: 13,
+    color: '#999',
+  },
+  backgroundUnderlay: {
+    backgroundColor: '#673ab7',
+    position: 'absolute',
+    top: -100,
+    height: 300,
+    left: 0,
+    right: 0,
+  },
+  bannerContainer: {
+    // backgroundColor: '#673ab7',
+    alignItems: 'center',
+  },
+  banner: {
+    flexDirection: 'row',
+    alignItems: 'center',
+    padding: 16,
+  },
+  bannerImage: {
+    width: 36,
+    height: 36,
+    resizeMode: 'contain',
+    tintColor: '#fff',
+    margin: 8,
+  },
+  bannerTitle: {
+    fontSize: 18,
+    fontWeight: '200',
+    color: '#fff',
+    marginVertical: 8,
+    marginRight: 5,
+  },
+});

+ 45 - 0
HUILIAOAPP/js/Banner.js

@@ -0,0 +1,45 @@
+/* @flow */
+
+import React from 'react';
+
+import { Image, Platform, StyleSheet, Text, View } from 'react-native';
+import { SafeAreaView } from 'react-navigation';
+
+const Banner = () => (
+  <SafeAreaView
+    style={styles.bannerContainer}
+    forceInset={{ top: 'always' }}
+  >
+    <View style={styles.banner}>
+      <Image source={require('./assets/NavLogo.png')} style={styles.image} />
+      <Text style={styles.title}>React Navigation Examples</Text>
+    </View>
+  </SafeAreaView>
+);
+
+export default Banner;
+
+const styles = StyleSheet.create({
+  bannerContainer: {
+    backgroundColor: '#673ab7',
+    paddingTop: 20,
+  },
+  banner: {
+    flexDirection: 'row',
+    alignItems: 'center',
+    padding: 16,
+  },
+  image: {
+    width: 36,
+    height: 36,
+    resizeMode: 'contain',
+    tintColor: '#fff',
+    margin: 8,
+  },
+  title: {
+    fontSize: 18,
+    fontWeight: '200',
+    color: '#fff',
+    margin: 8,
+  },
+});

+ 121 - 0
HUILIAOAPP/js/CustomTabs.js

@@ -0,0 +1,121 @@
+/**
+ * @flow
+ */
+
+import React from 'react';
+import {
+  Platform,
+  ScrollView,
+  StyleSheet,
+  StatusBar,
+  Text,
+  TouchableOpacity,
+  View,
+} from 'react-native';
+import {
+  createNavigator,
+  createNavigationContainer,
+  SafeAreaView,
+  TabRouter,
+} from 'react-navigation';
+import SampleText from './SampleText';
+import { Button } from './commonComponents/ButtonWithMargin';
+
+const MyNavScreen = ({ navigation, banner }) => (
+  <ScrollView>
+    <SafeAreaView forceInset={{ horizontal: 'always' }}>
+      <SampleText>{banner}</SampleText>
+      <Button
+        onPress={() => {
+          navigation.goBack(null);
+        }}
+        title="Go back"
+      />
+    </SafeAreaView>
+    <StatusBar barStyle="default" />
+  </ScrollView>
+);
+
+const MyHomeScreen = ({ navigation }) => (
+  <MyNavScreen banner="Home Screen" navigation={navigation} />
+);
+
+const MyNotificationsScreen = ({ navigation }) => (
+  <MyNavScreen banner="Notifications Screen" navigation={navigation} />
+);
+
+const MySettingsScreen = ({ navigation }) => (
+  <MyNavScreen banner="Settings Screen" navigation={navigation} />
+);
+
+const CustomTabBar = ({ navigation }) => {
+  const { routes } = navigation.state;
+  return (
+    <SafeAreaView style={styles.tabContainer}>
+      {routes.map(route => (
+        <TouchableOpacity
+          onPress={() => navigation.navigate(route.routeName)}
+          style={styles.tab}
+          key={route.routeName}
+        >
+          <Text>{route.routeName}</Text>
+        </TouchableOpacity>
+      ))}
+    </SafeAreaView>
+  );
+};
+
+const CustomTabView = ({ descriptors, navigation }) => {
+  const { routes, index } = navigation.state;
+  const descriptor = descriptors[routes[index].key];
+  const ActiveScreen = descriptor.getComponent();
+  return (
+    <SafeAreaView forceInset={{ top: 'always' }}>
+      <CustomTabBar navigation={navigation} />
+      <ActiveScreen navigation={descriptor.navigation} />
+    </SafeAreaView>
+  );
+};
+
+const CustomTabRouter = TabRouter(
+  {
+    Home: {
+      screen: MyHomeScreen,
+      path: '',
+    },
+    Notifications: {
+      screen: MyNotificationsScreen,
+      path: 'notifications',
+    },
+    Settings: {
+      screen: MySettingsScreen,
+      path: 'settings',
+    },
+  },
+  {
+    // Change this to start on a different tab
+    initialRouteName: 'Home',
+  }
+);
+
+const CustomTabs = createNavigationContainer(
+  createNavigator(CustomTabView, CustomTabRouter, {})
+);
+
+const styles = StyleSheet.create({
+  tabContainer: {
+    flexDirection: 'row',
+    height: 48,
+  },
+  tab: {
+    flex: 1,
+    alignItems: 'center',
+    justifyContent: 'center',
+    margin: 4,
+    borderWidth: 1,
+    borderColor: '#ddd',
+    borderRadius: 4,
+  },
+});
+
+export default CustomTabs;

+ 117 - 0
HUILIAOAPP/js/CustomTransitioner.js

@@ -0,0 +1,117 @@
+import React, { Component, PropTypes } from 'react';
+import {
+  Animated,
+  Easing,
+  Image,
+  Platform,
+  StatusBar,
+  StyleSheet,
+  View,
+} from 'react-native';
+import {
+  Transitioner,
+  SafeAreaView,
+  StackRouter,
+  createNavigationContainer,
+  createNavigator,
+} from 'react-navigation';
+import SampleText from './SampleText';
+import { Button } from './commonComponents/ButtonWithMargin';
+
+const MyNavScreen = ({ navigation, banner }) => (
+  <SafeAreaView forceInset={{ top: 'always' }}>
+    <SampleText>{banner}</SampleText>
+    {navigation.state &&
+      navigation.state.routeName !== 'Settings' && (
+        <Button
+          onPress={() => navigation.navigate('Settings')}
+          title="Go to a settings screen"
+        />
+      )}
+
+    <Button onPress={() => navigation.goBack(null)} title="Go back" />
+    <StatusBar barStyle="default" />
+  </SafeAreaView>
+);
+
+const MyHomeScreen = ({ navigation }) => (
+  <MyNavScreen banner="Home Screen" navigation={navigation} />
+);
+
+const MySettingsScreen = ({ navigation }) => (
+  <MyNavScreen banner="Settings Screen" navigation={navigation} />
+);
+
+class CustomNavigationView extends Component {
+  render() {
+    const { navigation, router, descriptors } = this.props;
+
+    return (
+      <Transitioner
+        configureTransition={this._configureTransition}
+        descriptors={descriptors}
+        navigation={navigation}
+        render={this._render}
+      />
+    );
+  }
+
+  _configureTransition(transitionProps, prevTransitionProps) {
+    return {
+      duration: 200,
+      easing: Easing.out(Easing.ease),
+    };
+  }
+
+  _render = (transitionProps, prevTransitionProps) => {
+    const scenes = transitionProps.scenes.map(scene =>
+      this._renderScene(transitionProps, scene)
+    );
+    return <View style={{ flex: 1 }}>{scenes}</View>;
+  };
+
+  _renderScene = (transitionProps, scene) => {
+    const { navigation, router } = this.props;
+    const { routes } = navigation.state;
+    const { position } = transitionProps;
+    const { index } = scene;
+
+    const animatedValue = position.interpolate({
+      inputRange: [index - 1, index, index + 1],
+      outputRange: [0, 1, 0],
+    });
+
+    const animation = {
+      opacity: animatedValue,
+      transform: [{ scale: animatedValue }],
+    };
+
+    const Scene = scene.descriptor.getComponent();
+    return (
+      <Animated.View key={index} style={[styles.view, animation]}>
+        <Scene navigation={scene.descriptor.navigation} />
+      </Animated.View>
+    );
+  };
+}
+
+const CustomRouter = StackRouter({
+  Home: { screen: MyHomeScreen },
+  Settings: { screen: MySettingsScreen },
+});
+
+const CustomTransitioner = createNavigationContainer(
+  createNavigator(CustomNavigationView, CustomRouter, {})
+);
+
+export default CustomTransitioner;
+
+const styles = StyleSheet.create({
+  view: {
+    position: 'absolute',
+    left: 0,
+    right: 0,
+    top: 0,
+    bottom: 0,
+  },
+});

+ 96 - 0
HUILIAOAPP/js/Drawer.js

@@ -0,0 +1,96 @@
+/**
+ * @flow
+ */
+
+import React from 'react';
+import { Platform, ScrollView, StatusBar } from 'react-native';
+import {
+  createStackNavigator,
+  createDrawerNavigator,
+  SafeAreaView,
+} from 'react-navigation';
+import MaterialIcons from 'react-native-vector-icons/MaterialIcons';
+import SampleText from './SampleText';
+import { Button } from './commonComponents/ButtonWithMargin';
+
+const MyNavScreen = ({ navigation, banner }) => (
+  <ScrollView>
+    <SafeAreaView forceInset={{ top: 'always' }}>
+      <SampleText>{banner}</SampleText>
+      <Button onPress={() => navigation.openDrawer()} title="Open drawer" />
+      <Button
+        onPress={() => navigation.navigate('Email')}
+        title="Open other screen"
+      />
+      <Button onPress={() => navigation.goBack(null)} title="Go back" />
+    </SafeAreaView>
+    <StatusBar barStyle="default" />
+  </ScrollView>
+);
+
+const InboxScreen = ({ navigation }) => (
+  <MyNavScreen banner={'Inbox Screen'} navigation={navigation} />
+);
+InboxScreen.navigationOptions = {
+  headerTitle: 'Inbox',
+};
+
+const EmailScreen = ({ navigation }) => (
+  <MyNavScreen banner={'Email Screen'} navigation={navigation} />
+);
+
+const DraftsScreen = ({ navigation }) => (
+  <MyNavScreen banner={'Drafts Screen'} navigation={navigation} />
+);
+DraftsScreen.navigationOptions = {
+  headerTitle: 'Drafts',
+};
+
+const InboxStack = createStackNavigator({
+  Inbox: { screen: InboxScreen },
+  Email: { screen: EmailScreen },
+});
+
+InboxStack.navigationOptions = {
+  drawerLabel: 'Inbox',
+  drawerIcon: ({ tintColor }) => (
+    <MaterialIcons
+      name="move-to-inbox"
+      size={24}
+      style={{ color: tintColor }}
+    />
+  ),
+};
+
+const DraftsStack = createStackNavigator({
+  Drafts: { screen: DraftsScreen },
+  Email: { screen: EmailScreen },
+});
+
+DraftsStack.navigationOptions = {
+  drawerLabel: 'Drafts',
+  drawerIcon: ({ tintColor }) => (
+    <MaterialIcons name="drafts" size={24} style={{ color: tintColor }} />
+  ),
+};
+
+const DrawerExample = createDrawerNavigator(
+  {
+    Inbox: {
+      path: '/',
+      screen: InboxStack,
+    },
+    Drafts: {
+      path: '/sent',
+      screen: DraftsStack,
+    },
+  },
+  {
+    initialRouteName: 'Drafts',
+    contentOptions: {
+      activeTintColor: '#e91e63',
+    },
+  }
+);
+
+export default DrawerExample;

+ 96 - 0
HUILIAOAPP/js/InactiveStack.js

@@ -0,0 +1,96 @@
+import React from 'react';
+import { Button, Text, StatusBar, View, StyleSheet } from 'react-native';
+import {
+  SafeAreaView,
+  createStackNavigator,
+  createSwitchNavigator,
+  NavigationActions,
+} from 'react-navigation';
+
+const runSubRoutes = navigation => {
+  navigation.dispatch(NavigationActions.navigate({ routeName: 'First2' }));
+  navigation.dispatch(NavigationActions.navigate({ routeName: 'Second2' }));
+  navigation.dispatch(NavigationActions.navigate({ routeName: 'First2' }));
+};
+
+const runSubRoutesWithIntermediate = navigation => {
+  navigation.dispatch(toFirst1);
+  navigation.dispatch(toSecond2);
+  navigation.dispatch(toFirst);
+  navigation.dispatch(toFirst2);
+};
+
+const runSubAction = navigation => {
+  navigation.dispatch(toFirst2);
+  navigation.dispatch(toSecond2);
+  navigation.dispatch(toFirstChild1);
+};
+
+const DummyScreen = ({ routeName, navigation, style }) => {
+  return (
+    <SafeAreaView
+      style={[
+        StyleSheet.absoluteFill,
+        {
+          alignItems: 'center',
+          justifyContent: 'center',
+          backgroundColor: 'white',
+        },
+        style,
+      ]}
+    >
+      <Text style={{ fontWeight: '800' }}>
+        {routeName}({navigation.state.key})
+      </Text>
+      <View>
+        <Button title="back" onPress={() => navigation.goBack()} />
+        <Button title="dismiss" onPress={() => navigation.dismiss()} />
+        <Button
+          title="between sub-routes"
+          onPress={() => runSubRoutes(navigation)}
+        />
+        <Button
+          title="between sub-routes (with intermediate)"
+          onPress={() => runSubRoutesWithIntermediate(navigation)}
+        />
+
+        <Button
+          title="with sub-action"
+          onPress={() => runSubAction(navigation)}
+        />
+      </View>
+      <StatusBar barStyle="default" />
+    </SafeAreaView>
+  );
+};
+
+const createDummyScreen = routeName => {
+  const BoundDummyScreen = props => DummyScreen({ ...props, routeName });
+  return BoundDummyScreen;
+};
+
+const toFirst = NavigationActions.navigate({ routeName: 'First' });
+const toFirst1 = NavigationActions.navigate({ routeName: 'First1' });
+const toFirst2 = NavigationActions.navigate({ routeName: 'First2' });
+const toSecond2 = NavigationActions.navigate({ routeName: 'Second2' });
+const toFirstChild1 = NavigationActions.navigate({
+  routeName: 'First',
+  action: NavigationActions.navigate({ routeName: 'First1' }),
+});
+
+export default createStackNavigator(
+  {
+    Other: createDummyScreen('Leaf'),
+    First: createStackNavigator({
+      First1: createDummyScreen('First1'),
+      First2: createDummyScreen('First2'),
+    }),
+    Second: createStackNavigator({
+      Second1: createDummyScreen('Second1'),
+      Second2: createDummyScreen('Second2'),
+    }),
+  },
+  {
+    headerMode: 'none',
+  }
+);

+ 63 - 0
HUILIAOAPP/js/KeyboardHandlingExample.js

@@ -0,0 +1,63 @@
+import React from 'react';
+import { StatusBar, View, TextInput, InteractionManager } from 'react-native';
+import { createStackNavigator, withNavigationFocus } from 'react-navigation';
+import { Button } from './commonComponents/ButtonWithMargin';
+
+class ScreenOne extends React.Component {
+  static navigationOptions = {
+    title: 'Home',
+  };
+
+  render() {
+    const { navigation } = this.props;
+    return (
+      <View style={{ paddingTop: 30 }}>
+        <Button
+          onPress={() => navigation.push('ScreenTwo')}
+          title="Push screen with focused text input"
+        />
+        <Button onPress={() => navigation.goBack(null)} title="Go Home" />
+        <StatusBar barStyle="default" />
+      </View>
+    );
+  }
+}
+
+class ScreenTwo extends React.Component {
+  static navigationOptions = ({ navigation }) => ({
+    title: navigation.getParam('inputValue', 'Screen w/ Input'),
+  });
+
+  componentDidMount() {
+    InteractionManager.runAfterInteractions(() => {
+      this._textInput.focus();
+    });
+  }
+
+  render() {
+    const { navigation } = this.props;
+    return (
+      <View style={{ paddingTop: 30 }}>
+        <View style={{ alignSelf: 'center', paddingVertical: 20 }}>
+          <TextInput
+            ref={c => (this._textInput = c)}
+            onChangeText={inputValue => navigation.setParams({ inputValue })}
+            style={{
+              backgroundColor: 'white',
+              height: 24,
+              width: 150,
+              borderColor: '#555',
+              borderWidth: 1,
+            }}
+          />
+        </View>
+        <Button onPress={() => navigation.pop()} title="Pop" />
+      </View>
+    );
+  }
+}
+
+export default createStackNavigator({
+  ScreenOne,
+  ScreenTwo: withNavigationFocus(ScreenTwo),
+});

+ 107 - 0
HUILIAOAPP/js/ModalStack.js

@@ -0,0 +1,107 @@
+/**
+ * @flow
+ */
+
+import React from 'react';
+import { ScrollView, StatusBar, Text } from 'react-native';
+import { SafeAreaView, createStackNavigator } from 'react-navigation';
+import SampleText from './SampleText';
+import { Button } from './commonComponents/ButtonWithMargin';
+
+const MyNavScreen = ({ navigation, banner }) => (
+  <ScrollView>
+    <SafeAreaView
+      forceInset={{
+        top: navigation.state.routeName === 'HeaderTest' ? 'always' : 'never',
+      }}
+    >
+      <SampleText>{banner}</SampleText>
+      <Button
+        onPress={() => navigation.navigate('Profile', { name: 'Jane' })}
+        title="Go to a profile screen"
+      />
+      <Button
+        onPress={() => navigation.navigate('HeaderTest')}
+        title="Go to a header toggle screen"
+      />
+      {navigation.state.routeName === 'HeaderTest' && (
+        <Button
+          title="Toggle Header"
+          onPress={() =>
+            navigation.setParams({
+              headerVisible:
+                !navigation.state.params ||
+                !navigation.state.params.headerVisible,
+            })
+          }
+        />
+      )}
+      <Button onPress={() => navigation.goBack(null)} title="Go back" />
+    </SafeAreaView>
+    <StatusBar barStyle="default" />
+  </ScrollView>
+);
+
+const MyHomeScreen = ({ navigation }) => (
+  <MyNavScreen banner="Home Screen" navigation={navigation} />
+);
+MyHomeScreen.navigationOptions = {
+  title: 'Welcome',
+};
+
+const MyProfileScreen = ({ navigation }) => (
+  <MyNavScreen
+    banner={`${navigation.state.params.name}'s Profile`}
+    navigation={navigation}
+  />
+);
+MyProfileScreen.navigationOptions = ({ navigation }) => ({
+  title: `${navigation.state.params.name}'s Profile!`,
+});
+
+const ProfileNavigator = createStackNavigator(
+  {
+    Home: {
+      screen: MyHomeScreen,
+    },
+    Profile: {
+      path: 'people/:name',
+      screen: MyProfileScreen,
+    },
+  },
+  {
+    navigationOptions: {
+      headerLeft: null,
+    },
+    mode: 'modal',
+  }
+);
+
+const MyHeaderTestScreen = ({ navigation }) => (
+  <MyNavScreen banner={`Full screen view`} navigation={navigation} />
+);
+MyHeaderTestScreen.navigationOptions = ({ navigation }) => {
+  const headerVisible =
+    navigation.state.params && navigation.state.params.headerVisible;
+  return {
+    header: headerVisible ? undefined : null,
+    title: 'Now you see me',
+  };
+};
+
+const ModalStack = createStackNavigator(
+  {
+    ProfileNavigator: {
+      screen: ProfileNavigator,
+    },
+    HeaderTest: { screen: MyHeaderTestScreen },
+  },
+  {
+    navigationOptions: {
+      header: null,
+    },
+    mode: 'modal',
+  }
+);
+
+export default ModalStack;

+ 75 - 0
HUILIAOAPP/js/MultipleDrawer.js

@@ -0,0 +1,75 @@
+/**
+ * @flow
+ */
+
+import React from 'react';
+import { Platform, ScrollView, StyleSheet } from 'react-native';
+import { createDrawerNavigator } from 'react-navigation';
+import MaterialIcons from 'react-native-vector-icons/MaterialIcons';
+import SampleText from './SampleText';
+import { Button } from './commonComponents/ButtonWithMargin';
+
+const MyNavScreen = ({ navigation, banner }) => (
+  <ScrollView style={styles.container}>
+    <SampleText>{banner}</SampleText>
+    <Button onPress={() => navigation.openDrawer()} title="Open drawer" />
+    <Button onPress={() => navigation.goBack(null)} title="Go back" />
+  </ScrollView>
+);
+
+const InboxScreen = ({ navigation }) => (
+  <MyNavScreen banner={'Inbox Screen'} navigation={navigation} />
+);
+InboxScreen.navigationOptions = {
+  drawerLabel: 'Inbox',
+  drawerIcon: ({ tintColor }) => (
+    <MaterialIcons
+      name="move-to-inbox"
+      size={24}
+      style={{ color: tintColor }}
+    />
+  ),
+};
+
+const DraftsScreen = ({ navigation }) => (
+  <MyNavScreen banner={'Drafts Screen'} navigation={navigation} />
+);
+DraftsScreen.navigationOptions = {
+  drawerLabel: 'Drafts',
+  drawerIcon: ({ tintColor }) => (
+    <MaterialIcons name="drafts" size={24} style={{ color: tintColor }} />
+  ),
+};
+
+const DrawerExample = createDrawerNavigator(
+  {
+    Inbox: {
+      path: '/',
+      screen: InboxScreen,
+    },
+    Drafts: {
+      path: '/sent',
+      screen: DraftsScreen,
+    },
+  },
+  {
+    initialRouteName: 'Drafts',
+    contentOptions: {
+      activeTintColor: '#e91e63',
+    },
+  }
+);
+
+const MainDrawerExample = createDrawerNavigator({
+  Drafts: {
+    screen: DrawerExample,
+  },
+});
+
+const styles = StyleSheet.create({
+  container: {
+    marginTop: Platform.OS === 'ios' ? 20 : 0,
+  },
+});
+
+export default MainDrawerExample;

+ 22 - 0
HUILIAOAPP/js/SampleText.js

@@ -0,0 +1,22 @@
+/* @flow */
+
+import React from 'react';
+
+import { StyleSheet, Text } from 'react-native';
+
+/**
+ * Used across examples as a screen placeholder.
+ */
+import type { ChildrenArray } from 'react';
+
+const SampleText = ({ children }: { children?: ChildrenArray<*> }) => (
+  <Text style={styles.sampleText}>{children}</Text>
+);
+
+export default SampleText;
+
+const styles = StyleSheet.create({
+  sampleText: {
+    margin: 14,
+  },
+});

+ 255 - 0
HUILIAOAPP/js/SimpleStack.js

@@ -0,0 +1,255 @@
+/**
+ * @flow
+ */
+
+import type {
+  NavigationScreenProp,
+  NavigationState,
+  NavigationStateRoute,
+  NavigationEventSubscription,
+} from 'react-navigation';
+
+import * as React from 'react';
+import { Platform, ScrollView, StatusBar } from 'react-native';
+import {
+  createStackNavigator,
+  SafeAreaView,
+  withNavigation,
+  NavigationActions,
+  StackActions,
+} from 'react-navigation';
+import invariant from 'invariant';
+
+import SampleText from './SampleText';
+import { Button } from './commonComponents/ButtonWithMargin';
+import { HeaderButtons } from './commonComponents/HeaderButtons';
+
+const DEBUG = false;
+
+type MyNavScreenProps = {
+  navigation: NavigationScreenProp<NavigationState>,
+  banner: React.Node,
+};
+
+type BackButtonProps = {
+  navigation: NavigationScreenProp<NavigationStateRoute>,
+};
+
+class MyBackButton extends React.Component<BackButtonProps, any> {
+  render() {
+    return (
+      <HeaderButtons>
+        <HeaderButtons.Item title="Back" onPress={this._navigateBack} />
+      </HeaderButtons>
+    );
+  }
+
+  _navigateBack = () => {
+    this.props.navigation.goBack(null);
+  };
+}
+
+const MyBackButtonWithNavigation = withNavigation(MyBackButton);
+
+class MyNavScreen extends React.Component<MyNavScreenProps> {
+  render() {
+    const { navigation, banner } = this.props;
+    const { push, replace, popToTop, pop, dismiss } = navigation;
+    invariant(
+      push && replace && popToTop && pop && dismiss,
+      'missing action creators for StackNavigator'
+    );
+    return (
+      <SafeAreaView>
+        <SampleText>{banner}</SampleText>
+        <Button
+          onPress={() => push('Profile', { name: 'Jane' })}
+          title="Push a profile screen"
+        />
+        <Button
+          onPress={() =>
+            navigation.dispatch(
+              StackActions.reset({
+                index: 0,
+                actions: [
+                  NavigationActions.navigate({
+                    routeName: 'Photos',
+                    params: { name: 'Jane' },
+                  }),
+                ],
+              })
+            )
+          }
+          title="Reset photos"
+        />
+        <Button
+          onPress={() => navigation.navigate('Photos', { name: 'Jane' })}
+          title="Navigate to a photos screen"
+        />
+        <Button
+          onPress={() => replace('Profile', { name: 'Lucy' })}
+          title="Replace with profile"
+        />
+        <Button onPress={() => popToTop()} title="Pop to top" />
+        <Button onPress={() => pop()} title="Pop" />
+        <Button
+          onPress={() => {
+            if (navigation.goBack()) {
+              console.log('goBack handled');
+            } else {
+              console.log('goBack unhandled');
+            }
+          }}
+          title="Go back"
+        />
+        <Button onPress={() => dismiss()} title="Dismiss" />
+        <StatusBar barStyle="default" />
+      </SafeAreaView>
+    );
+  }
+}
+
+type MyHomeScreenProps = {
+  navigation: NavigationScreenProp<NavigationState>,
+};
+
+class MyHomeScreen extends React.Component<MyHomeScreenProps> {
+  static navigationOptions = {
+    title: 'Welcome',
+  };
+  _s0: NavigationEventSubscription;
+  _s1: NavigationEventSubscription;
+  _s2: NavigationEventSubscription;
+  _s3: NavigationEventSubscription;
+
+  componentDidMount() {
+    this._s0 = this.props.navigation.addListener('willFocus', this._onWF);
+    this._s1 = this.props.navigation.addListener('didFocus', this._onDF);
+    this._s2 = this.props.navigation.addListener('willBlur', this._onWB);
+    this._s3 = this.props.navigation.addListener('didBlur', this._onDB);
+  }
+  componentWillUnmount() {
+    this._s0.remove();
+    this._s1.remove();
+    this._s2.remove();
+    this._s3.remove();
+  }
+  _onWF = a => {
+    DEBUG && console.log('_willFocus HomeScreen', a);
+  };
+  _onDF = a => {
+    DEBUG && console.log('_didFocus HomeScreen', a);
+  };
+  _onWB = a => {
+    DEBUG && console.log('_willBlur HomeScreen', a);
+  };
+  _onDB = a => {
+    DEBUG && console.log('_didBlur HomeScreen', a);
+  };
+
+  render() {
+    const { navigation } = this.props;
+    return <MyNavScreen banner="Home Screen" navigation={navigation} />;
+  }
+}
+
+type MyPhotosScreenProps = {
+  navigation: NavigationScreenProp<NavigationState>,
+};
+class MyPhotosScreen extends React.Component<MyPhotosScreenProps> {
+  static navigationOptions = {
+    title: 'Photos',
+    headerLeft: <MyBackButtonWithNavigation />,
+  };
+  _s0: NavigationEventSubscription;
+  _s1: NavigationEventSubscription;
+  _s2: NavigationEventSubscription;
+  _s3: NavigationEventSubscription;
+
+  componentDidMount() {
+    this._s0 = this.props.navigation.addListener('willFocus', this._onWF);
+    this._s1 = this.props.navigation.addListener('didFocus', this._onDF);
+    this._s2 = this.props.navigation.addListener('willBlur', this._onWB);
+    this._s3 = this.props.navigation.addListener('didBlur', this._onDB);
+  }
+  componentWillUnmount() {
+    this._s0.remove();
+    this._s1.remove();
+    this._s2.remove();
+    this._s3.remove();
+  }
+  _onWF = a => {
+    DEBUG && console.log('_willFocus PhotosScreen', a);
+  };
+  _onDF = a => {
+    DEBUG && console.log('_didFocus PhotosScreen', a);
+  };
+  _onWB = a => {
+    DEBUG && console.log('_willBlur PhotosScreen', a);
+  };
+  _onDB = a => {
+    DEBUG && console.log('_didBlur PhotosScreen', a);
+  };
+
+  render() {
+    const { navigation } = this.props;
+    return (
+      <MyNavScreen
+        banner={`${navigation.getParam('name')}'s Photos`}
+        navigation={navigation}
+      />
+    );
+  }
+}
+
+const MyProfileScreen = ({ navigation }) => (
+  <MyNavScreen
+    banner={`${
+      navigation.getParam('mode') === 'edit' ? 'Now Editing ' : ''
+    }${navigation.getParam('name')}'s Profile`}
+    navigation={navigation}
+  />
+);
+
+MyProfileScreen.navigationOptions = props => {
+  const { navigation } = props;
+  const { state, setParams } = navigation;
+  const { params } = state;
+  return {
+    headerBackImage: params.headerBackImage,
+    headerTitle: `${params.name}'s Profile!`,
+    // Render a button on the right side of the header.
+    // When pressed switches the screen to edit mode.
+    headerRight: (
+      <HeaderButtons>
+        <HeaderButtons.Item
+          title={params.mode === 'edit' ? 'Done' : 'Edit'}
+          onPress={() =>
+            setParams({ mode: params.mode === 'edit' ? '' : 'edit' })
+          }
+        />
+      </HeaderButtons>
+    ),
+  };
+};
+
+const SimpleStack = createStackNavigator(
+  {
+    Home: {
+      screen: MyHomeScreen,
+    },
+    Profile: {
+      path: 'people/:name',
+      screen: MyProfileScreen,
+    },
+    Photos: {
+      path: 'photos/:name',
+      screen: MyPhotosScreen,
+    },
+  },
+  {
+    // headerLayoutPreset: 'center',
+  }
+);
+
+export default SimpleStack;

+ 204 - 0
HUILIAOAPP/js/SimpleTabs.js

@@ -0,0 +1,204 @@
+/**
+ * @flow
+ */
+
+import type {
+  NavigationScreenProp,
+  NavigationEventSubscription,
+} from 'react-navigation';
+
+import React from 'react';
+import { Platform, ScrollView, StatusBar, View } from 'react-native';
+import { SafeAreaView, createBottomTabNavigator } from 'react-navigation';
+import Ionicons from 'react-native-vector-icons/Ionicons';
+import SampleText from './SampleText';
+import { Button } from './commonComponents/ButtonWithMargin';
+
+const MyNavScreen = ({ navigation, banner }) => (
+  <SafeAreaView forceInset={{ horizontal: 'always', top: 'always' }}>
+    <SampleText>{banner}</SampleText>
+    <Button
+      onPress={() => navigation.navigate('Home')}
+      title="Go to home tab"
+    />
+    <Button
+      onPress={() => navigation.navigate('Settings')}
+      title="Go to settings tab"
+    />
+    <Button onPress={() => navigation.goBack(null)} title="Go back" />
+    <StatusBar barStyle="default" />
+  </SafeAreaView>
+);
+
+const MyHomeScreen = ({ navigation }) => (
+  <MyNavScreen banner="Home Tab" navigation={navigation} />
+);
+
+MyHomeScreen.navigationOptions = {
+  tabBarTestIDProps: {
+    testID: 'TEST_ID_HOME',
+    accessibilityLabel: 'TEST_ID_HOME_ACLBL',
+  },
+  tabBarLabel: 'Home',
+  tabBarIcon: ({ tintColor, focused }) => (
+    <Ionicons
+      name={focused ? 'ios-home' : 'ios-home-outline'}
+      size={26}
+      style={{ color: tintColor }}
+    />
+  ),
+};
+
+type MyPeopleScreenProps = {
+  navigation: NavigationScreenProp<*>,
+};
+class MyPeopleScreen extends React.Component<MyPeopleScreenProps> {
+  _s0: NavigationEventSubscription;
+  _s1: NavigationEventSubscription;
+  _s2: NavigationEventSubscription;
+  _s3: NavigationEventSubscription;
+
+  static navigationOptions = {
+    tabBarLabel: 'People',
+    tabBarIcon: ({ tintColor, focused }) => (
+      <Ionicons
+        name={focused ? 'ios-people' : 'ios-people-outline'}
+        size={26}
+        style={{ color: tintColor }}
+      />
+    ),
+  };
+  componentDidMount() {
+    this._s0 = this.props.navigation.addListener('willFocus', this._onEvent);
+    this._s1 = this.props.navigation.addListener('didFocus', this._onEvent);
+    this._s2 = this.props.navigation.addListener('willBlur', this._onEvent);
+    this._s3 = this.props.navigation.addListener('didBlur', this._onEvent);
+  }
+  componentWillUnmount() {
+    this._s0.remove();
+    this._s1.remove();
+    this._s2.remove();
+    this._s3.remove();
+  }
+  _onEvent = a => {
+    console.log('EVENT ON PEOPLE TAB', a.type, a);
+  };
+  render() {
+    const { navigation } = this.props;
+    return <MyNavScreen banner="People Tab" navigation={navigation} />;
+  }
+}
+
+type MyChatScreenProps = {
+  navigation: NavigationScreenProp<*>,
+};
+class MyChatScreen extends React.Component<MyChatScreenProps> {
+  _s0: NavigationEventSubscription;
+  _s1: NavigationEventSubscription;
+  _s2: NavigationEventSubscription;
+  _s3: NavigationEventSubscription;
+
+  static navigationOptions = {
+    tabBarLabel: 'Chat',
+    tabBarIcon: ({ tintColor, focused }) => (
+      <Ionicons
+        name={focused ? 'ios-chatboxes' : 'ios-chatboxes-outline'}
+        size={26}
+        style={{ color: tintColor }}
+      />
+    ),
+  };
+  componentDidMount() {
+    this._s0 = this.props.navigation.addListener('willFocus', this._onEvent);
+    this._s1 = this.props.navigation.addListener('didFocus', this._onEvent);
+    this._s2 = this.props.navigation.addListener('willBlur', this._onEvent);
+    this._s3 = this.props.navigation.addListener('didBlur', this._onEvent);
+  }
+  componentWillUnmount() {
+    this._s0.remove();
+    this._s1.remove();
+    this._s2.remove();
+    this._s3.remove();
+  }
+  _onEvent = a => {
+    console.log('EVENT ON CHAT TAB', a.type, a);
+  };
+  render() {
+    const { navigation } = this.props;
+    return <MyNavScreen banner="Chat Tab" navigation={navigation} />;
+  }
+}
+
+const MySettingsScreen = ({ navigation }) => (
+  <MyNavScreen banner="Settings Tab" navigation={navigation} />
+);
+
+MySettingsScreen.navigationOptions = {
+  tabBarLabel: 'Settings',
+  tabBarIcon: ({ tintColor, focused }) => (
+    <Ionicons
+      name={focused ? 'ios-settings' : 'ios-settings-outline'}
+      size={26}
+      style={{ color: tintColor }}
+    />
+  ),
+};
+
+const SimpleTabs = createBottomTabNavigator(
+  {
+    Home: {
+      screen: MyHomeScreen,
+      path: '',
+    },
+    People: {
+      screen: MyPeopleScreen,
+      path: 'cart',
+    },
+    Chat: {
+      screen: MyChatScreen,
+      path: 'chat',
+    },
+    Settings: {
+      screen: MySettingsScreen,
+      path: 'settings',
+    },
+  },
+  {
+    tabBarOptions: {
+      activeTintColor: '#e91e63',
+    },
+  }
+);
+
+type SimpleTabsContainerProps = {
+  navigation: NavigationScreenProp<*>,
+};
+
+class SimpleTabsContainer extends React.Component<SimpleTabsContainerProps> {
+  static router = SimpleTabs.router;
+  _s0: NavigationEventSubscription;
+  _s1: NavigationEventSubscription;
+  _s2: NavigationEventSubscription;
+  _s3: NavigationEventSubscription;
+
+  componentDidMount() {
+    this._s0 = this.props.navigation.addListener('willFocus', this._onAction);
+    this._s1 = this.props.navigation.addListener('didFocus', this._onAction);
+    this._s2 = this.props.navigation.addListener('willBlur', this._onAction);
+    this._s3 = this.props.navigation.addListener('didBlur', this._onAction);
+  }
+  componentWillUnmount() {
+    this._s0.remove();
+    this._s1.remove();
+    this._s2.remove();
+    this._s3.remove();
+  }
+  _onAction = a => {
+    console.log('TABS EVENT', a.type, a);
+  };
+  render() {
+    return <SimpleTabs navigation={this.props.navigation} />;
+  }
+}
+
+export default SimpleTabsContainer;

+ 145 - 0
HUILIAOAPP/js/StackWithCustomHeaderBackImage.js

@@ -0,0 +1,145 @@
+/**
+ * @flow
+ */
+
+import type { NavigationScreenProp } from 'react-navigation';
+
+import * as React from 'react';
+import { Image, Button, StatusBar, StyleSheet } from 'react-native';
+import { createStackNavigator, SafeAreaView } from 'react-navigation';
+import SampleText from './SampleText';
+
+type MyNavScreenProps = {
+  navigation: NavigationScreenProp<*>,
+  banner: React.Node,
+};
+
+class MyCustomHeaderBackImage extends React.Component<any, any> {
+  render() {
+    const source = require('./assets/back.png');
+    return (
+      <Image
+        source={source}
+        style={[styles.myCustomHeaderBackImage, this.props.style]}
+      />
+    );
+  }
+}
+
+class MyNavScreen extends React.Component<MyNavScreenProps> {
+  render() {
+    const { navigation, banner } = this.props;
+    return (
+      <SafeAreaView>
+        <SampleText>{banner}</SampleText>
+        <Button
+          onPress={() => navigation.navigate('Photos', { name: 'Jane' })}
+          title="Navigate to a photos screen"
+        />
+        <Button onPress={() => navigation.goBack(null)} title="Go back" />
+        <StatusBar barStyle="default" />
+      </SafeAreaView>
+    );
+  }
+}
+
+type MyHomeScreenProps = {
+  navigation: NavigationScreenProp<*>,
+};
+
+class MyHomeScreen extends React.Component<MyHomeScreenProps> {
+  static navigationOptions = {
+    title: 'Welcome',
+    headerBackTitle: null,
+  };
+
+  render() {
+    const { navigation } = this.props;
+    return <MyNavScreen banner="Home Screen" navigation={navigation} />;
+  }
+}
+
+type MyPhotosScreenProps = {
+  navigation: NavigationScreenProp<*>,
+};
+class MyPhotosScreen extends React.Component<MyPhotosScreenProps> {
+  static navigationOptions = ({ navigation }) => ({
+    title: `${navigation.state.params.name}'s photos`,
+    headerBackTitle: null,
+  });
+
+  render() {
+    const { navigation } = this.props;
+    return (
+      <SafeAreaView>
+        <SampleText>{`${navigation.state.params.name}'s Photos`}</SampleText>
+        <Button
+          onPress={() => navigation.navigate('Profile', { name: 'Jane' })}
+          title="Navigate to a profile screen"
+        />
+        <Button onPress={() => navigation.goBack(null)} title="Go back" />
+        <StatusBar barStyle="default" />
+      </SafeAreaView>
+    );
+  }
+}
+
+type MyProfileScreenProps = {
+  navigation: NavigationScreenProp<*>,
+};
+class MyProfileScreen extends React.Component<MyProfileScreenProps> {
+  static navigationOptions = ({ navigation }) => ({
+    title: 'Profile',
+    headerBackImage: (
+      <MyCustomHeaderBackImage style={styles.myCustomHeaderBackImageAlt} />
+    ),
+  });
+
+  render() {
+    const { navigation } = this.props;
+    return (
+      <SafeAreaView>
+        <SampleText>{`${navigation.state.params.name}'s Profile`}</SampleText>
+        <Button onPress={() => navigation.goBack(null)} title="Go back" />
+        <StatusBar barStyle="default" />
+      </SafeAreaView>
+    );
+  }
+}
+
+const StackWithCustomHeaderBackImage = createStackNavigator(
+  {
+    Home: {
+      screen: MyHomeScreen,
+    },
+    Photos: {
+      path: 'photos/:name',
+      screen: MyPhotosScreen,
+    },
+    Profile: {
+      path: 'profile/:name',
+      screen: MyProfileScreen,
+    },
+  },
+  {
+    navigationOptions: {
+      headerBackImage: MyCustomHeaderBackImage,
+    },
+  }
+);
+
+export default StackWithCustomHeaderBackImage;
+
+const styles = StyleSheet.create({
+  myCustomHeaderBackImage: {
+    height: 14.5,
+    width: 24,
+    marginLeft: 9,
+    marginRight: 12,
+    marginVertical: 12,
+    resizeMode: 'contain',
+  },
+  myCustomHeaderBackImageAlt: {
+    tintColor: '#f00',
+  },
+});

+ 123 - 0
HUILIAOAPP/js/StackWithHeaderPreset.js

@@ -0,0 +1,123 @@
+/**
+ * @flow
+ */
+import type { NavigationScreenProp } from 'react-navigation';
+
+import * as React from 'react';
+import { ScrollView, StatusBar } from 'react-native';
+import { createStackNavigator, SafeAreaView } from 'react-navigation';
+import invariant from 'invariant';
+
+import { Button } from './commonComponents/ButtonWithMargin';
+
+type NavScreenProps = {
+  navigation: NavigationScreenProp<*>,
+};
+
+class HomeScreen extends React.Component<NavScreenProps> {
+  static navigationOptions = {
+    title: 'Welcome',
+  };
+
+  render() {
+    const { navigation } = this.props;
+    const { push } = navigation;
+    invariant(push, 'missing `push` action creator for StackNavigator');
+
+    return (
+      <SafeAreaView style={{ paddingTop: 30 }}>
+        <Button onPress={() => push('Other')} title="Push another screen" />
+        <Button
+          onPress={() => push('ScreenWithNoHeader')}
+          title="Push screen with no header"
+        />
+        <Button onPress={() => navigation.goBack(null)} title="Go Home" />
+        <StatusBar barStyle="default" />
+      </SafeAreaView>
+    );
+  }
+}
+
+class OtherScreen extends React.Component<NavScreenProps> {
+  static navigationOptions = {
+    title: 'Your title here',
+  };
+
+  render() {
+    const { navigation } = this.props;
+    const { push, pop } = navigation;
+    invariant(push && pop, 'missing action creators for StackNavigator');
+
+    return (
+      <SafeAreaView style={{ paddingTop: 30 }}>
+        <Button
+          onPress={() => push('ScreenWithLongTitle')}
+          title="Push another screen"
+        />
+        <Button
+          onPress={() => push('ScreenWithNoHeader')}
+          title="Push screen with no header"
+        />
+        <Button onPress={() => pop()} title="Pop" />
+        <Button onPress={() => navigation.goBack(null)} title="Go back" />
+        <StatusBar barStyle="default" />
+      </SafeAreaView>
+    );
+  }
+}
+
+class ScreenWithLongTitle extends React.Component<NavScreenProps> {
+  static navigationOptions = {
+    title: "Another title that's kind of long",
+  };
+
+  render() {
+    const { navigation } = this.props;
+    const { pop } = navigation;
+    invariant(pop, 'missing `pop` action creator for StackNavigator');
+
+    return (
+      <SafeAreaView style={{ paddingTop: 30 }}>
+        <Button onPress={() => pop()} title="Pop" />
+        <Button onPress={() => navigation.goBack(null)} title="Go back" />
+        <StatusBar barStyle="default" />
+      </SafeAreaView>
+    );
+  }
+}
+
+class ScreenWithNoHeader extends React.Component<NavScreenProps> {
+  static navigationOptions = {
+    header: null,
+    title: 'No Header',
+  };
+
+  render() {
+    const { navigation } = this.props;
+    const { push, pop } = navigation;
+    invariant(push && pop, 'missing action creators for StackNavigator');
+
+    return (
+      <SafeAreaView style={{ paddingTop: 30 }}>
+        <Button onPress={() => push('Other')} title="Push another screen" />
+        <Button onPress={() => pop()} title="Pop" />
+        <Button onPress={() => navigation.goBack(null)} title="Go back" />
+        <StatusBar barStyle="default" />
+      </SafeAreaView>
+    );
+  }
+}
+
+const StackWithHeaderPreset = createStackNavigator(
+  {
+    Home: HomeScreen,
+    Other: OtherScreen,
+    ScreenWithNoHeader: ScreenWithNoHeader,
+    ScreenWithLongTitle: ScreenWithLongTitle,
+  },
+  {
+    headerTransitionPreset: 'uikit',
+  }
+);
+
+export default StackWithHeaderPreset;

+ 249 - 0
HUILIAOAPP/js/StackWithTranslucentHeader.js

@@ -0,0 +1,249 @@
+/**
+ * @flow
+ */
+
+import type {
+  NavigationScreenProp,
+  NavigationEventSubscription,
+} from 'react-navigation';
+
+import { isIphoneX } from 'react-native-iphone-x-helper';
+
+import * as React from 'react';
+import { BlurView, Constants } from 'expo';
+import {
+  Dimensions,
+  Platform,
+  ScrollView,
+  StatusBar,
+  StyleSheet,
+  View,
+} from 'react-native';
+import { Header, createStackNavigator } from 'react-navigation';
+import invariant from 'invariant';
+
+import SampleText from './SampleText';
+import { Button } from './commonComponents/ButtonWithMargin';
+import { HeaderButtons } from './commonComponents/HeaderButtons';
+
+type MyNavScreenProps = {
+  navigation: NavigationScreenProp<*>,
+  banner: React.Node,
+};
+
+class MyNavScreen extends React.Component<MyNavScreenProps> {
+  render() {
+    const { navigation, banner } = this.props;
+    const { push, replace, popToTop, pop } = navigation;
+    invariant(
+      push && replace && popToTop && pop,
+      'missing action creators for StackNavigator'
+    );
+    return (
+      <ScrollView style={{ flex: 1 }} {...this.getHeaderInset()}>
+        <SampleText>{banner}</SampleText>
+        <Button
+          onPress={() => push('Profile', { name: 'Jane' })}
+          title="Push a profile screen"
+        />
+        <Button
+          onPress={() => navigation.navigate('Photos', { name: 'Jane' })}
+          title="Navigate to a photos screen"
+        />
+        <Button
+          onPress={() => replace('Profile', { name: 'Lucy' })}
+          title="Replace with profile"
+        />
+        <Button onPress={() => popToTop()} title="Pop to top" />
+        <Button onPress={() => pop()} title="Pop" />
+        <Button onPress={() => navigation.goBack(null)} title="Go back" />
+        <StatusBar barStyle="default" />
+      </ScrollView>
+    );
+  }
+
+  // Inset to compensate for navigation bar being transparent.
+  // And improved abstraction for this will be built in to react-navigation
+  // at some point.
+
+  getHeaderInset() {
+    const NOTCH_HEIGHT = isIphoneX() ? 25 : 0;
+
+    // $FlowIgnore: we will remove the HEIGHT static soon enough
+    const BASE_HEADER_HEIGHT = Header.HEIGHT;
+
+    const HEADER_HEIGHT =
+      Platform.OS === 'ios'
+        ? BASE_HEADER_HEIGHT + NOTCH_HEIGHT
+        : BASE_HEADER_HEIGHT + Constants.statusBarHeight;
+
+    return Platform.select({
+      ios: {
+        contentInset: { top: HEADER_HEIGHT },
+        contentOffset: { y: -HEADER_HEIGHT },
+      },
+      android: {
+        contentContainerStyle: {
+          paddingTop: HEADER_HEIGHT,
+        },
+      },
+    });
+  }
+}
+
+type MyHomeScreenProps = {
+  navigation: NavigationScreenProp<*>,
+};
+
+class MyHomeScreen extends React.Component<MyHomeScreenProps> {
+  static navigationOptions = {
+    title: 'Welcome',
+  };
+  _s0: NavigationEventSubscription;
+  _s1: NavigationEventSubscription;
+  _s2: NavigationEventSubscription;
+  _s3: NavigationEventSubscription;
+
+  componentDidMount() {
+    this._s0 = this.props.navigation.addListener('willFocus', this._onWF);
+    this._s1 = this.props.navigation.addListener('didFocus', this._onDF);
+    this._s2 = this.props.navigation.addListener('willBlur', this._onWB);
+    this._s3 = this.props.navigation.addListener('didBlur', this._onDB);
+  }
+  componentWillUnmount() {
+    this._s0.remove();
+    this._s1.remove();
+    this._s2.remove();
+    this._s3.remove();
+  }
+  _onWF = a => {
+    console.log('_willFocus HomeScreen', a);
+  };
+  _onDF = a => {
+    console.log('_didFocus HomeScreen', a);
+  };
+  _onWB = a => {
+    console.log('_willBlur HomeScreen', a);
+  };
+  _onDB = a => {
+    console.log('_didBlur HomeScreen', a);
+  };
+
+  render() {
+    const { navigation } = this.props;
+    return <MyNavScreen banner="Home Screen" navigation={navigation} />;
+  }
+}
+
+type MyPhotosScreenProps = {
+  navigation: NavigationScreenProp<*>,
+};
+class MyPhotosScreen extends React.Component<MyPhotosScreenProps> {
+  static navigationOptions = {
+    title: 'Photos',
+  };
+  _s0: NavigationEventSubscription;
+  _s1: NavigationEventSubscription;
+  _s2: NavigationEventSubscription;
+  _s3: NavigationEventSubscription;
+
+  componentDidMount() {
+    this._s0 = this.props.navigation.addListener('willFocus', this._onWF);
+    this._s1 = this.props.navigation.addListener('didFocus', this._onDF);
+    this._s2 = this.props.navigation.addListener('willBlur', this._onWB);
+    this._s3 = this.props.navigation.addListener('didBlur', this._onDB);
+  }
+  componentWillUnmount() {
+    this._s0.remove();
+    this._s1.remove();
+    this._s2.remove();
+    this._s3.remove();
+  }
+  _onWF = a => {
+    console.log('_willFocus PhotosScreen', a);
+  };
+  _onDF = a => {
+    console.log('_didFocus PhotosScreen', a);
+  };
+  _onWB = a => {
+    console.log('_willBlur PhotosScreen', a);
+  };
+  _onDB = a => {
+    console.log('_didBlur PhotosScreen', a);
+  };
+
+  render() {
+    const { navigation } = this.props;
+    return (
+      <MyNavScreen
+        banner={`${navigation.state.params.name}'s Photos`}
+        navigation={navigation}
+      />
+    );
+  }
+}
+
+const MyProfileScreen = ({ navigation }) => (
+  <MyNavScreen
+    banner={`${navigation.state.params.mode === 'edit' ? 'Now Editing ' : ''}${
+      navigation.state.params.name
+    }'s Profile`}
+    navigation={navigation}
+  />
+);
+
+MyProfileScreen.navigationOptions = props => {
+  const { navigation } = props;
+  const { state, setParams } = navigation;
+  const { params } = state;
+  return {
+    headerBackImage: params.headerBackImage,
+    headerTitle: `${params.name}'s Profile!`,
+    // Render a button on the right side of the header.
+    // When pressed switches the screen to edit mode.
+    headerRight: (
+      <HeaderButtons>
+        <HeaderButtons.Item
+          title={params.mode === 'edit' ? 'Done' : 'Edit'}
+          onPress={() =>
+            setParams({ mode: params.mode === 'edit' ? '' : 'edit' })
+          }
+        />
+      </HeaderButtons>
+    ),
+  };
+};
+
+const StackWithTranslucentHeader = createStackNavigator(
+  {
+    Home: {
+      screen: MyHomeScreen,
+    },
+    Profile: {
+      path: 'people/:name',
+      screen: MyProfileScreen,
+    },
+    Photos: {
+      path: 'photos/:name',
+      screen: MyPhotosScreen,
+    },
+  },
+  {
+    headerTransitionPreset: 'uikit',
+    navigationOptions: {
+      headerTransparent: true,
+      headerStyle: {
+        borderBottomWidth: StyleSheet.hairlineWidth,
+        borderBottomColor: '#A7A7AA',
+      },
+      headerBackground: Platform.select({
+        ios: <BlurView style={{ flex: 1 }} intensity={98} />,
+        android: (
+          <View style={{ flex: 1, backgroundColor: 'rgba(255,255,255,0.7)' }} />
+        ),
+      }),
+    },
+  }
+);
+
+export default StackWithTranslucentHeader;

+ 130 - 0
HUILIAOAPP/js/StacksInTabs.js

@@ -0,0 +1,130 @@
+/**
+ * @flow
+ */
+
+import React from 'react';
+import { ScrollView, StatusBar } from 'react-native';
+import {
+  SafeAreaView,
+  createStackNavigator,
+  createBottomTabNavigator,
+} from 'react-navigation';
+
+import Ionicons from 'react-native-vector-icons/Ionicons';
+import SampleText from './SampleText';
+import { Button } from './commonComponents/ButtonWithMargin';
+
+const MyNavScreen = ({ navigation, banner }) => (
+  <ScrollView>
+    <SafeAreaView forceInset={{ horizontal: 'always' }}>
+      <SampleText>{banner}</SampleText>
+      <Button
+        onPress={() => navigation.navigate('Profile', { name: 'Jordan' })}
+        title="Open profile screen"
+      />
+      <Button
+        onPress={() => navigation.navigate('NotifSettings')}
+        title="Open notifications screen"
+      />
+      <Button
+        onPress={() => navigation.navigate('SettingsTab')}
+        title="Go to settings tab"
+      />
+      <Button onPress={() => navigation.goBack(null)} title="Go back" />
+    </SafeAreaView>
+
+    <StatusBar barStyle="default" />
+  </ScrollView>
+);
+
+const MyHomeScreen = ({ navigation }) => (
+  <MyNavScreen banner="Home Screen" navigation={navigation} />
+);
+
+const MyProfileScreen = ({ navigation }) => (
+  <MyNavScreen
+    banner={`${navigation.state.params.name}s Profile`}
+    navigation={navigation}
+  />
+);
+
+const MyNotificationsSettingsScreen = ({ navigation }) => (
+  <MyNavScreen banner="Notifications Screen" navigation={navigation} />
+);
+
+const MySettingsScreen = ({ navigation }) => (
+  <MyNavScreen banner="Settings Screen" navigation={navigation} />
+);
+
+const MainTab = createStackNavigator({
+  Home: {
+    screen: MyHomeScreen,
+    path: '/',
+    navigationOptions: {
+      title: 'Welcome',
+    },
+  },
+  Profile: {
+    screen: MyProfileScreen,
+    path: '/people/:name',
+    navigationOptions: ({ navigation }) => ({
+      title: `${navigation.state.params.name}'s Profile!`,
+    }),
+  },
+});
+
+const SettingsTab = createStackNavigator({
+  Settings: {
+    screen: MySettingsScreen,
+    path: '/',
+    navigationOptions: () => ({
+      title: 'Settings',
+    }),
+  },
+  NotifSettings: {
+    screen: MyNotificationsSettingsScreen,
+    navigationOptions: {
+      title: 'Notifications',
+    },
+  },
+});
+
+const StacksInTabs = createBottomTabNavigator(
+  {
+    MainTab: {
+      screen: MainTab,
+      path: '/',
+      navigationOptions: {
+        tabBarLabel: 'Home',
+        tabBarIcon: ({ tintColor, focused }) => (
+          <Ionicons
+            name={focused ? 'ios-home' : 'ios-home-outline'}
+            size={26}
+            style={{ color: tintColor }}
+          />
+        ),
+      },
+    },
+    SettingsTab: {
+      screen: SettingsTab,
+      path: '/settings',
+      navigationOptions: {
+        tabBarLabel: 'Settings',
+        tabBarIcon: ({ tintColor, focused }) => (
+          <Ionicons
+            name={focused ? 'ios-settings' : 'ios-settings-outline'}
+            size={26}
+            style={{ color: tintColor }}
+          />
+        ),
+      },
+    },
+  },
+  {
+    tabBarOptions: {
+      showLabel: false,
+    },
+  }
+);
+
+export default StacksInTabs;

+ 129 - 0
HUILIAOAPP/js/StacksOverTabs.js

@@ -0,0 +1,129 @@
+/**
+ * @flow
+ */
+
+import React from 'react';
+import { ScrollView, StatusBar } from 'react-native';
+import {
+  SafeAreaView,
+  createStackNavigator,
+  createBottomTabNavigator,
+} from 'react-navigation';
+
+import Ionicons from 'react-native-vector-icons/Ionicons';
+import SampleText from './SampleText';
+import { Button } from './commonComponents/ButtonWithMargin';
+
+const MyNavScreen = ({ navigation, banner }) => (
+  <ScrollView>
+    <SafeAreaView forceInset={{ horizontal: 'always' }}>
+      <SampleText>{banner}</SampleText>
+      <Button
+        onPress={() => navigation.navigate('Profile', { name: 'Jordan' })}
+        title="Open profile screen"
+      />
+      <Button
+        onPress={() => navigation.navigate('NotifSettings')}
+        title="Open notifications screen"
+      />
+      <Button
+        onPress={() => navigation.navigate('SettingsTab')}
+        title="Go to settings tab"
+      />
+      <Button onPress={() => navigation.goBack(null)} title="Go back" />
+    </SafeAreaView>
+    <StatusBar barStyle="default" />
+  </ScrollView>
+);
+
+const MyHomeScreen = ({ navigation }) => (
+  <MyNavScreen banner="Home Screen" navigation={navigation} />
+);
+
+const MyProfileScreen = ({ navigation }) => (
+  <MyNavScreen
+    banner={`${navigation.state.params.name}s Profile`}
+    navigation={navigation}
+  />
+);
+
+const MyNotificationsSettingsScreen = ({ navigation }) => (
+  <MyNavScreen banner="Notifications Screen" navigation={navigation} />
+);
+
+const MySettingsScreen = ({ navigation }) => (
+  <MyNavScreen banner="Settings Screen" navigation={navigation} />
+);
+
+const TabNav = createBottomTabNavigator(
+  {
+    MainTab: {
+      screen: MyHomeScreen,
+      path: '/',
+      navigationOptions: {
+        title: 'Welcome',
+        tabBarLabel: 'Home',
+        tabBarIcon: ({ tintColor, focused }) => (
+          <Ionicons
+            name={focused ? 'ios-home' : 'ios-home-outline'}
+            size={26}
+            style={{ color: tintColor }}
+          />
+        ),
+      },
+    },
+    SettingsTab: {
+      screen: MySettingsScreen,
+      path: '/settings',
+      navigationOptions: {
+        title: 'Settings',
+        tabBarIcon: ({ tintColor, focused }) => (
+          <Ionicons
+            name={focused ? 'ios-settings' : 'ios-settings-outline'}
+            size={26}
+            style={{ color: tintColor }}
+          />
+        ),
+      },
+    },
+  },
+  {
+    tabBarPosition: 'bottom',
+    animationEnabled: false,
+    swipeEnabled: false,
+  }
+);
+
+TabNav.navigationOptions = ({ navigation }) => {
+  let { routeName } = navigation.state.routes[navigation.state.index];
+  let title;
+  if (routeName === 'SettingsTab') {
+    title = 'Settings';
+  } else if (routeName === 'MainTab') {
+    title = 'Home';
+  }
+  return {
+    title,
+  };
+};
+
+const StacksOverTabs = createStackNavigator({
+  Root: {
+    screen: TabNav,
+  },
+  NotifSettings: {
+    screen: MyNotificationsSettingsScreen,
+    navigationOptions: {
+      title: 'Notifications',
+    },
+  },
+  Profile: {
+    screen: MyProfileScreen,
+    path: '/people/:name',
+    navigationOptions: ({ navigation }) => ({
+      title: `${navigation.state.params.name}'s Profile!`,
+    }),
+  },
+});
+
+export default StacksOverTabs;

+ 142 - 0
HUILIAOAPP/js/StacksOverTopTabs.js

@@ -0,0 +1,142 @@
+/**
+ * @flow
+ */
+
+import React from 'react';
+import { View, ScrollView, StatusBar, StyleSheet } from 'react-native';
+import {
+  SafeAreaView,
+  createStackNavigator,
+  createMaterialTopTabNavigator,
+} from 'react-navigation';
+import { Constants } from 'expo';
+import { MaterialTopTabBar } from 'react-navigation-tabs';
+
+import SampleText from './SampleText';
+import { Button } from './commonComponents/ButtonWithMargin';
+
+const HEADER_HEIGHT = 64;
+
+const MyNavScreen = ({ navigation, banner, statusBarStyle }) => (
+  <ScrollView>
+    <SafeAreaView forceInset={{ horizontal: 'always' }}>
+      <SampleText>{banner}</SampleText>
+      <Button
+        onPress={() => navigation.navigate('Profile', { name: 'Jordan' })}
+        title="Open profile screen"
+      />
+      <Button
+        onPress={() => navigation.navigate('NotifSettings')}
+        title="Open notifications screen"
+      />
+      <Button
+        onPress={() => navigation.navigate('SettingsTab')}
+        title="Go to settings tab"
+      />
+      <Button onPress={() => navigation.goBack(null)} title="Go back" />
+    </SafeAreaView>
+    <StatusBar barStyle={statusBarStyle || 'default'} />
+  </ScrollView>
+);
+
+const MyHomeScreen = ({ navigation }) => (
+  <MyNavScreen
+    banner="Home Screen"
+    navigation={navigation}
+    statusBarStyle="light-content"
+  />
+);
+
+const MyProfileScreen = ({ navigation }) => (
+  <MyNavScreen
+    banner={`${navigation.state.params.name}s Profile`}
+    navigation={navigation}
+  />
+);
+
+const MyNotificationsSettingsScreen = ({ navigation }) => (
+  <MyNavScreen banner="Notifications Screen" navigation={navigation} />
+);
+
+const MySettingsScreen = ({ navigation }) => (
+  <MyNavScreen
+    banner="Settings Screen"
+    navigation={navigation}
+    statusBarStyle="light-content"
+  />
+);
+
+const styles = StyleSheet.create({
+  stackHeader: {
+    height: HEADER_HEIGHT,
+  },
+  tab: {
+    height: HEADER_HEIGHT,
+  },
+});
+
+function MaterialTopTabBarWithStatusBar(props) {
+  return (
+    <View
+      style={{
+        paddingTop: Constants.statusBarHeight,
+        backgroundColor: '#2196f3',
+      }}
+    >
+      <MaterialTopTabBar {...props} jumpToIndex={() => {}} />
+    </View>
+  );
+}
+
+const TabNavigator = createMaterialTopTabNavigator(
+  {
+    MainTab: {
+      screen: MyHomeScreen,
+      navigationOptions: {
+        title: 'Welcome',
+      },
+    },
+    SettingsTab: {
+      screen: MySettingsScreen,
+      navigationOptions: {
+        title: 'Settings',
+      },
+    },
+  },
+  {
+    tabBarComponent: MaterialTopTabBarWithStatusBar,
+    tabBarOptions: {
+      tabStyle: styles.tab,
+    },
+  }
+);
+
+const StackNavigator = createStackNavigator(
+  {
+    Root: {
+      screen: TabNavigator,
+      navigationOptions: {
+        header: null,
+      },
+    },
+    NotifSettings: {
+      screen: MyNotificationsSettingsScreen,
+      navigationOptions: {
+        title: 'Notifications',
+      },
+    },
+    Profile: {
+      screen: MyProfileScreen,
+      navigationOptions: ({ navigation }) => ({
+        title: `${navigation.state.params.name}'s Profile!`,
+      }),
+    },
+  },
+  {
+    navigationOptions: {
+      headerStyle: styles.stackHeader,
+    },
+  }
+);
+
+export default StackNavigator;

+ 102 - 0
HUILIAOAPP/js/StacksWithKeys.js

@@ -0,0 +1,102 @@
+import React from 'react';
+import { StatusBar, Text, View } from 'react-native';
+import { createStackNavigator } from 'react-navigation';
+import { Button } from './commonComponents/ButtonWithMargin';
+
+class HomeScreen extends React.Component<any, any> {
+  render() {
+    return (
+      <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
+        <Text>Home</Text>
+        <Button
+          title="Navigate to 'Profile' with key 'A'"
+          onPress={() =>
+            this.props.navigation.navigate({
+              routeName: 'Profile',
+              key: 'A',
+              params: { homeKey: this.props.navigation.state.key },
+            })
+          }
+        />
+        <Button
+          title="Go back to other examples"
+          onPress={() => this.props.navigation.goBack(null)}
+        />
+        <StatusBar barStyle="default" />
+      </View>
+    );
+  }
+}
+
+class ProfileScreen extends React.Component<any, any> {
+  render() {
+    const { homeKey } = this.props.navigation.state.params;
+    return (
+      <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
+        <Text>Profile</Text>
+        <Button
+          title="Navigate to 'Settings' with key 'B'"
+          onPress={() =>
+            this.props.navigation.navigate({
+              routeName: 'Settings',
+              key: 'B',
+              params: { homeKey },
+            })
+          }
+        />
+        <Button
+          title={`Navigate back to 'Home' with key ${homeKey}`}
+          onPress={() =>
+            this.props.navigation.navigate({ routeName: 'Home', key: homeKey })
+          }
+        />
+      </View>
+    );
+  }
+}
+
+class SettingsScreen extends React.Component<any, any> {
+  render() {
+    const { homeKey } = this.props.navigation.state.params;
+
+    return (
+      <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
+        <Text>Settings</Text>
+        <Button
+          title={`Navigate back to 'Home' with key ${homeKey}`}
+          onPress={() =>
+            this.props.navigation.navigate({ routeName: 'Home', key: homeKey })
+          }
+        />
+        <Button
+          title="Navigate back to 'Profile' with key 'A'"
+          onPress={() =>
+            this.props.navigation.navigate({
+              routeName: 'Profile',
+              key: 'A',
+            })
+          }
+        />
+      </View>
+    );
+  }
+}
+
+const Stack = createStackNavigator(
+  {
+    Home: {
+      screen: HomeScreen,
+    },
+    Profile: {
+      screen: ProfileScreen,
+    },
+    Settings: {
+      screen: SettingsScreen,
+    },
+  },
+  {
+    headerMode: 'none',
+  }
+);
+
+export default Stack;

+ 121 - 0
HUILIAOAPP/js/SwitchWithStacks.js

@@ -0,0 +1,121 @@
+/**
+ * @flow
+ */
+
+import React from 'react';
+import {
+  ActivityIndicator,
+  AsyncStorage,
+  StatusBar,
+  StyleSheet,
+  View,
+} from 'react-native';
+import { createStackNavigator, createSwitchNavigator } from 'react-navigation';
+import { Button } from './commonComponents/ButtonWithMargin';
+
+class SignInScreen extends React.Component<any, any> {
+  static navigationOptions = {
+    title: 'Please sign in',
+  };
+
+  render() {
+    return (
+      <View style={styles.container}>
+        <Button title="Sign in!" onPress={this._signInAsync} />
+        <Button
+          title="Go back to other examples"
+          onPress={() => this.props.navigation.goBack(null)}
+        />
+        <StatusBar barStyle="default" />
+      </View>
+    );
+  }
+
+  _signInAsync = async () => {
+    await AsyncStorage.setItem('userToken', 'abc');
+    this.props.navigation.navigate('Home');
+  };
+}
+
+class HomeScreen extends React.Component<any, any> {
+  static navigationOptions = {
+    title: 'Welcome to the app!',
+  };
+
+  render() {
+    return (
+      <View style={styles.container}>
+        <Button title="Show me more of the app" onPress={this._showMoreApp} />
+        <Button title="Actually, sign me out :)" onPress={this._signOutAsync} />
+        <StatusBar barStyle="default" />
+      </View>
+    );
+  }
+
+  _showMoreApp = () => {
+    this.props.navigation.navigate('Other');
+  };
+
+  _signOutAsync = async () => {
+    await AsyncStorage.clear();
+    this.props.navigation.navigate('Auth');
+  };
+}
+
+class OtherScreen extends React.Component<any, any> {
+  static navigationOptions = {
+    title: 'Lots of features here',
+  };
+
+  render() {
+    return (
+      <View style={styles.container}>
+        <Button title="I'm done, sign me out" onPress={this._signOutAsync} />
+        <StatusBar barStyle="default" />
+      </View>
+    );
+  }
+
+  _signOutAsync = async () => {
+    await AsyncStorage.clear();
+    this.props.navigation.navigate('Auth');
+  };
+}
+
+class LoadingScreen extends React.Component<any, any> {
+  componentDidMount() {
+    this._bootstrapAsync();
+  }
+
+  _bootstrapAsync = async () => {
+    const userToken = await AsyncStorage.getItem('userToken');
+    let initialRouteName = userToken ? 'App' : 'Auth';
+    this.props.navigation.navigate(initialRouteName);
+  };
+
+  render() {
+    return (
+      <View style={styles.container}>
+        <ActivityIndicator />
+        <StatusBar barStyle="default" />
+      </View>
+    );
+  }
+}
+
+const styles = StyleSheet.create({
+  container: {
+    flex: 1,
+    alignItems: 'center',
+    justifyContent: 'center',
+  },
+});
+
+const AppStack = createStackNavigator({ Home: HomeScreen, Other: OtherScreen });
+const AuthStack = createStackNavigator({ SignIn: SignInScreen });
+
+export default createSwitchNavigator({
+  Loading: LoadingScreen,
+  App: AppStack,
+  Auth: AuthStack,
+});

+ 45 - 0
HUILIAOAPP/js/TabsInDrawer.js

@@ -0,0 +1,45 @@
+/**
+ * @flow
+ */
+
+import React from 'react';
+import { Platform, ScrollView } from 'react-native';
+import { createDrawerNavigator } from 'react-navigation';
+import MaterialIcons from 'react-native-vector-icons/MaterialIcons';
+import SimpleTabs from './SimpleTabs';
+import StacksOverTabs from './StacksOverTabs';
+
+const TabsInDrawer = createDrawerNavigator({
+  SimpleTabs: {
+    screen: SimpleTabs,
+    navigationOptions: {
+      drawer: () => ({
+        label: 'Simple Tabs',
+        icon: ({ tintColor }) => (
+          <MaterialIcons
+            name="filter-1"
+            size={24}
+            style={{ color: tintColor }}
+          />
+        ),
+      }),
+    },
+  },
+  StacksOverTabs: {
+    screen: StacksOverTabs,
+    navigationOptions: {
+      drawer: () => ({
+        label: 'Stacks Over Tabs',
+        icon: ({ tintColor }) => (
+          <MaterialIcons
+            name="filter-2"
+            size={24}
+            style={{ color: tintColor }}
+          />
+        ),
+      }),
+    },
+  },
+});
+
+export default TabsInDrawer;

+ 127 - 0
HUILIAOAPP/js/TabsWithNavigationEvents.js

@@ -0,0 +1,127 @@
+/**
+ * @flow
+ */
+
+import React from 'react';
+import { FlatList, SafeAreaView, StatusBar, Text, View } from 'react-native';
+import { NavigationEvents } from 'react-navigation';
+import { createMaterialBottomTabNavigator } from 'react-navigation-material-bottom-tabs';
+import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons';
+
+const Event = ({ event }) => (
+  <View
+    style={{
+      borderColor: 'grey',
+      borderWidth: 1,
+      borderRadius: 3,
+      padding: 5,
+      flexDirection: 'row',
+      alignItems: 'center',
+      justifyContent: 'space-between',
+    }}
+  >
+    <Text>{event.type}</Text>
+    <Text>
+      {event.action.type.replace('Navigation/', '')}
+      {event.action.routeName ? '=>' + event.action.routeName : ''}
+    </Text>
+  </View>
+);
+
+const createTabScreen = (name, icon, focusedIcon) => {
+  class TabScreen extends React.Component<any, any> {
+    static navigationOptions = {
+      tabBarLabel: name,
+      tabBarIcon: ({ tintColor, focused }) => (
+        <MaterialCommunityIcons
+          name={focused ? focusedIcon : icon}
+          size={26}
+          style={{ color: focused ? tintColor : '#ccc' }}
+        />
+      ),
+    };
+
+    state = { eventLog: [] };
+
+    append = navigationEvent => {
+      this.setState(({ eventLog }) => ({
+        eventLog: eventLog.concat(navigationEvent),
+      }));
+    };
+
+    render() {
+      return (
+        <SafeAreaView
+          forceInset={{ horizontal: 'always', top: 'always' }}
+          style={{
+            flex: 1,
+          }}
+        >
+          <Text
+            style={{
+              margin: 10,
+              marginTop: 30,
+              fontSize: 30,
+              fontWeight: 'bold',
+            }}
+          >
+            Events for tab {name}
+          </Text>
+
+          <View style={{ flex: 1, width: '100%', marginTop: 10 }}>
+            <FlatList
+              data={this.state.eventLog}
+              keyExtractor={item => `${this.state.eventLog.indexOf(item)}`}
+              renderItem={({ item }) => (
+                <View
+                  style={{
+                    marginVertical: 5,
+                    marginHorizontal: 10,
+                    backgroundColor: '#e4e4e4',
+                  }}
+                >
+                  <Event event={item} />
+                </View>
+              )}
+            />
+          </View>
+
+          <NavigationEvents
+            onWillFocus={this.append}
+            onDidFocus={this.append}
+            onWillBlur={this.append}
+            onDidBlur={this.append}
+          />
+
+          <StatusBar barStyle="default" />
+        </SafeAreaView>
+      );
+    }
+  }
+
+  return TabScreen;
+};
+
+const TabsWithNavigationEvents = createMaterialBottomTabNavigator(
+  {
+    One: {
+      screen: createTabScreen('One', 'numeric-1-box-outline', 'numeric-1-box'),
+    },
+    Two: {
+      screen: createTabScreen('Two', 'numeric-2-box-outline', 'numeric-2-box'),
+    },
+    Three: {
+      screen: createTabScreen(
+        'Three',
+        'numeric-3-box-outline',
+        'numeric-3-box'
+      ),
+    },
+  },
+  {
+    shifting: false,
+    activeTintColor: '#F44336',
+  }
+);
+
+export default TabsWithNavigationEvents;

+ 103 - 0
HUILIAOAPP/js/TabsWithNavigationFocus.js

@@ -0,0 +1,103 @@
+/**
+ * @flow
+ */
+
+import React from 'react';
+import { SafeAreaView, StatusBar, Text, View } from 'react-native';
+import { withNavigationFocus } from 'react-navigation';
+import { createMaterialBottomTabNavigator } from 'react-navigation-material-bottom-tabs';
+import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons';
+import { Button } from './commonComponents/ButtonWithMargin';
+
+import SampleText from './SampleText';
+
+class Child extends React.Component<any, any> {
+  render() {
+    return (
+      <Text style={{ color: this.props.isFocused ? 'green' : 'maroon' }}>
+        {this.props.isFocused
+          ? 'I know that my parent is focused!'
+          : 'My parent is not focused! :O'}
+      </Text>
+    );
+  }
+}
+
+const ChildWithNavigationFocus = withNavigationFocus(Child);
+
+const createTabScreen = (name, icon, focusedIcon, tintColor = '#673ab7') => {
+  class TabScreen extends React.Component<any, any> {
+    static navigationOptions = {
+      tabBarLabel: name,
+      tabBarIcon: ({ tintColor, focused }) => (
+        <MaterialCommunityIcons
+          name={focused ? focusedIcon : icon}
+          size={26}
+          style={{ color: focused ? tintColor : '#ccc' }}
+        />
+      ),
+    };
+
+    state = { showChild: false };
+
+    render() {
+      const { isFocused } = this.props;
+
+      return (
+        <SafeAreaView
+          forceInset={{ horizontal: 'always', top: 'always' }}
+          style={{
+            flex: 1,
+            alignItems: 'center',
+            justifyContent: 'center',
+          }}
+        >
+          <Text style={{ fontWeight: '700', fontSize: 16, marginBottom: 5 }}>
+            {'Tab ' + name.toLowerCase()}
+          </Text>
+          <Text style={{ marginBottom: 20 }}>
+            {'props.isFocused: ' + (isFocused ? ' true' : 'false')}
+          </Text>
+          {this.state.showChild ? (
+            <ChildWithNavigationFocus />
+          ) : (
+            <Button
+              title="Press me"
+              onPress={() => this.setState({ showChild: true })}
+            />
+          )}
+          <Button
+            onPress={() => this.props.navigation.pop()}
+            title="Back to other examples"
+          />
+          <StatusBar barStyle="default" />
+        </SafeAreaView>
+      );
+    }
+  }
+  return withNavigationFocus(TabScreen);
+};
+
+const TabsWithNavigationFocus = createMaterialBottomTabNavigator(
+  {
+    One: {
+      screen: createTabScreen('One', 'numeric-1-box-outline', 'numeric-1-box'),
+    },
+    Two: {
+      screen: createTabScreen('Two', 'numeric-2-box-outline', 'numeric-2-box'),
+    },
+    Three: {
+      screen: createTabScreen(
+        'Three',
+        'numeric-3-box-outline',
+        'numeric-3-box'
+      ),
+    },
+  },
+  {
+    shifting: false,
+    activeTintColor: '#F44336',
+  }
+);
+
+export default TabsWithNavigationFocus;

BIN
HUILIAOAPP/js/assets/NavLogo.png


BIN
HUILIAOAPP/js/assets/back.png


BIN
HUILIAOAPP/js/assets/dog-back.png


+ 18 - 0
HUILIAOAPP/js/commonComponents/ButtonWithMargin.js

@@ -0,0 +1,18 @@
+import { Button as RNButton, StyleSheet, View, Platform } from 'react-native';
+import React from 'react';
+
+export const Button = props => (
+  <View style={styles.margin}>
+    <RNButton {...props} />
+  </View>
+);
+
+const styles = StyleSheet.create({
+  margin: {
+    ...Platform.select({
+      android: {
+        margin: 10,
+      },
+    }),
+  },
+});

+ 16 - 0
HUILIAOAPP/js/commonComponents/HeaderButtons.js

@@ -0,0 +1,16 @@
+import DefaultHeaderButtons from 'react-navigation-header-buttons';
+import * as React from 'react';
+import { Platform } from 'react-native';
+
+export class HeaderButtons extends React.PureComponent {
+  static Item = DefaultHeaderButtons.Item;
+
+  render() {
+    return (
+      <DefaultHeaderButtons
+        color={Platform.OS === 'ios' ? '#037aff' : 'black'}
+        {...this.props}
+      />
+    );
+  }
+}

+ 49 - 0
HUILIAOAPP/package.json

@@ -0,0 +1,49 @@
+{
+  "name": "HUILIAOAPP",
+  "version": "0.0.1",
+  "private": true,
+  "scripts": {
+    "start": "node node_modules/react-native/local-cli/cli.js start",
+    "test": "jest"
+  },
+  "dependencies": {
+    "axios": "^0.18.0",
+    "babel-preset-expo": "^4.0.0",
+    "expo": "^27.0.0",
+    "leancloud-realtime": "^4.2.0",
+    "leancloud-realtime-plugin-typed-messages": "^3.0.1",
+    "leancloud-storage": "^3.10.0",
+    "prop-types": "^15.5.10",
+    "react": "16.4.1",
+    "react-native": "0.56.0",
+    "react-native-qrcode": "^0.2.7",
+    "react-navigation": "^2.11.2",
+    "react-navigation-redux-helpers": "^2.0.5",
+    "react-redux": "^5.0.6",
+    "redux": "^3.7.2",
+    
+
+    "invariant": "^2.2.4",
+    "react-native-iphone-x-helper": "^1.0.2",
+
+    "react-navigation-header-buttons": "^0.0.4",
+    "react-navigation-material-bottom-tabs": "^0.3.0",
+    "react-navigation-tabs": "^0.5.1"
+  },
+  "devDependencies": {
+    "babel-jest": "23.4.2",
+    "babel-preset-react-native": "^5",
+    "flow-bin": "^0.74.0",
+    "jest": "23.5.0",
+    "react-native-scripts": "^1.3.1",
+    "react-test-renderer": "16.4.1",
+
+    "babel-plugin-transform-remove-console": "^6.9.0",
+
+    "jest-expo": "^28.0.0"
+
+  },
+  "jest": {
+    "preset": "react-native"
+  }
+}

+ 6 - 0
HUILIAOAPP/src/API/index.js

@@ -0,0 +1,6 @@
+import LeanCloudAPI from './leanCloudAPI';
+
+
+export {
+    LeanCloudAPI
+}

+ 78 - 0
HUILIAOAPP/src/API/leanCloudAPI.js

@@ -0,0 +1,78 @@
+import AV from 'leancloud-storage';
+import {TypedMessagesPlugin} from 'leancloud-realtime-plugin-typed-messages'
+import {Realtime} from "leancloud-realtime";
+import {AV_APP_ID as appId, AV_APP_KEY as appKey} from '../config';
+
+class LeanCloudAPI {
+    constructor() {
+      this.AV = null;
+      this.realtime = null;
+      this.imClient = null;
+      this.username = null;
+    }
+  
+    init() {
+      AV.init({appId, appKey});
+      this.AV = AV;
+      this.realtime = new Realtime({
+        appId,
+        appKey,
+        plugins: [TypedMessagesPlugin],
+      });
+
+      console.log(AV)
+    }
+  
+    async login(username,password) {
+     let result= await this.AV.User.logIn(username, password)
+      this.username = username;
+      return result;
+    }
+  
+    async logout() {
+      if (this.imClient) {
+        return await imClient.close();
+      }
+      if (this.AV) {
+        return await this.AV.User.logOut();
+      }
+    }
+  
+    // async createIMClient(dispatch) {
+    //   console.log('init im client');
+    //   if (!this.username) {
+    //     throw new Error('Please login first.');
+    //   }
+    //   this.imClient = await this.realtime.createIMClient(this.username);
+  
+    //   this.realtime.on('message', function (msg) {
+    //     console.log('msg: ' + msg);
+    //     dispath && dispatch(receivedWsMsg(msg))
+    //   });
+    //   this.realtime.on('disconnect', function () {
+    //     console.log('服务器连接已断开');
+    //     dispath && dispatch(offline());
+    //   });
+    //   this.realtime.on('offline', function () {
+    //     console.log('离线(网络连接已断开)');
+    //     dispath && dispatch(offline());
+    //   });
+    //   this.realtime.on('online', function () {
+    //     console.log('已恢复在线');
+    //     dispath && dispatch(online());
+    //   });
+    //   this.realtime.on('schedule', function (attempt, delay) {
+    //     console.log(delay + 'ms 后进行第' + (attempt + 1) + '次重连');
+    //   });
+    //   this.realtime.on('retry', function (attempt) {
+    //     console.log('正在进行第' + (attempt + 1) + '次重连');
+    //   });
+    //   this.realtime.on('reconnect', function () {
+    //     console.log('与服务端连接恢复');
+    //   });
+  
+    //   return this.imClient;
+    // }
+  }
+
+  export default new LeanCloudAPI();

+ 30 - 0
HUILIAOAPP/src/components/AuthButton.js

@@ -0,0 +1,30 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { connect } from 'react-redux';
+import { Button } from 'react-native';
+import { NavigationActions } from 'react-navigation';
+
+const AuthButton = ({ logout, loginScreen, isLoggedIn }) => (
+  <Button
+    title={isLoggedIn ? 'Log Out' : 'Open Login Screen'}
+    onPress={isLoggedIn ? logout : loginScreen}
+  />
+);
+
+AuthButton.propTypes = {
+  isLoggedIn: PropTypes.bool.isRequired,
+  logout: PropTypes.func.isRequired,
+  loginScreen: PropTypes.func.isRequired,
+};
+
+const mapStateToProps = state => ({
+  isLoggedIn: state.auth.isLoggedIn,
+});
+
+const mapDispatchToProps = dispatch => ({
+  logout: () => dispatch({ type: 'Logout' }),
+  loginScreen: () =>
+    dispatch(NavigationActions.navigate({ routeName: 'Login' })),
+});
+
+export default connect(mapStateToProps, mapDispatchToProps)(AuthButton);

+ 65 - 0
HUILIAOAPP/src/components/LoginScreen.js

@@ -0,0 +1,65 @@
+import React ,{ Component }from 'react';
+import PropTypes from 'prop-types';
+import { Button, StyleSheet, Text, View,WebView } from 'react-native';
+
+import {LeanCloudAPI} from '../API';
+import QRCode from 'react-native-qrcode';
+
+const styles = StyleSheet.create({
+  container: {
+    flex: 1,
+    justifyContent: 'center',
+    alignItems: 'center',
+    backgroundColor: '#F5FCFF',
+  },
+  welcome: {
+    fontSize: 20,
+    textAlign: 'center',
+    margin: 10,
+  },
+});
+
+
+
+class LoginScreen extends Component{
+  constructor(props){
+    super(props)
+  }
+  componentWillMount(){
+    // LeanCloudAPI.init()
+    // console.log(LeanCloudAPI.login('wenjie','123456'))
+  }
+
+  render(){
+    const {navigation} = this.props
+    return(
+      <View style={styles.container}>
+      <Text style={styles.welcome}>
+        Screen A
+      </Text>
+      <Text style={styles.instructions}>
+        This is great
+      </Text>
+      <QRCode
+          value={'123456'}
+          size={200}
+          bgColor='black'
+          fgColor='white'/>
+      <Button
+        onPress={() => navigation.dispatch({ type: 'Login' })}
+        title="Log in"
+      />
+    </View>
+    )
+  }
+}
+
+LoginScreen.propTypes = {
+  navigation: PropTypes.object.isRequired,
+};
+
+LoginScreen.navigationOptions = {
+  title: 'Log In',
+};
+
+export default LoginScreen;

+ 42 - 0
HUILIAOAPP/src/components/LoginStatusMessage.js

@@ -0,0 +1,42 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { connect } from 'react-redux';
+import { Button, StyleSheet, Text, View } from 'react-native';
+import { NavigationActions } from 'react-navigation';
+
+const styles = StyleSheet.create({
+  welcome: {
+    fontSize: 20,
+    textAlign: 'center',
+    margin: 10,
+  },
+});
+
+const LoginStatusMessage = ({ isLoggedIn, dispatch }) => {
+  if (!isLoggedIn) {
+    return <Text>Please log in</Text>;
+  }
+  return (
+    <View>
+      <Text style={styles.welcome}>
+        {'You are "logged in" right now'}
+      </Text>
+      <Button
+        onPress={() =>
+          dispatch(NavigationActions.navigate({ routeName: 'Profile' }))}
+        title="Profile"
+      />
+    </View>
+  );
+};
+
+LoginStatusMessage.propTypes = {
+  isLoggedIn: PropTypes.bool.isRequired,
+  dispatch: PropTypes.func.isRequired,
+};
+
+const mapStateToProps = state => ({
+  isLoggedIn: state.auth.isLoggedIn,
+});
+
+export default connect(mapStateToProps)(LoginStatusMessage);

+ 0 - 0
HUILIAOAPP/src/components/MainScreen.js


Some files were not shown because too many files changed in this diff