diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..2b75303
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..15a15b2
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding" addBOMForNewFiles="with NO BOM" />
+</project>
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
new file mode 100644
index 0000000..7ac24c7
--- /dev/null
+++ b/.idea/gradle.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="GradleSettings">
+    <option name="linkedExternalProjectsSettings">
+      <GradleProjectSettings>
+        <option name="distributionType" value="DEFAULT_WRAPPED" />
+        <option name="externalProjectPath" value="$PROJECT_DIR$" />
+        <option name="modules">
+          <set>
+            <option value="$PROJECT_DIR$" />
+            <option value="$PROJECT_DIR$/app" />
+          </set>
+        </option>
+        <option name="resolveModulePerSourceSet" value="false" />
+      </GradleProjectSettings>
+    </option>
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..7bfef59
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/build/classes" />
+  </component>
+  <component name="ProjectType">
+    <option name="id" value="Android" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
new file mode 100644
index 0000000..7f68460
--- /dev/null
+++ b/.idea/runConfigurations.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RunConfigurationProducerService">
+    <option name="ignoredProducers">
+      <set>
+        <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
+        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
+        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
+      </set>
+    </option>
+  </component>
+</project>
\ No newline at end of file
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..ed71b20
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,60 @@
+apply plugin: 'com.android.application'
+
+android {
+    signingConfigs {
+        release {
+            storeFile file("$rootDir/keys-app.jks")
+            storePassword '123456'
+            keyAlias = 'sup'
+            keyPassword '123456'
+        }
+    }
+    compileSdkVersion 28
+    defaultConfig {
+        applicationId "com.supwisdom.conferencecheck"
+        minSdkVersion 19
+        targetSdkVersion 25
+        versionCode 1
+        versionName "1.0"
+        ndk {
+            abiFilters 'armeabi-v7a', 'armeabi', 'x86'
+        }
+    }
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+    buildToolsVersion = '28.0.3'
+    compileOptions {
+        sourceCompatibility = '1.8'
+        targetCompatibility = '1.8'
+    }
+    android.applicationVariants.all { variant ->
+        variant.outputs.all { output ->
+            def apkName = "conference-v${defaultConfig.versionName}-${defaultConfig.versionCode}.apk"
+            outputFileName = apkName
+        }
+    }
+    lintOptions {
+        checkReleaseBuilds false
+        // Or, if you prefer, you can continue to check for errors in release builds,
+        // but continue the build even when errors are found:
+        abortOnError false
+    }
+}
+
+dependencies {
+    implementation fileTree(include: ['*.jar'], dir: 'libs')
+    implementation 'com.android.support:appcompat-v7:28.0.0'
+    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
+    testImplementation 'junit:junit:4.12'
+    androidTestImplementation 'com.android.support.test:runner:1.0.2'
+    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+    compile 'com.squareup.okhttp3:okhttp:3.10.0'
+    compile 'org.apache.httpcomponents:httpcore:4.4.10'
+    compile 'com.alibaba:fastjson:1.1.70.android'
+    implementation files('libs/smdt.jar')
+    implementation files('libs/zxinglibsl.jar')
+}
diff --git a/app/libs/smdt.jar b/app/libs/smdt.jar
new file mode 100644
index 0000000..102cf05
--- /dev/null
+++ b/app/libs/smdt.jar
Binary files differ
diff --git a/app/libs/zxinglibsl.jar b/app/libs/zxinglibsl.jar
new file mode 100644
index 0000000..c645c93
--- /dev/null
+++ b/app/libs/zxinglibsl.jar
Binary files differ
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..f1b4245
--- /dev/null
+++ b/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# 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 *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/app/release/conference-v1.0-1.apk b/app/release/conference-v1.0-1.apk
new file mode 100644
index 0000000..248ae27
--- /dev/null
+++ b/app/release/conference-v1.0-1.apk
Binary files differ
diff --git a/app/release/output.json b/app/release/output.json
new file mode 100644
index 0000000..43e4cda
--- /dev/null
+++ b/app/release/output.json
@@ -0,0 +1 @@
+[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"conference-v1.0-1.apk","fullName":"release","baseName":"release"},"path":"conference-v1.0-1.apk","properties":{}}]
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..6277142
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:serviceandroid="http://schemas.android.com/tools"
+    package="com.supwisdom.conferencecheck">
+
+    <uses-permission android:name="android.permission.VIBRATE" />
+    <uses-permission
+        android:name="android.permission.WRITE_SETTINGS"
+        serviceandroid:ignore="ProtectedPermissions" />
+    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
+    <uses-permission
+        android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
+        serviceandroid:ignore="ProtectedPermissions" />
+
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.CAMERA" />
+    <uses-permission android:name="android.permission.NFC" />
+    <uses-permission android:name="android.permission.READ_PROFILE" />
+    <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
+    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
+    <uses-permission android:name="android.permission.RECORD_AUDIO" />
+    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
+    <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
+    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
+    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
+    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
+    <uses-permission android:name="android.permission.FLASHLIGHT" />
+    <uses-permission android:name="android.permission.WEITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+    <uses-permission android:name="android.permission.WAKE_LOCK" />
+
+    <uses-permission
+        android:name="android.permission.WRITE_SECURE_SETTINGS"
+        serviceandroid:ignore="ProtectedPermissions" />
+
+    <uses-feature android:name="android.hardware.camera" />
+    <uses-feature android:name="android.hardware.camera.autofocus" />
+
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission
+        android:name="android.permission.READ_LOGS"
+        serviceandroid:ignore="ProtectedPermissions" />
+
+    <application
+        android:name=".SPApplication"
+        android:allowBackup="true"
+        android:icon="@drawable/app_logo"
+        android:label="@string/app_name"
+        android:supportsRtl="true"
+        android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
+        <activity
+            android:name=".activity.SplashActivity"
+            android:launchMode="singleTask">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.HOME" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity
+            android:name=".activity.MainActivity"
+            android:label="会议签到"
+            android:launchMode="singleInstance"
+            />
+
+        <activity
+            android:name=".activity.CheckDetailActivity"
+            android:label="签到详情"
+            android:launchMode="singleTask"
+            />
+
+        <activity
+            android:name=".activity.ManageActivity"
+            android:label="维护管理"
+            android:launchMode="singleTask"
+            />
+
+        <activity
+            android:name=".activity.ConferenceQueryActivity"
+            android:label="本地会议查询"
+            android:launchMode="singleTask"
+            />
+
+        <activity
+            android:name=".activity.ConfigActivity"
+            android:label="配置"
+            android:launchMode="singleTask"
+            />
+
+    </application>
+
+</manifest>
\ No newline at end of file
diff --git a/app/src/main/assets/news_content01.html b/app/src/main/assets/news_content01.html
new file mode 100644
index 0000000..08f55e4
--- /dev/null
+++ b/app/src/main/assets/news_content01.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title></title>
+</head>
+<body bgcolor="#434E5F" oncontextmenu="return false;" onselectstart="return false;">
+<p align="center">&nbsp;&nbsp;&nbsp;&nbsp;<span
+        style="font-size: 55px;"><strong style='color: rgb(187,187,187);'>苍山洱海</strong></span></p>
+<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span
+        style='color: rgb(187,187,187); text-transform: none; text-indent: 0px; letter-spacing: normal; font-family: "Microsoft YaHei"; font-size: 46px; font-style: normal; font-weight: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;'></span><span
+        style='color: rgb(187,187,187); text-transform: none; text-indent: 0px; letter-spacing: normal; font-family: "Microsoft YaHei"; font-size: 36px; font-style: normal; font-weight: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;'>大理市是大理白族自治州州府所在地，是集国家级历史文化名城、风景名胜区、自然保护区于一身的城市，市内设有省级经济开发区和省级旅游度假区。境内苍山洱海珠联璧合，相映成趣。素有“高原明珠”、“东方瑞士”之美誉。</span>
+</p>
+</p>
+</body>
+</html>
\ No newline at end of file
diff --git a/app/src/main/assets/news_content02.html b/app/src/main/assets/news_content02.html
new file mode 100644
index 0000000..0558b6c
--- /dev/null
+++ b/app/src/main/assets/news_content02.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title></title>
+</head>
+<body bgcolor="#434E5F" oncontextmenu="return false;" onselectstart="return false;">
+<p align="center">&nbsp;&nbsp;&nbsp;&nbsp;<span
+        style="font-size: 55px;"><strong style='color: rgb(187,187,187);'>苍山洱海</strong></span></p>
+<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span
+        style='color: rgb(187,187,187); text-transform: none; text-indent: 0px; letter-spacing: normal; font-family: "Microsoft YaHei"; font-size: 26px; font-style: normal; font-weight: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;'></span><span
+        style='color: rgb(187,187,187); text-transform: none; text-indent: 0px; letter-spacing: normal; font-family: "Microsoft YaHei"; font-size: 36px; font-style: normal; font-weight: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;'>自1983年县市合并以来，大理市先后荣获“全国双拥模范城”、“全国科技工作先进市”、“全国文化先进市”、“全国体育先进市”、“中国优秀旅游城市”、“最佳中国魅力城市”等多项荣誉称号。</span>
+</p>
+</p>
+</body>
+</html>
\ No newline at end of file
diff --git a/app/src/main/assets/news_content03.html b/app/src/main/assets/news_content03.html
new file mode 100644
index 0000000..a4f0002
--- /dev/null
+++ b/app/src/main/assets/news_content03.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title></title>
+</head>
+<body bgcolor="#434E5F" oncontextmenu="return false;" onselectstart="return false;">
+<p align="center">&nbsp;&nbsp;&nbsp;&nbsp;<span
+        style="font-size: 55px;"><strong style='color: rgb(187,187,187);'>大理欢迎您</strong></span></p>
+<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span
+        style='color: rgb(187,187,187); text-transform: none; text-indent: 0px; letter-spacing: normal; font-family: "Microsoft YaHei"; font-size: 26px; font-style: normal; font-weight: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;'></span><span
+        style='color: rgb(187,187,187); text-transform: none; text-indent: 0px; letter-spacing: normal; font-family: "Microsoft YaHei"; font-size: 36px; font-style: normal; font-weight: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;'>大理市地处云南省滇西中部，东与宾川、祥云相连，南与巍山、弥渡毗邻，西接漾濞以点苍山为界，北与洱源接壤。下关是大理白族自治州和大理市人民政府所在地，为全州政治、经济、文化中心。距省会昆明350千米。全市总面积1815平方千米。年末常用耕地面积12002公顷。</span>
+</p>
+</p>
+</body>
+</html>
\ No newline at end of file
diff --git a/app/src/main/assets/news_content04.html b/app/src/main/assets/news_content04.html
new file mode 100644
index 0000000..bd8d4be
--- /dev/null
+++ b/app/src/main/assets/news_content04.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title></title>
+</head>
+<body bgcolor="#434E5F" oncontextmenu="return false;" onselectstart="return false;">
+<p align="center">&nbsp;&nbsp;&nbsp;&nbsp;<span
+        style="font-size: 55px;"><strong style='color: rgb(187,187,187);'>云南要闻</strong></span></p>
+<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span
+        style='color: rgb(187,187,187); text-transform: none; text-indent: 0px; letter-spacing: normal; font-family: "Microsoft YaHei"; font-size: 26px; font-style: normal; font-weight: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;'></span><span
+        style='color: rgb(187,187,187); text-transform: none; text-indent: 0px; letter-spacing: normal; font-family: "Microsoft YaHei"; font-size: 36px; font-style: normal; font-weight: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;'>省政府党组（扩大）会议传达学习习近平总书记重要指示批示和重要讲话精神时强调
+坚决打好森林草原防灭火攻坚战和境外疫情输入防控阻击战 全力保障人民群众生命健康和财产安全</span>
+</p>
+</p>
+</body>
+</html>
\ No newline at end of file
diff --git a/app/src/main/assets/news_content05.html b/app/src/main/assets/news_content05.html
new file mode 100644
index 0000000..de56131
--- /dev/null
+++ b/app/src/main/assets/news_content05.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title></title>
+</head>
+<body bgcolor="#434E5F" oncontextmenu="return false;" onselectstart="return false;">
+<p align="center">&nbsp;&nbsp;&nbsp;&nbsp;<span
+        style="font-size: 55px;"><strong style='color: rgb(187,187,187);'>大理要闻</strong></span></p>
+<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span
+        style='color: rgb(187,187,187); text-transform: none; text-indent: 0px; letter-spacing: normal; font-family: "Microsoft YaHei"; font-size: 26px; font-style: normal; font-weight: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;'></span><span
+        style='color: rgb(187,187,187); text-transform: none; text-indent: 0px; letter-spacing: normal; font-family: "Microsoft YaHei"; font-size: 36px; font-style: normal; font-weight: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;'>3月24日，中共大理市纪委九届五次全体会议召开。州委常委、市委书记罗永斌出席会议并讲话。他强调，要以习近平新时代中国特色社会主义思想为指导，全面贯彻党的十九届四中全会、十九届中央纪委四次全会、省委十届九次全会、省纪委十届五次全会、州委八届五次全会、州纪委八届五次全会和市委九届九次全会精神，坚持稳中求进工作总基调，深化全面从严治党，坚持和完善党和国家监督体系，强化对权力运行的制约和监督，进一步肃清秦光荣等流毒影响，一体推进不敢腐、不能腐、不想腐，在坚持和完善中国特色社会主义制度、推进国家治理体系和治理能力现代化中，充分发挥监督保障执行、促进完善发展作用，建设高素质专业化纪检监察干部队伍，坚定不移将全面从严治党向纵深推进，为推动大理市高质量可持续发展、决胜全面建成小康社会提供坚强的纪律保障。</span>
+</p>
+</p>
+</body>
+</html>
\ No newline at end of file
diff --git a/app/src/main/assets/news_pic01.html b/app/src/main/assets/news_pic01.html
new file mode 100644
index 0000000..43181bb
--- /dev/null
+++ b/app/src/main/assets/news_pic01.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title></title>
+</head>
+<body>
+    <img src="file:///android_asset/pic1.jpg" width="1200" height="665"/>
+</body>
+</html>
\ No newline at end of file
diff --git a/app/src/main/assets/news_pic02.html b/app/src/main/assets/news_pic02.html
new file mode 100644
index 0000000..6949bf8
--- /dev/null
+++ b/app/src/main/assets/news_pic02.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title></title>
+</head>
+<body>
+    <img src="file:///android_asset/pic2.jpg" width="1200" height="665"/>
+</body>
+</html>
\ No newline at end of file
diff --git a/app/src/main/assets/news_pic03.html b/app/src/main/assets/news_pic03.html
new file mode 100644
index 0000000..afb0902
--- /dev/null
+++ b/app/src/main/assets/news_pic03.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title></title>
+</head>
+<body>
+    <img src="file:///android_asset/pic3.jpg" width="1200" height="665"/>
+</body>
+</html>
\ No newline at end of file
diff --git a/app/src/main/assets/news_pic04.html b/app/src/main/assets/news_pic04.html
new file mode 100644
index 0000000..698f2ef
--- /dev/null
+++ b/app/src/main/assets/news_pic04.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title></title>
+</head>
+<body>
+    <img src="file:///android_asset/pic4.jpg" width="1200" height="665"/>
+</body>
+</html>
\ No newline at end of file
diff --git a/app/src/main/assets/news_pic05.html b/app/src/main/assets/news_pic05.html
new file mode 100644
index 0000000..9c55621
--- /dev/null
+++ b/app/src/main/assets/news_pic05.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title></title>
+</head>
+<body>
+    <img src="file:///android_asset/pic5.jpg" width="1200" height="665"/>
+</body>
+</html>
\ No newline at end of file
diff --git a/app/src/main/assets/pic1.jpg b/app/src/main/assets/pic1.jpg
new file mode 100644
index 0000000..325cc2b
--- /dev/null
+++ b/app/src/main/assets/pic1.jpg
Binary files differ
diff --git a/app/src/main/assets/pic2.jpg b/app/src/main/assets/pic2.jpg
new file mode 100644
index 0000000..af560dc
--- /dev/null
+++ b/app/src/main/assets/pic2.jpg
Binary files differ
diff --git a/app/src/main/assets/pic3.jpg b/app/src/main/assets/pic3.jpg
new file mode 100644
index 0000000..b76dd67
--- /dev/null
+++ b/app/src/main/assets/pic3.jpg
Binary files differ
diff --git a/app/src/main/assets/pic4.jpg b/app/src/main/assets/pic4.jpg
new file mode 100644
index 0000000..f014122
--- /dev/null
+++ b/app/src/main/assets/pic4.jpg
Binary files differ
diff --git a/app/src/main/assets/pic5.jpg b/app/src/main/assets/pic5.jpg
new file mode 100644
index 0000000..7adb1fe
--- /dev/null
+++ b/app/src/main/assets/pic5.jpg
Binary files differ
diff --git a/app/src/main/java/com/supwisdom/bean/AttRateBean.java b/app/src/main/java/com/supwisdom/bean/AttRateBean.java
new file mode 100644
index 0000000..978259f
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/bean/AttRateBean.java
@@ -0,0 +1,31 @@
+package com.supwisdom.bean;
+
+public class AttRateBean extends BaseResp {
+    private int totcnt;
+    private int actualcnt;
+    private double attrate;
+
+    public int getTotcnt() {
+        return totcnt;
+    }
+
+    public void setTotcnt(int totcnt) {
+        this.totcnt = totcnt;
+    }
+
+    public int getActualcnt() {
+        return actualcnt;
+    }
+
+    public void setActualcnt(int actualcnt) {
+        this.actualcnt = actualcnt;
+    }
+
+    public double getAttrate() {
+        return attrate;
+    }
+
+    public void setAttrate(double attrate) {
+        this.attrate = attrate;
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/bean/BaseResp.java b/app/src/main/java/com/supwisdom/bean/BaseResp.java
new file mode 100644
index 0000000..a2fda13
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/bean/BaseResp.java
@@ -0,0 +1,40 @@
+package com.supwisdom.bean;
+
+public class BaseResp {
+    private int retcode;
+    private String retmsg;
+    private String exception;
+
+    public BaseResp() {
+
+    }
+
+    public BaseResp(int retcode, String retmsg) {
+        this.retcode = retcode;
+        this.retmsg = retmsg;
+    }
+
+    public int getRetcode() {
+        return retcode;
+    }
+
+    public void setRetcode(int retcode) {
+        this.retcode = retcode;
+    }
+
+    public String getRetmsg() {
+        return retmsg;
+    }
+
+    public void setRetmsg(String retmsg) {
+        this.retmsg = retmsg;
+    }
+
+    public String getException() {
+        return exception;
+    }
+
+    public void setException(String exception) {
+        this.exception = exception;
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/bean/CheckDtlBean.java b/app/src/main/java/com/supwisdom/bean/CheckDtlBean.java
new file mode 100644
index 0000000..0b78070
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/bean/CheckDtlBean.java
@@ -0,0 +1,49 @@
+package com.supwisdom.bean;
+
+public class CheckDtlBean{
+    private String custname;
+    private String attstatus;
+    private String atttime;
+    private String deptname;
+    private String custtypename;
+
+    public String getCustname() {
+        return custname;
+    }
+
+    public void setCustname(String custname) {
+        this.custname = custname;
+    }
+
+    public String getAttstatus() {
+        return attstatus;
+    }
+
+    public void setAttstatus(String attstatus) {
+        this.attstatus = attstatus;
+    }
+
+    public String getAtttime() {
+        return atttime;
+    }
+
+    public void setAtttime(String atttime) {
+        this.atttime = atttime;
+    }
+
+    public String getDeptname() {
+        return deptname;
+    }
+
+    public void setDeptname(String deptname) {
+        this.deptname = deptname;
+    }
+
+    public String getCusttypename() {
+        return custtypename;
+    }
+
+    public void setCusttypename(String custtypename) {
+        this.custtypename = custtypename;
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/bean/CheckDtlResp.java b/app/src/main/java/com/supwisdom/bean/CheckDtlResp.java
new file mode 100644
index 0000000..5cc27a5
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/bean/CheckDtlResp.java
@@ -0,0 +1,24 @@
+package com.supwisdom.bean;
+
+import java.util.List;
+
+public class CheckDtlResp extends BaseResp {
+    private int count;
+    private List<CheckDtlBean> peoplelist;
+
+    public int getCount() {
+        return count;
+    }
+
+    public void setCount(int count) {
+        this.count = count;
+    }
+
+    public List<CheckDtlBean> getPeoplelist() {
+        return peoplelist;
+    }
+
+    public void setPeoplelist(List<CheckDtlBean> peoplelist) {
+        this.peoplelist = peoplelist;
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/bean/ConferenceBean.java b/app/src/main/java/com/supwisdom/bean/ConferenceBean.java
new file mode 100644
index 0000000..0eb7d22
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/bean/ConferenceBean.java
@@ -0,0 +1,85 @@
+package com.supwisdom.bean;
+
+public class ConferenceBean {
+    private int confid;
+    private String confname;
+    private String conftype;
+    private String confdate;
+    private String status;
+    private String starttime;
+    private String endtime;
+    private String attendtime;
+    private String confarea;
+
+    public int getConfid() {
+        return confid;
+    }
+
+    public void setConfid(int confid) {
+        this.confid = confid;
+    }
+
+    public String getConfname() {
+        return confname;
+    }
+
+    public void setConfname(String confname) {
+        this.confname = confname;
+    }
+
+    public String getConftype() {
+        return conftype;
+    }
+
+    public void setConftype(String conftype) {
+        this.conftype = conftype;
+    }
+
+    public String getConfdate() {
+        return confdate;
+    }
+
+    public void setConfdate(String confdate) {
+        this.confdate = confdate;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getStarttime() {
+        return starttime;
+    }
+
+    public void setStarttime(String starttime) {
+        this.starttime = starttime;
+    }
+
+    public String getEndtime() {
+        return endtime;
+    }
+
+    public void setEndtime(String endtime) {
+        this.endtime = endtime;
+    }
+
+    public String getAttendtime() {
+        return attendtime;
+    }
+
+    public void setAttendtime(String attendtime) {
+        this.attendtime = attendtime;
+    }
+
+    public String getConfarea() {
+        return confarea;
+    }
+
+    public void setConfarea(String confarea) {
+        this.confarea = confarea;
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/bean/ConferenceResp.java b/app/src/main/java/com/supwisdom/bean/ConferenceResp.java
new file mode 100644
index 0000000..2ed9163
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/bean/ConferenceResp.java
@@ -0,0 +1,24 @@
+package com.supwisdom.bean;
+
+import java.util.List;
+
+public class ConferenceResp extends BaseResp {
+    private int count;
+    private List<ConferenceBean> conflist;
+
+    public int getCount() {
+        return count;
+    }
+
+    public void setCount(int count) {
+        this.count = count;
+    }
+
+    public List<ConferenceBean> getConflist() {
+        return conflist;
+    }
+
+    public void setConflist(List<ConferenceBean> conflist) {
+        this.conflist = conflist;
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/conferencecheck/CrashHandler.java b/app/src/main/java/com/supwisdom/conferencecheck/CrashHandler.java
new file mode 100644
index 0000000..5e22aad
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/conferencecheck/CrashHandler.java
@@ -0,0 +1,126 @@
+package com.supwisdom.conferencecheck;
+
+import android.content.Context;
+import android.os.Build;
+import android.os.Looper;
+
+import com.supwisdom.util.AppExitUtil;
+import com.supwisdom.util.CommonUtil;
+import com.supwisdom.util.FileUtil;
+import com.supwisdom.util.ThreadPool;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by zzq on 2016-11-22.
+ */
+
+public class CrashHandler implements Thread.UncaughtExceptionHandler {
+    private static CrashHandler INSTANCE = new CrashHandler();
+    private Context context;
+    private Thread.UncaughtExceptionHandler mDefaultHandler;
+    private Map<String, String> info = new HashMap<String, String>();
+
+    private CrashHandler() {
+
+    }
+
+    public static CrashHandler getInstance() {
+        return INSTANCE;
+    }
+
+    public void init(Context context) {
+        this.context = context;
+        // 获取系统默认的 UncaughtException 处理器
+        mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
+        // 设置该 CrashHandler 为程序的默认处理器
+        Thread.setDefaultUncaughtExceptionHandler(this);
+    }
+
+    @Override
+    public void uncaughtException(Thread thread, Throwable ex) {
+        if (!handleException(ex) && mDefaultHandler != null) {
+            // 如果自定义的没有处理则让系统默认的异常处理器来处理
+            mDefaultHandler.uncaughtException(thread, ex);
+        } else {
+            AppExitUtil.exit();
+        }
+    }
+
+    /**
+     * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
+     *
+     * @param ex 异常信息
+     * @return true 如果处理了该异常信息;否则返回false.
+     */
+    private boolean handleException(Throwable ex) {
+        if (ex == null)
+            return false;
+        ThreadPool.getShortPool().execute(new Runnable() {
+            @Override
+            public void run() {
+                CommonUtil.doSleep(500);
+                try {
+                    Looper.prepare();
+                    //SWToast.show(context, "很抱歉,程序运行异常", PublicDef.TOAST_SHOW_CRY);
+                    Looper.loop();
+                } catch (Exception e) {
+                }
+            }
+        });
+        // 收集设备参数信息
+        collectDeviceInfo();
+        // 保存日志文件
+        saveCrashInfo2File(ex);
+        return true;
+    }
+
+    /**
+     * 收集设备参数信息
+     */
+
+    public void collectDeviceInfo() {
+        info.put("versionName", CommonUtil.getVersionName(context));
+
+        Field[] fields = Build.class.getDeclaredFields();// 反射机制
+        for (Field field : fields) {
+            try {
+                field.setAccessible(true);
+                info.put(field.getName(), field.get("").toString());
+            } catch (IllegalArgumentException e) {
+                e.printStackTrace();
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    private boolean saveCrashInfo2File(Throwable ex) {
+        StringBuffer sb = new StringBuffer();
+        sb.append("\r\n crash time : ").append(CommonUtil.getNowDate()).append("\r\n");
+        for (Map.Entry<String, String> entry : info.entrySet()) {
+            String key = entry.getKey();
+            String value = entry.getValue();
+            sb.append(key + "=" + value + "\r\n");
+        }
+        Writer writer = new StringWriter();
+        PrintWriter pw = new PrintWriter(writer);
+        ex.printStackTrace(pw);
+        Throwable cause = ex.getCause();
+        // 循环着把所有的异常信息写入writer中
+        while (cause != null) {
+            cause.printStackTrace(pw);
+            cause = cause.getCause();
+        }
+        pw.close();// 记得关闭
+        String result = writer.toString();
+        sb.append(result);
+        FileUtil.writeCrashFile(sb.toString());
+        return true;
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/conferencecheck/SPApplication.java b/app/src/main/java/com/supwisdom/conferencecheck/SPApplication.java
new file mode 100644
index 0000000..1ab696a
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/conferencecheck/SPApplication.java
@@ -0,0 +1,53 @@
+package com.supwisdom.conferencecheck;
+
+import android.app.Application;
+
+import com.supwisdom.service.ConferenceApi;
+import com.supwisdom.swterm.Pos;
+
+public class SPApplication extends Application {
+    private static SPApplication sInstance;
+    private ConferenceApi conferenceApi;
+    private Pos mPos;
+    private boolean epayLinking; //链路状态 true 联机
+
+    public static SPApplication getsInstance() {
+        return sInstance;
+    }
+
+    public boolean isEpayLinking() {
+        return epayLinking;
+    }
+
+    public void setEpayLinking(boolean online) {
+        if (online) {
+            this.epayLinking = true;
+        } else {
+            this.epayLinking = false;
+        }
+    }
+
+    public ConferenceApi getApi(){
+        return conferenceApi;
+    }
+
+    public Pos getPos() {
+        if (mPos == null) {
+            synchronized (SPApplication.class) {
+                if (mPos == null) {
+                    mPos = new Pos(getApplicationContext());
+                }
+            }
+        }
+        return mPos;
+    }
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        sInstance = this;
+        conferenceApi = new ConferenceApi();
+        CrashHandler.getInstance().init(getApplicationContext());
+    }
+
+}
diff --git a/app/src/main/java/com/supwisdom/conferencecheck/YktSession.java b/app/src/main/java/com/supwisdom/conferencecheck/YktSession.java
new file mode 100644
index 0000000..68cb391
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/conferencecheck/YktSession.java
@@ -0,0 +1,112 @@
+package com.supwisdom.conferencecheck;
+
+import com.supwisdom.okhttp.NetworkHandler;
+import com.supwisdom.okhttp.TransResp;
+import com.supwisdom.okhttp.WebAPISession;
+import com.supwisdom.okhttp.WebParams;
+import com.supwisdom.util.CommonUtil;
+import com.supwisdom.util.Encrypt;
+import com.supwisdom.util.PublicDef;
+
+/**
+ * Copyright (C), 2000-2013, Supwisdom Co., Ltd.
+ * File custname: com.supwisdom.ecardterm
+ * Description: TODO Modify History（或Change Log）:
+ * 操作类型（创建、修改等） 操作日期 操作者 操作内容简述
+ * 创建 13-4-22 tangcheng
+ * <p/>
+ *
+ * @author tangcheng
+ * @version 1.0
+ * @since 1.0
+ */
+public class YktSession {
+    /**
+     * YktSession 实例
+     */
+    private static YktSession yktSession = null;
+    private WebAPISession mSession;
+
+    private YktSession() {
+        mSession = new WebAPISession();
+    }
+
+    /**
+     * Create YktSession instance
+     *
+     * @return YktSession object
+     */
+    public static synchronized YktSession getInstance() {
+        if (null == yktSession) {
+            synchronized (YktSession.class) {
+                if (null == yktSession) {
+                    yktSession = new YktSession();
+                }
+            }
+        }
+        return yktSession;
+    }
+
+    public void setSessionKey(String sessionKey) {
+        mSession.setSessionKey(sessionKey);
+    }
+
+
+    // 设置通信参数
+    public void setWebAPISession(String epayIP, int epayPort, String uri, String termid, int commTime) {
+        StringBuilder sb = new StringBuilder();
+        if (epayIP.startsWith("http")) {
+            sb.append(epayIP);
+        } else {
+            sb.append("http://").append(epayIP);
+        }
+        sb.append(":").append(epayPort).append("/").append(uri).append("/api");
+
+        mSession.setEpayurl(sb.toString());
+        mSession.setTermId(termid);
+        NetworkHandler.getInstance().setCommTime(commTime);
+    }
+
+    public WebAPISession getWebAPISession() {
+        return mSession;
+    }
+
+    public TransResp sendYktRequestPost(String uri, WebParams params) {
+        String url = mSession.getEpayurl() + uri;
+        return NetworkHandler.getInstance().post(url, params);
+    }
+
+    // post
+    public TransResp sendYktRequestPost2(String uri, String signdata, WebParams params) {
+        String timestamp = CommonUtil.getNowDateTimeNoFormat();
+        String temp = signdata.replaceAll("null", "");
+        String mysign = calcSignForCardPay(temp, timestamp);
+        params.setParameter("sign", mysign)
+                .setParameter("sign_method", PublicDef.signMethod)
+                .setParameter("term_id", mSession.getTermId())
+                .setParameter("app_id", mSession.getAppId())
+                .setParameter("timestamp", timestamp);
+        String url = mSession.getEpayurl() + uri;
+        return NetworkHandler.getInstance().post(url, params);
+    }
+
+    public TransResp sendYktRequestLongPost(String uri, String signdata, WebParams params) {
+        String timestamp = CommonUtil.getNowDateTimeNoFormat();
+        String temp = signdata.replaceAll("null", "");
+        String mysign = calcSignForCardPay(temp, timestamp);
+        params.setParameter("sign", mysign)
+                .setParameter("sign_method", PublicDef.signMethod)
+                .setParameter("term_id", mSession.getTermId())
+                .setParameter("app_id", mSession.getAppId())
+                .setParameter("timestamp", timestamp);
+        String url = mSession.getEpayurl() + uri;
+        return NetworkHandler.getInstance().longPost(url, params);
+    }
+
+    private String calcSignForCardPay(String extdata, String nTimestamp) {
+        String signData = extdata + nTimestamp + mSession.getSessionKey();
+        String mySign = Encrypt.HMACSHA1(signData, mSession.getAppSecret());
+        return mySign.toLowerCase();
+    }
+}
+
diff --git a/app/src/main/java/com/supwisdom/conferencecheck/activity/BackgroundProcess.java b/app/src/main/java/com/supwisdom/conferencecheck/activity/BackgroundProcess.java
new file mode 100644
index 0000000..2082052
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/conferencecheck/activity/BackgroundProcess.java
@@ -0,0 +1,8 @@
+package com.supwisdom.conferencecheck.activity;
+
+public class BackgroundProcess extends Thread {
+    @Override
+    public void run(){
+
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/conferencecheck/activity/BaseActivity.java b/app/src/main/java/com/supwisdom/conferencecheck/activity/BaseActivity.java
new file mode 100644
index 0000000..4c2a036
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/conferencecheck/activity/BaseActivity.java
@@ -0,0 +1,30 @@
+package com.supwisdom.conferencecheck.activity;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+
+import com.supwisdom.util.AppExitUtil;
+
+public class BaseActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState){
+        super.onCreate(savedInstanceState);
+        AppExitUtil.add(this);
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        AppExitUtil.remove(this);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+    }
+
+    public <T> void jumpActivity(Class<T> cls) {
+        startActivity(new Intent(getApplicationContext(), cls));
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/conferencecheck/activity/CheckDetailActivity.java b/app/src/main/java/com/supwisdom/conferencecheck/activity/CheckDetailActivity.java
new file mode 100644
index 0000000..7ec21ed
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/conferencecheck/activity/CheckDetailActivity.java
@@ -0,0 +1,182 @@
+package com.supwisdom.conferencecheck.activity;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+import com.supwisdom.bean.BaseResp;
+import com.supwisdom.bean.CheckDtlBean;
+import com.supwisdom.bean.CheckDtlResp;
+import com.supwisdom.conferencecheck.R;
+import com.supwisdom.conferencecheck.SPApplication;
+import com.supwisdom.util.CommonUtil;
+import com.supwisdom.util.Constants;
+import com.supwisdom.util.PublicDef;
+import java.util.List;
+
+public class CheckDetailActivity extends BaseActivity{
+    private PaginationAdapter adapter;
+    private ListView listView;
+    private List<CheckDtlBean> checkRecordList;
+    private View v_back;
+    private TextView v_msg;
+    private String now = "";
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_checkdetail);
+        listView = findViewById(R.id.check_list);
+        v_msg = findViewById(R.id.vmsg);
+        v_back = findViewById(R.id.back_btn);
+        v_back.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                jumpActivity(MainActivity.class);
+            }
+        });
+        now = CommonUtil.getNowDateNoFormat();
+        adapter = new PaginationAdapter(this);
+        listView.setAdapter(adapter);
+    }
+
+    protected void onResume(){
+        new AsyncGetDtl().execute();
+        super.onResume();
+    }
+
+    private class AsyncGetDtl extends AsyncTask<Void, Void, BaseResp> {
+        @Override
+        protected void onPreExecute(){
+            v_msg.setText("正在查询，请稍后");
+            v_msg.setVisibility(View.VISIBLE);
+            super.onPreExecute();
+        }
+        @Override
+        protected BaseResp doInBackground(Void... voids){
+            CheckDtlResp checkDtlResp = SPApplication.getsInstance().getApi().getCheckDtl(Constants.CURRENTCONFID);
+            if(checkDtlResp.getRetcode() == PublicDef.SUCCESS){
+                checkRecordList = checkDtlResp.getPeoplelist();
+                return new BaseResp(PublicDef.SUCCESS, "success");
+            }else{
+                checkRecordList = null;
+                return new BaseResp(PublicDef.ERROR, "failure");
+            }
+        }
+
+        @Override
+        protected void onPostExecute(BaseResp resp){
+            if(resp.getRetcode() == PublicDef.SUCCESS){
+                if(null == checkRecordList || checkRecordList.size() == 0){
+                    v_msg.setText("没有签到流水");
+                }else{
+                    v_msg.setVisibility(View.GONE);
+                }
+            }else{
+                v_msg.setText("查询失败，请稍后重试");
+            }
+            adapter.notifyDataSetChanged();
+            super.onPostExecute(resp);
+        }
+    }
+
+    /**
+     * 自定义adapter
+     */
+    private class PaginationAdapter extends BaseAdapter {
+        private Context context;
+
+        public PaginationAdapter(Context context){
+            this.context = context;
+        }
+
+        @Override
+        public int getCount() {
+            if(null != checkRecordList)
+                return checkRecordList.size();
+            else
+                return 0;
+        }
+
+        @Override
+        public Object getItem(int position) {
+            if(null != checkRecordList)
+                return checkRecordList.get(position);
+            else
+                return null;
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return position;
+        }
+
+        @Override
+        public View getView(int position, View view, ViewGroup parent) {
+            Holder holder;
+            if(view == null){
+                view = View.inflate(context, R.layout.list_item, null);
+                holder = new Holder();
+                holder.custname = (TextView) view.findViewById(R.id.classitem1);
+                holder.custtypename = (TextView) view.findViewById(R.id.classitem2);
+                holder.deptname = (TextView) view.findViewById(R.id.classitem3);
+                holder.date = (TextView) view.findViewById(R.id.classitem4);
+                holder.time = (TextView) view.findViewById(R.id.classitem5);
+                holder.status = (TextView) view.findViewById(R.id.classitem6);
+                view.setTag(holder);
+            }else{
+                holder = (Holder) view.getTag();
+            }
+            if(null != checkRecordList && checkRecordList.size() > 0){
+                if(position % 2 == 0) {
+                    view.setBackgroundColor(Color.parseColor("#434E5F"));
+                }
+                CheckDtlBean record = checkRecordList.get(position);
+                holder.custname.setText(record.getCustname());
+                holder.custtypename.setText(record.getCusttypename());
+                holder.deptname.setText(record.getDeptname());
+                holder.date.setText(CommonUtil.formatDate(now));
+                holder.time.setText(CommonUtil.formatTime(record.getAtttime()));
+                if(record.getAttstatus().equals(PublicDef.ATTENDSTATUS_CHECKED)){
+                    holder.status.setTextColor(getResources().getColor(R.color.class_status1));
+                    holder.status.setText("正常签到");
+                } else if(record.getAttstatus().equals(PublicDef.ATTENDSTATUS_UNCHECK)){
+                    holder.status.setTextColor(getResources().getColor(R.color.red_1));
+                    holder.status.setText("未签到");
+                } else if(record.getAttstatus().equals(PublicDef.ATTENDSTATUS_LATE)){
+                    holder.status.setTextColor(getResources().getColor(R.color.red_1));
+                    holder.status.setText("迟到");
+                } else if(record.getAttstatus().equals(PublicDef.ATTENDSTATUS_INSTEAD)){
+                    holder.status.setTextColor(getResources().getColor(R.color.class_status1));
+                    holder.status.setText("代签");
+                } else if(record.getAttstatus().equals(PublicDef.ATTENDSTATUS_CLOSED)){
+                    holder.status.setTextColor(getResources().getColor(R.color.red_1));
+                    holder.status.setText("关闭");
+                } else if(record.getAttstatus().equals(PublicDef.ATTENDSTATUS_HAND)){
+                    holder.status.setTextColor(getResources().getColor(R.color.class_status1));
+                    holder.status.setText("手工签到");
+                }else{
+                    holder.status.setTextColor(getResources().getColor(R.color.red_1));
+                    holder.status.setText("未知");
+                }
+
+            }
+            return view;
+        }
+
+        private class Holder {
+            public TextView custname;
+            public TextView custtypename;
+            public TextView deptname;
+            public TextView date;
+            public TextView time;
+            public TextView status;
+        }
+    }
+
+}
diff --git a/app/src/main/java/com/supwisdom/conferencecheck/activity/ConferenceQueryActivity.java b/app/src/main/java/com/supwisdom/conferencecheck/activity/ConferenceQueryActivity.java
new file mode 100644
index 0000000..c1924cf
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/conferencecheck/activity/ConferenceQueryActivity.java
@@ -0,0 +1,144 @@
+package com.supwisdom.conferencecheck.activity;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.DatePicker;
+import android.widget.ListView;
+import android.widget.TextView;
+import com.supwisdom.conferencecheck.R;
+import com.supwisdom.conferencecheck.SPApplication;
+import com.supwisdom.swterm.ConferenceRecord;
+import com.supwisdom.swterm.Pos;
+import com.supwisdom.util.CommonUtil;
+import com.supwisdom.util.PublicDef;
+
+import java.util.List;
+
+public class ConferenceQueryActivity extends BaseActivity{
+    private Pos pos = SPApplication.getsInstance().getPos();
+    private DatePicker datePicker;
+    private PaginationAdapter adapter;
+    private ListView listView;
+    private List<ConferenceRecord> list = null;
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_conference);
+        initView();
+    }
+
+    private void initView(){
+        datePicker = findViewById(R.id.date);
+        listView = findViewById(R.id.conference_list);
+        View exit = findViewById(R.id.back_btn);
+        exit.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                jumpActivity(ManageActivity.class);
+            }
+        });
+        View query = findViewById(R.id.query);
+        query.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                query();
+            }
+        });
+        adapter = new PaginationAdapter(this);
+        listView.setAdapter(adapter);
+    }
+
+    private void query(){
+        String year = datePicker.getYear()+"";
+        String month = format(datePicker.getMonth()+1);
+        String day = format(datePicker.getDayOfMonth());
+        list = pos.getConferences(year + month + day);
+        adapter.notifyDataSetChanged();
+
+    }
+
+    private String format(int in){
+        if(in < 10)
+            return "0"+in;
+        return in+"";
+    }
+
+    /**
+     * 自定义adapter
+     */
+    private class PaginationAdapter extends BaseAdapter {
+        private Context context;
+
+        public PaginationAdapter(Context context){
+            this.context = context;
+        }
+
+        @Override
+        public int getCount() {
+            if(null != list)
+                return list.size();
+            else
+                return 0;
+        }
+
+        @Override
+        public Object getItem(int position) {
+            if(null != list)
+                return list.get(position);
+            else
+                return null;
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return position;
+        }
+
+        @Override
+        public View getView(int position, View view, ViewGroup parent) {
+            Holder holder;
+            if(view == null){
+                view = View.inflate(context, R.layout.list_item_2, null);
+                holder = new Holder();
+                holder.confname = (TextView) view.findViewById(R.id.classitem1);
+                holder.confdate = (TextView) view.findViewById(R.id.classitem2);
+                holder.conftime = (TextView) view.findViewById(R.id.classitem3);
+                holder.confsigntime = (TextView) view.findViewById(R.id.classitem4);
+                holder.confaddr = (TextView) view.findViewById(R.id.classitem5);
+                holder.conftype = (TextView) view.findViewById(R.id.classitem6);
+                view.setTag(holder);
+            }else{
+                holder = (Holder) view.getTag();
+            }
+            if(null != list && list.size() > 0){
+                if(position % 2 == 0) {
+                    view.setBackgroundColor(Color.parseColor("#434E5F"));
+                }
+                ConferenceRecord record = list.get(position);
+                holder.confname.setText(record.getConfname());
+                holder.confdate.setText(CommonUtil.formatDate(record.getConfdate()));
+                holder.conftime.setText(CommonUtil.formatTime(record.getConfbegintime())+"-"+CommonUtil.formatTime(record.getConfendtime()));
+                holder.confsigntime.setText(CommonUtil.formatTime(record.getConfsigntime()));
+                holder.confaddr.setText(record.getConfaddr());
+                if(record.getConftype().equals(PublicDef.LIST_TYPE))
+                    holder.conftype.setText("有名单会议");
+                else
+                    holder.conftype.setText("无名单会议");
+            }
+            return view;
+        }
+
+        private class Holder {
+            public TextView confname;
+            public TextView confdate;
+            public TextView conftime;
+            public TextView confsigntime;
+            public TextView confaddr;
+            public TextView conftype;
+        }
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/conferencecheck/activity/ConfigActivity.java b/app/src/main/java/com/supwisdom/conferencecheck/activity/ConfigActivity.java
new file mode 100644
index 0000000..9fb6dd9
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/conferencecheck/activity/ConfigActivity.java
@@ -0,0 +1,161 @@
+package com.supwisdom.conferencecheck.activity;
+
+import android.content.ComponentName;
+import android.content.Intent;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import com.supwisdom.bean.BaseResp;
+import com.supwisdom.conferencecheck.R;
+import com.supwisdom.conferencecheck.SPApplication;
+import com.supwisdom.conferencecheck.YktSession;
+import com.supwisdom.swterm.ConfigParaRecord;
+import com.supwisdom.swterm.ControlParaRecord;
+import com.supwisdom.swterm.Pos;
+import com.supwisdom.util.CommonUtil;
+import com.supwisdom.util.PublicDef;
+import com.supwisdom.view.SWToast;
+
+public class ConfigActivity extends BaseActivity{
+    private EditText vDevphyid;
+    private EditText vServerIp;
+    private EditText vUri;
+    private EditText vPort;
+    private TextView vSave, vSet, vMsg;
+    private Pos pos = SPApplication.getsInstance().getPos();
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_config);
+        initView();
+        initData();
+    }
+
+    private void initView(){
+        vMsg = findViewById(R.id.tv_msg);
+        vDevphyid = findViewById(R.id.tv_devphyid);
+        vServerIp = findViewById(R.id.tv_server_ip);
+        vUri = findViewById(R.id.tv_uri_root);
+        vPort = findViewById(R.id.tv_server_port);
+        vSave = findViewById(R.id.btn_save);
+        vSave.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                saveConfig(CommonUtil.getEditView(vDevphyid), CommonUtil.getEditView(vServerIp),
+                        CommonUtil.getEditView(vUri), CommonUtil.getEditView(vPort));
+            }
+        });
+        vSet = findViewById(R.id.btn_set);
+        vSet.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Intent intent = new Intent("/");
+                ComponentName cm = new ComponentName("com.android.settings","com.android.settings.Settings");
+                intent.setComponent(cm);
+                intent.setAction("android.intent.action.VIEW");
+                startActivityForResult(intent, 0);
+            }
+        });
+    }
+
+    private void initData(){
+        ConfigParaRecord record = pos.getConfigPara();
+        if(null == record){
+            record = new ConfigParaRecord();
+            record.setMode(1);
+            record.setDevphyid("12345678ABCD");
+            record.setEpayIP("127.0.0.1");
+            record.setEpayUri("door");
+            record.setEpayPort(8080);
+        }
+        record.setInitOK(false);
+        pos.replaceConfigPara(record);
+        ConfigParaRecord cfgRecord = pos.getConfigPara();
+        vDevphyid.setText(cfgRecord.getDevphyid());
+        vServerIp.setText(cfgRecord.getEpayIP());
+        vUri.setText(cfgRecord.getEpayUri());
+        vPort.setText(cfgRecord.getEpayPort()+"");
+    }
+
+    private void saveConfig(String devphyid, String serverip, String uri, String port){
+        ConfigParaRecord record = pos.getConfigPara();
+        record.setMode(1);
+        record.setDevphyid(devphyid);
+        if(CommonUtil.isEmpty(devphyid)){
+            SWToast.show(this, "终端机编号不能为空！", PublicDef.TOAST_SHOW_DOUBT);
+            return;
+        }
+        record.setDevphyid(devphyid.replace(" ", ""));
+        if(CommonUtil.isEmpty(serverip)){
+            SWToast.show(this, "服务器IP不能为空！", PublicDef.TOAST_SHOW_DOUBT);
+            return;
+        }
+        record.setEpayIP(serverip.replace(" ", ""));
+        try {
+            int tmpPort = Integer.valueOf(port);
+            if (tmpPort > 65535) {
+                SWToast.show(this, "端口不能大于65535！", PublicDef.TOAST_SHOW_DOUBT);
+                return;
+            }
+            record.setEpayPort(tmpPort);
+        } catch (Exception e) {
+            SWToast.show(this, "端口不合法,请确认！", PublicDef.TOAST_SHOW_DOUBT);
+            return;
+        }
+        if (CommonUtil.isEmpty(uri)) {
+            SWToast.show(this, "URI不能为空！", PublicDef.TOAST_SHOW_DOUBT);
+            return;
+        }
+        record.setInitOK(false);
+        record.setEpayUri(uri.replace(" ", ""));
+        pos.replaceConfigPara(record);
+        YktSession.getInstance().setWebAPISession(record.getEpayIP(), record.getEpayPort(), record.getEpayUri(), record.getDevphyid(), 2);
+        LinkTask link = new LinkTask();
+        link.execute();
+    }
+
+    private class LinkTask extends AsyncTask<Void, Void, BaseResp>{
+        @Override
+        protected void onPreExecute() {
+            vMsg.setText("正在加载");
+            super.onPreExecute();
+        }
+
+        @Override
+        protected BaseResp doInBackground(Void... params){
+            BaseResp resp = SPApplication.getsInstance().getApi().checkLink();
+            if(resp.getRetcode() != PublicDef.SUCCESS){
+                return resp;
+            }
+            resp = SPApplication.getsInstance().getApi().syncConference(CommonUtil.getNowDateNoFormat());
+            if(resp.getRetcode() != PublicDef.SUCCESS){
+                return resp;
+            }
+            ConfigParaRecord record = pos.getConfigPara();
+            record.setInitOK(true);
+            pos.replaceConfigPara(record);
+            ControlParaRecord controlParaRecord = pos.getControlPara(PublicDef.CONTROL_HAS_REGISTER);
+            if(null == controlParaRecord){
+                controlParaRecord = new ControlParaRecord(PublicDef.CONTROL_HAS_REGISTER, "1");
+            }
+            controlParaRecord.setValue("1");
+            pos.replaceControlPara(controlParaRecord);
+            return resp;
+        }
+
+        @Override
+        protected void onPostExecute(BaseResp result){
+            if(result.getRetcode() == PublicDef.SUCCESS){
+                vMsg.setText("加载成功");
+                jumpActivity(MainActivity.class);
+            }else{
+                vMsg.setText(result.getRetcode() + ":" +result.getRetmsg());
+            }
+            super.onPostExecute(result);
+        }
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/conferencecheck/activity/MainActivity.java b/app/src/main/java/com/supwisdom/conferencecheck/activity/MainActivity.java
new file mode 100644
index 0000000..c55ea5d
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/conferencecheck/activity/MainActivity.java
@@ -0,0 +1,446 @@
+package com.supwisdom.conferencecheck.activity;
+
+import android.content.ComponentName;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.supwisdom.bean.AttRateBean;
+import com.supwisdom.bean.BaseResp;
+import com.supwisdom.conferencecheck.R;
+import com.supwisdom.conferencecheck.SPApplication;
+import com.supwisdom.conferencecheck.YktSession;
+import com.supwisdom.conferencecheck.view.PasswdDialog;
+import com.supwisdom.swterm.ConferenceRecord;
+import com.supwisdom.swterm.ConfigParaRecord;
+import com.supwisdom.swterm.Pos;
+import com.supwisdom.util.CommonUtil;
+import com.supwisdom.util.Constants;
+import com.supwisdom.util.LogUtil;
+import com.supwisdom.util.PublicDef;
+import com.supwisdom.util.QRCodeUtil;
+
+public class MainActivity extends BaseActivity{
+    private String TAG = "Conference";
+
+    private WebView webView_Pic_1, webView_Content_1;
+    private WebView webView_Pic_2, webView_Content_2;
+    private WebView webView_Pic_3, webView_Content_3;
+
+    private TextView vConfname, vConftime, vConfaddr, vConfSigntime, vConftype, vNetStatus, v_yd,v_sd,v_rate,v_qrcode_hint;
+    private ImageView vNetLogo, vQrcode;
+
+    private PasswdDialog dialogPasswd = null;
+
+    private View v_detail,v_tip;
+    private TextView v_week,v_date,v_time;
+
+    private boolean hasHeart = false; // 心跳线程
+    private Handler handler;
+
+    private Bitmap bitmap;
+
+    private Pos pos;
+    private String qrcode_url = "";
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_main);
+        initView();
+        initData();
+    }
+
+    private class UpdateService extends Thread{
+        @Override
+        public void run(){
+            while(hasHeart){
+                String now = CommonUtil.getNowDateNoFormat();
+                sendMsgDefault(PublicDef.MSG_SHOWTIME);
+                if(CommonUtil.isNetWorkConnected(MainActivity.this)){
+                    BaseResp resp = SPApplication.getsInstance().getApi().checkLink();
+                    if(resp.getRetcode() == PublicDef.SUCCESS){
+                        SPApplication.getsInstance().setEpayLinking(true);
+                        SPApplication.getsInstance().getApi().syncConference(now);
+                    }else{
+                        SPApplication.getsInstance().setEpayLinking(false);
+                    }
+                }else{
+                    SPApplication.getsInstance().setEpayLinking(false);
+                }
+                sendMsgDefault(PublicDef.MSG_SHOWNETSTATUS);
+                ConferenceRecord confRecord = pos.getConference(now, CommonUtil.getNowTimeNoFormat2());
+                if(null != confRecord){
+                    Constants.CURRENTCONFID = confRecord.getConfid();
+                    try{
+                        bitmap = QRCodeUtil.CreateTwoDCode(qrcode_url+"/conference/doattend?confid="+confRecord.getConfid()+"&devphyid="+pos.getConfigPara().getDevphyid()+"&timestamp="+CommonUtil.getNowDateTimeNoFormat(), 250);
+                    }catch (Exception e){
+                        bitmap = null;
+                        e.printStackTrace();
+                        LogUtil.d(TAG, "CreateTwoDCode Exception: "+ e.getMessage());
+                    }
+                    if(SPApplication.getsInstance().isEpayLinking()){
+                        AttRateBean attRateBean = SPApplication.getsInstance().getApi().getAttrate(confRecord.getConfid());
+                        if(attRateBean.getRetcode() == PublicDef.SUCCESS){
+                            if(confRecord.getConftype().equals(PublicDef.LIST_TYPE))
+                                sendMsgDefault(PublicDef.MSG_SHOWRATE_LIST, attRateBean);
+                            else
+                                sendMsgDefault(PublicDef.MSG_SHOWRATE_NOLIST, attRateBean);
+                        }
+                    }
+                }else{
+                    Constants.CURRENTCONFID = 0;
+                }
+                sendMsgDefault(PublicDef.MSG_SHOWCONFERENCE, confRecord);
+                CommonUtil.doSleep(60 * 1000);
+            }
+        }
+    }
+
+    private void sendMsgDefault(int code) {
+        Message msg = new Message();
+        msg.what = code;
+        handler.sendMessage(msg);
+    }
+
+    private void sendMsgDefault(int code, Object obj) {
+        Message msg = new Message();
+        msg.what = code;
+        msg.obj = obj;
+        handler.sendMessage(msg);
+    }
+
+    private void createHandle(){
+        handler = new Handler(){
+            @Override
+            public void handleMessage(Message msg){
+                switch (msg.what){
+                    case PublicDef.MSG_SHOWTIME:
+                        String now = CommonUtil.getNowDate();
+                        v_date.setText(now.substring(0, 10));
+                        v_time.setText(now.substring(11, 16));
+                        v_week.setText(CommonUtil.getWeek());
+                        break;
+                    case PublicDef.MSG_SHOWCONFERENCE:
+                        ConferenceRecord confRecord = (ConferenceRecord) msg.obj;
+                        if(confRecord != null){
+                            vConfname.setText(confRecord.getConfname());
+                            vConftime.setText(CommonUtil.formatDate(confRecord.getConfdate()) + " "
+                                    + CommonUtil.formatTime(confRecord.getConfbegintime()) + "-"
+                                    + CommonUtil.formatTime(confRecord.getConfendtime()));
+                            vConfaddr.setText(confRecord.getConfaddr());
+                            vConfSigntime.setText("签到时间："+CommonUtil.formatTime(confRecord.getConfsigntime()));
+                            if(confRecord.getConftype().equals(PublicDef.LIST_TYPE))
+                                vConftype.setText("会议类型：有名单会议");
+                            else
+                                vConftype.setText("会议类型：无名单会议");
+                            if(bitmap != null)
+                                vQrcode.setImageBitmap(bitmap);
+                            else
+                                vQrcode.setImageResource(R.drawable.qr_none320);
+                            v_qrcode_hint.setText("请扫描右侧会议码进行签到");
+                        }else{
+                            vConfname.setText("当前无会议进行！");
+                            v_qrcode_hint.setText("当前没有会议不能扫码签到");
+                            vQrcode.setImageResource(R.drawable.qr_none320);
+                            vConftime.setText("");
+                            vConfaddr.setText("");
+                            vConfSigntime.setText("");
+                            vConftype.setText("");
+                            v_yd.setText("");
+                            v_sd.setText("");
+                            v_rate.setText("");
+                        }
+                        break;
+                    case PublicDef.MSG_SHOWNETSTATUS:
+                        if(SPApplication.getsInstance().isEpayLinking()){
+                            vNetLogo.setImageResource(R.drawable.wireless_on);
+                            vNetStatus.setText("已联网");
+                            vNetStatus.setTextColor(getResources().getColor(R.color.main_blue1));
+                            //v_detail.setBackgroundResource(R.drawable.select_bg_red);
+                            //v_detail.setEnabled(true);
+                        }else {
+                            vNetLogo.setImageResource(R.drawable.wireless_off);
+                            vNetStatus.setText("脱机");
+                            vNetStatus.setTextColor(getResources().getColor(R.color.orignRed));
+                            //v_detail.setBackgroundResource(R.drawable.corner_bg_gray_focus);
+                            //v_detail.setEnabled(false);
+                        }
+                        break;
+                    case PublicDef.MSG_SHOWRATE_LIST:
+                        AttRateBean arb = (AttRateBean) msg.obj;
+                        if(null != arb){
+                            try{
+                                v_yd.setText(arb.getTotcnt()+"");
+                                v_sd.setText(arb.getActualcnt()+"");
+                                v_rate.setText(String.format("%.2f %s", arb.getAttrate(), "%"));
+                            }catch (Exception e){
+                                v_yd.setText("-");
+                                v_sd.setText("-");
+                                v_rate.setText("-");
+                                e.printStackTrace();
+                                LogUtil.d(TAG, "show rate exception:"+e.getMessage());
+                            }
+                        }
+                        break;
+                    case PublicDef.MSG_SHOWRATE_NOLIST:
+                        AttRateBean arb2 = (AttRateBean) msg.obj;
+                        if(null != arb2){
+                            try{
+                                v_yd.setText("无");
+                                v_sd.setText(arb2.getActualcnt()+"");
+                                v_rate.setText("无");
+                            }catch (Exception e){
+                                v_yd.setText("-");
+                                v_sd.setText("-");
+                                v_rate.setText("-");
+                                e.printStackTrace();
+                                LogUtil.d(TAG, "show rate exception:"+e.getMessage());
+                            }
+                        }
+                        break;
+                }
+                super.handleMessage(msg);
+            }
+        };
+    }
+
+    @Override
+    protected void onResume(){
+        hasHeart = true;
+        UpdateService updateService = new UpdateService();
+        updateService.start();
+        super.onResume();
+    }
+
+    @Override
+    protected void onStop(){
+        super.onStop();
+    }
+
+    @Override
+    protected void onDestroy() {
+        hasHeart = false;
+        releaseWebViews();
+        CommonUtil.releaseMusic();
+        super.onDestroy();
+    }
+
+    private void initData(){
+        createHandle();
+        pos = SPApplication.getsInstance().getPos();
+        ConfigParaRecord configParaRecord = pos.getConfigPara();
+        YktSession.getInstance().setWebAPISession(configParaRecord.getEpayIP(), configParaRecord.getEpayPort(), configParaRecord.getEpayUri(), configParaRecord.getDevphyid(), 2);
+        qrcode_url = YktSession.getInstance().getWebAPISession().getEpayurl();
+    }
+
+    private void initView(){
+        vQrcode = findViewById(R.id.vqrcode);
+        v_qrcode_hint = findViewById(R.id.qrcodehint);
+        vConfname = findViewById(R.id.conference_name);
+        vConftime = findViewById(R.id.conference_time);
+        vConfaddr = findViewById(R.id.conference_addr);
+        vConfSigntime = findViewById(R.id.conference_signtime);
+        vConftype = findViewById(R.id.conference_type);
+        vNetStatus = findViewById(R.id.linkstat);
+        vNetLogo = findViewById(R.id.linklogo);
+        v_yd = findViewById(R.id.yd);
+        v_sd = findViewById(R.id.sd);
+        v_rate = findViewById(R.id.rate);
+        v_week = findViewById(R.id.week);
+        v_date = findViewById(R.id.ymd);
+        v_time = findViewById(R.id.hm);
+        v_detail = findViewById(R.id.detail);
+        v_detail.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                jumpActivity(CheckDetailActivity.class);
+            }
+        });
+        v_tip = findViewById(R.id.tip);
+        v_tip.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                if(dialogPasswd == null){
+                    dialogPasswd = new PasswdDialog(MainActivity.this, new PasswdDialog.ICallBack(){
+                        @Override
+                        public void callback(String pwd){
+                            if("cancel".equals(pwd)){
+                                dialogPasswd.dismiss();
+                            }else if(PublicDef.MANAGER_PWD.equals(pwd)){
+                                dialogPasswd.dismiss();
+                                jumpActivity(ManageActivity.class);
+                            }else{
+                                dialogPasswd.resetPwd("请输入维护密码");
+                            }
+                        }
+                    });
+                }
+                dialogPasswd.resetDialog("请输入维护密码");
+                dialogPasswd.show();
+            }
+        });
+        webView_Pic_1 = (WebView) findViewById(R.id.webview_1);
+        webView_Content_1 = (WebView) findViewById(R.id.webview_top_1);
+        webView_Pic_2 = (WebView) findViewById(R.id.webview_2);
+        webView_Content_2 = (WebView) findViewById(R.id.webview_top_2);
+        webView_Pic_3 = (WebView) findViewById(R.id.webview_3);
+        webView_Content_3 = (WebView) findViewById(R.id.webview_top_3);
+        setWebViews();
+        webView_Pic_1.loadUrl("file:///android_asset/news_pic04.html");
+        webView_Content_1.loadUrl("file:///android_asset/news_content04.html");
+        webView_Pic_2.loadUrl("file:///android_asset/news_pic05.html");
+        webView_Content_2.loadUrl("file:///android_asset/news_content05.html");
+        webView_Pic_3.loadUrl("file:///android_asset/news_pic03.html");
+        webView_Content_3.loadUrl("file:///android_asset/news_content03.html");
+    }
+
+    private void releaseWebViews(){
+        if(webView_Pic_1 != null){
+            ((ViewGroup)webView_Pic_1.getParent()).removeView(webView_Pic_1);
+            webView_Pic_1.destroy();
+        }
+        if(webView_Content_1 != null){
+            ((ViewGroup)webView_Content_1.getParent()).removeView(webView_Content_1);
+            webView_Content_1.destroy();
+        }
+        if(webView_Pic_2 != null){
+            ((ViewGroup)webView_Pic_2.getParent()).removeView(webView_Pic_2);
+            webView_Pic_2.destroy();
+        }
+        if(webView_Content_2 != null){
+            ((ViewGroup)webView_Content_2.getParent()).removeView(webView_Content_2);
+            webView_Content_2.destroy();
+        }
+        if(webView_Pic_3 != null){
+            ((ViewGroup)webView_Pic_3.getParent()).removeView(webView_Pic_3);
+            webView_Pic_3.destroy();
+        }
+        if(webView_Content_3 != null){
+            ((ViewGroup)webView_Content_3.getParent()).removeView(webView_Content_3);
+            webView_Content_3.destroy();
+        }
+    }
+
+    private void setWebViews(){
+        webView_Pic_1.getSettings().setSupportZoom(false);
+        webView_Pic_1.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //优先使用缓存
+        String cacheDirPath = getFilesDir().getAbsolutePath()+"/webCache";
+        webView_Pic_1.getSettings().setAppCachePath(cacheDirPath); // h5缓存
+        webView_Pic_1.getSettings().setAppCacheEnabled(true);
+        //设置自适应屏幕，两者合用
+        webView_Pic_1.getSettings().setUseWideViewPort(true); //将图片调整到适合webview的大小
+        webView_Pic_1.getSettings().setLoadWithOverviewMode(true); // 缩放至屏幕的大小
+
+        webView_Pic_2.getSettings().setSupportZoom(false);
+        webView_Pic_2.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //优先使用缓存
+        webView_Pic_2.getSettings().setAppCachePath(cacheDirPath); // h5缓存
+        webView_Pic_2.getSettings().setAppCacheEnabled(true);
+        //设置自适应屏幕，两者合用
+        webView_Pic_2.getSettings().setUseWideViewPort(true); //将图片调整到适合webview的大小
+        webView_Pic_2.getSettings().setLoadWithOverviewMode(true); // 缩放至屏幕的大小
+
+        webView_Pic_3.getSettings().setSupportZoom(false);
+        webView_Pic_3.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //优先使用缓存
+        webView_Pic_3.getSettings().setAppCachePath(cacheDirPath); // h5缓存
+        webView_Pic_3.getSettings().setAppCacheEnabled(true);
+        //设置自适应屏幕，两者合用
+        webView_Pic_3.getSettings().setUseWideViewPort(true); //将图片调整到适合webview的大小
+        webView_Pic_3.getSettings().setLoadWithOverviewMode(true); // 缩放至屏幕的大小
+
+        webView_Content_1.getSettings().setSupportZoom(false);
+        webView_Content_1.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //优先使用缓存
+        webView_Content_1.getSettings().setAppCachePath(cacheDirPath); // h5缓存
+        webView_Content_1.getSettings().setAppCacheEnabled(true);
+        //设置自适应屏幕，两者合用
+        webView_Content_1.getSettings().setUseWideViewPort(true); //将图片调整到适合webview的大小
+        webView_Content_1.getSettings().setLoadWithOverviewMode(true); // 缩放至屏幕的大小
+
+        webView_Content_2.getSettings().setSupportZoom(false);
+        webView_Content_2.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //优先使用缓存
+        webView_Content_2.getSettings().setAppCachePath(cacheDirPath); // h5缓存
+        webView_Content_2.getSettings().setAppCacheEnabled(true);
+        //设置自适应屏幕，两者合用
+        webView_Content_2.getSettings().setUseWideViewPort(true); //将图片调整到适合webview的大小
+        webView_Content_2.getSettings().setLoadWithOverviewMode(true); // 缩放至屏幕的大小
+
+        webView_Content_3.getSettings().setSupportZoom(false);
+        webView_Content_3.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //优先使用缓存
+        webView_Content_3.getSettings().setAppCachePath(cacheDirPath); // h5缓存
+        webView_Content_3.getSettings().setAppCacheEnabled(true);
+        //设置自适应屏幕，两者合用
+        webView_Content_3.getSettings().setUseWideViewPort(true); //将图片调整到适合webview的大小
+        webView_Content_3.getSettings().setLoadWithOverviewMode(true); // 缩放至屏幕的大小
+
+        webView_Pic_1.setWebViewClient(new WebViewClient(){
+            @Override
+            public boolean shouldOverrideUrlLoading(WebView view, String url){
+                webView_Pic_1.loadUrl(url);
+                return true;
+            }
+        });
+        webView_Pic_2.setWebViewClient(new WebViewClient(){
+            @Override
+            public boolean shouldOverrideUrlLoading(WebView view, String url){
+                webView_Pic_2.loadUrl(url);
+                return true;
+            }
+        });
+        webView_Pic_3.setWebViewClient(new WebViewClient(){
+            @Override
+            public boolean shouldOverrideUrlLoading(WebView view, String url){
+                webView_Pic_3.loadUrl(url);
+                return true;
+            }
+        });
+        webView_Content_1.setWebViewClient(new WebViewClient(){
+            @Override
+            public boolean shouldOverrideUrlLoading(WebView view, String url){
+                webView_Content_1.loadUrl(url);
+                return true;
+            }
+        });
+        webView_Content_1.setOnLongClickListener(new View.OnLongClickListener() {
+            @Override
+            public boolean onLongClick(View v) {
+                return true;
+            }
+        });
+        webView_Content_2.setWebViewClient(new WebViewClient(){
+            @Override
+            public boolean shouldOverrideUrlLoading(WebView view, String url){
+                webView_Content_2.loadUrl(url);
+                return true;
+            }
+        });
+        webView_Content_2.setOnLongClickListener(new View.OnLongClickListener() {
+            @Override
+            public boolean onLongClick(View v) {
+                return true;
+            }
+        });
+        webView_Content_3.setWebViewClient(new WebViewClient(){
+            @Override
+            public boolean shouldOverrideUrlLoading(WebView view, String url){
+                webView_Content_3.loadUrl(url);
+                return true;
+            }
+        });
+        webView_Content_3.setOnLongClickListener(new View.OnLongClickListener() {
+            @Override
+            public boolean onLongClick(View v) {
+                return true;
+            }
+        });
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/conferencecheck/activity/ManageActivity.java b/app/src/main/java/com/supwisdom/conferencecheck/activity/ManageActivity.java
new file mode 100644
index 0000000..e753d54
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/conferencecheck/activity/ManageActivity.java
@@ -0,0 +1,129 @@
+package com.supwisdom.conferencecheck.activity;
+
+import android.content.ComponentName;
+import android.content.Intent;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.TextView;
+
+import com.supwisdom.bean.BaseResp;
+import com.supwisdom.conferencecheck.R;
+import com.supwisdom.conferencecheck.SPApplication;
+import com.supwisdom.service.ConferenceApi;
+import com.supwisdom.swterm.Pos;
+import com.supwisdom.util.CommonUtil;
+import com.supwisdom.util.PublicDef;
+import com.supwisdom.view.SWToast;
+
+public class ManageActivity extends BaseActivity{
+
+    private TextView v_syncmsg, v_linkmsg;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_set);
+        initView();
+    }
+
+    private void initView(){
+        v_syncmsg = findViewById(R.id.sync_msg);
+        v_linkmsg = findViewById(R.id.link_msg);
+        View set = findViewById(R.id.set);
+        set.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Intent intent = new Intent("/");
+                ComponentName cm = new ComponentName("com.android.settings","com.android.settings.Settings");
+                intent.setComponent(cm);
+                intent.setAction("android.intent.action.VIEW");
+                startActivityForResult(intent, 0);
+            }
+        });
+        View conf = findViewById(R.id.conference);
+        conf.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                jumpActivity(ConferenceQueryActivity.class);
+            }
+        });
+        View sysnConf = findViewById(R.id.syncconf);
+        sysnConf.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                new AsyncGetConference().execute();
+            }
+        });
+        View link = findViewById(R.id.link);
+        link.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                new AsyncLink().execute();
+            }
+        });
+        View exit = findViewById(R.id.exit);
+        exit.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                jumpActivity(MainActivity.class);
+            }
+        });
+    }
+
+    private class AsyncGetConference extends AsyncTask<Void, Void, BaseResp>{
+        @Override
+        protected void onPreExecute(){
+            v_syncmsg.setVisibility(View.VISIBLE);
+            super.onPreExecute();
+        }
+        @Override
+        protected BaseResp doInBackground(Void... voids){
+            return SPApplication.getsInstance().getApi().syncConference(CommonUtil.getNowDateNoFormat());
+        }
+
+        @Override
+        protected void onPostExecute(BaseResp resp){
+            v_syncmsg.setVisibility(View.GONE);
+            if(resp != null){
+                if(resp.getRetcode() == PublicDef.SUCCESS)
+                    SWToast.show(ManageActivity.this, resp.getRetmsg(), PublicDef.TOAST_SHOW_SMILE);
+                else
+                    SWToast.show(ManageActivity.this, resp.getRetmsg(), PublicDef.TOAST_SHOW_CRY);
+            }else{
+                SWToast.show(ManageActivity.this, "请求超时", PublicDef.TOAST_SHOW_CRY);
+            }
+            super.onPostExecute(resp);
+        }
+    }
+
+    private class AsyncLink extends AsyncTask<Void, Void, BaseResp>{
+        @Override
+        protected void onPreExecute(){
+            v_linkmsg.setVisibility(View.VISIBLE);
+            super.onPreExecute();
+        }
+        @Override
+        protected BaseResp doInBackground(Void... voids){
+            return SPApplication.getsInstance().getApi().checkLink();
+        }
+
+        @Override
+        protected void onPostExecute(BaseResp resp){
+            v_linkmsg.setVisibility(View.GONE);
+            if(resp != null){
+                if(resp.getRetcode() == PublicDef.SUCCESS){
+                    SPApplication.getsInstance().setEpayLinking(true);
+                    SWToast.show(ManageActivity.this, resp.getRetmsg(), PublicDef.TOAST_SHOW_SMILE);
+                }else{
+                    SPApplication.getsInstance().setEpayLinking(false);
+                    SWToast.show(ManageActivity.this, resp.getRetmsg(), PublicDef.TOAST_SHOW_CRY);
+                }
+            }else{
+                SPApplication.getsInstance().setEpayLinking(false);
+                SWToast.show(ManageActivity.this, "请求超时", PublicDef.TOAST_SHOW_CRY);
+            }
+            super.onPostExecute(resp);
+        }
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/conferencecheck/activity/SplashActivity.java b/app/src/main/java/com/supwisdom/conferencecheck/activity/SplashActivity.java
new file mode 100644
index 0000000..3e5e93f
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/conferencecheck/activity/SplashActivity.java
@@ -0,0 +1,87 @@
+package com.supwisdom.conferencecheck.activity;
+
+import android.Manifest;
+import android.content.pm.PackageManager;
+import android.os.Build;
+import android.os.Bundle;
+import android.widget.TextView;
+
+import com.supwisdom.conferencecheck.R;
+import com.supwisdom.conferencecheck.SPApplication;
+import com.supwisdom.swterm.ConfigParaRecord;
+import com.supwisdom.swterm.ControlParaRecord;
+import com.supwisdom.util.CommonUtil;
+import com.supwisdom.util.PublicDef;
+
+/**
+ * 设备启动页面
+ */
+public class SplashActivity extends BaseActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_splash);
+        initView();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        if (hasSdcardPermession()) {
+            processStart();
+        }
+    }
+
+    private void initView() {
+        TextView tv = (TextView) findViewById(R.id.versionNumber);
+        tv.setText(CommonUtil.getVersionName(getApplicationContext()));
+    }
+
+    private void processStart() {
+        ControlParaRecord ctlRecord = SPApplication.getsInstance().getPos().getControlPara(PublicDef.CONTROL_HAS_REGISTER);
+        if(ctlRecord == null){
+            jumpActivity(ConfigActivity.class);
+        }else{
+            ConfigParaRecord record = SPApplication.getsInstance().getPos().getConfigPara();
+            if(null != record && record.isInitOK()){
+                jumpActivity(MainActivity.class);
+            }else{
+                jumpActivity(ConfigActivity.class);
+            }
+        }
+    }
+
+    private final static int REQUEST_RETCODE = 99;
+
+    private boolean hasSdcardPermession() {
+        /**
+         * 动态获取权限，Android 6.0 新特性，一些保护权限，除了要在AndroidManifest中声明权限，还要使用如下代码动态获取
+         */
+        if (Build.VERSION.SDK_INT >= 23) {
+            String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};
+            //验证是否许可权限
+            for (String str : permissions) {
+                if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
+                    //申请权限
+                    this.requestPermissions(permissions, REQUEST_RETCODE);
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
+        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+        if (requestCode == REQUEST_RETCODE) {
+            for (int i = 0; i < grantResults.length; i++) {
+                if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
+                    return;
+                }
+            }
+            // 请求权限的结果  true代表用户同意了
+            processStart();
+        }
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/conferencecheck/view/PasswdDialog.java b/app/src/main/java/com/supwisdom/conferencecheck/view/PasswdDialog.java
new file mode 100644
index 0000000..91b27de
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/conferencecheck/view/PasswdDialog.java
@@ -0,0 +1,220 @@
+package com.supwisdom.conferencecheck.view;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.graphics.Color;
+import android.support.annotation.NonNull;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.supwisdom.conferencecheck.R;
+
+/**
+ * Created by shuwei on 15/9/28.
+ */
+public class PasswdDialog extends Dialog {
+    private final ImageView vPassd1;
+    private final ImageView vPassd2;
+    private final ImageView vPassd3;
+    private final ImageView vPassd4;
+    private final ImageView vPassd5;
+    private final ImageView vPassd6;
+    private final TextView vTitle;
+    private String passwd;
+    private ICallBack icb;
+
+    public PasswdDialog(Context context, ICallBack cb) {
+        super(context, R.style.FloatingDialog);
+        this.setContentView(R.layout.dialog_passwd);
+        setCanceledOnTouchOutside(false);
+        setCancelable(false);
+
+        this.icb = cb;
+        handleClickNumber(R.id.float_password_btn0, 0, R.drawable.pass_zero_normal, R.drawable.pass_zero_click);
+        handleClickNumber(R.id.float_password_btn1, 1, R.drawable.pass_one_normal, R.drawable.pass_one_click);
+        handleClickNumber(R.id.float_password_btn2, 2, R.drawable.pass_two_normal, R.drawable.pass_two_click);
+        handleClickNumber(R.id.float_password_btn3, 3, R.drawable.pass_three_normal, R.drawable.pass_three_click);
+        handleClickNumber(R.id.float_password_btn4, 4, R.drawable.pass_four_normal, R.drawable.pass_four_click);
+        handleClickNumber(R.id.float_password_btn5, 5, R.drawable.pass_five_normal, R.drawable.pass_five_click);
+        handleClickNumber(R.id.float_password_btn6, 6, R.drawable.pass_six_normal, R.drawable.pass_six_click);
+        handleClickNumber(R.id.float_password_btn7, 7, R.drawable.pass_seven_normal, R.drawable.pass_seven_click);
+        handleClickNumber(R.id.float_password_btn8, 8, R.drawable.pass_eight_normal, R.drawable.pass_eight_click);
+        handleClickNumber(R.id.float_password_btn9, 9, R.drawable.pass_nine_normal, R.drawable.pass_nine_click);
+        handleClickNumber(R.id.float_password_btn_delete, -1, R.drawable.pass_delete_normal, R.drawable.pass_delete_click);
+        final TextView btn = (TextView) this.findViewById(R.id.float_password_cancel);
+        btn.setOnTouchListener(new View.OnTouchListener() {
+            @Override
+            public boolean onTouch(View view, MotionEvent event) {
+                int what = event.getAction();
+                switch (what) {
+                    case MotionEvent.ACTION_DOWN:  //按下
+                        btn.setBackground(getContext().getResources().getDrawable(R.drawable.btn_red_click));
+                        break;
+                    case MotionEvent.ACTION_UP:
+                        btn.setBackground(getContext().getResources().getDrawable(R.drawable.btn_red_normal));
+                        PasswdDialog.this.dismiss();
+                        icb.callback("cancel");
+                }
+                return true;
+            }
+        });
+
+        vPassd1 = (ImageView) this.findViewById(R.id.float_password_img1);
+        vPassd2 = (ImageView) this.findViewById(R.id.float_password_img2);
+        vPassd3 = (ImageView) this.findViewById(R.id.float_password_img3);
+        vPassd4 = (ImageView) this.findViewById(R.id.float_password_img4);
+        vPassd5 = (ImageView) this.findViewById(R.id.float_password_img5);
+        vPassd6 = (ImageView) this.findViewById(R.id.float_password_img6);
+        vTitle = (TextView) this.findViewById(R.id.tv_float_password_title);
+        showPasswd(0);
+        passwd = "";
+    }
+
+    public void resetDialog(String msg) {
+        passwd = "";
+//    vTitle.setText("请输入卡密码");
+        vTitle.setText(msg);
+        vTitle.setTextColor(Color.BLACK);
+        showPasswd(0);
+    }
+
+    public void resetPwd(String msg) {
+        passwd = "";
+//    vTitle.setText("请重新输入密码");
+        vTitle.setText(msg);
+        vTitle.setTextColor(Color.RED);
+        showPasswd(0);
+    }
+
+    @Override
+    public boolean dispatchKeyEvent(@NonNull KeyEvent event) {
+        if (event.getAction() == KeyEvent.ACTION_DOWN) {
+            int keyCode = event.getKeyCode();
+            switch (keyCode) {
+                case KeyEvent.KEYCODE_NUMPAD_0:
+                case KeyEvent.KEYCODE_NUMPAD_1:
+                case KeyEvent.KEYCODE_NUMPAD_2:
+                case KeyEvent.KEYCODE_NUMPAD_3:
+                case KeyEvent.KEYCODE_NUMPAD_4:
+                case KeyEvent.KEYCODE_NUMPAD_5:
+                case KeyEvent.KEYCODE_NUMPAD_6:
+                case KeyEvent.KEYCODE_NUMPAD_7:
+                case KeyEvent.KEYCODE_NUMPAD_8:
+                case KeyEvent.KEYCODE_NUMPAD_9:
+                    addValueToEdit(keyCode - KeyEvent.KEYCODE_NUMPAD_0);
+                    break;
+                case KeyEvent.KEYCODE_NUMPAD_DOT:
+                case KeyEvent.KEYCODE_DEL:
+                    addValueToEdit(-1);
+                    break;
+                default:
+            }
+        }
+        return false;
+    }
+
+    private void handleClickNumber(int btnId, final int number, final int picNormal, final int picClick) {
+        final ImageView btn = (ImageView) findViewById(btnId);
+        btn.setOnTouchListener(new ImageView.OnTouchListener() {
+            @Override
+            public boolean onTouch(View v, MotionEvent event) {
+                int what = event.getAction();
+                switch (what) {
+                    case MotionEvent.ACTION_DOWN:  //按下
+                        btn.setImageDrawable(getContext().getResources().getDrawable(picClick));
+                        break;
+                    case MotionEvent.ACTION_UP:
+                        btn.setImageDrawable(getContext().getResources().getDrawable(picNormal));
+                        addValueToEdit(number);
+                        break;
+                }
+                return true;
+            }
+        });
+    }
+
+    private boolean addValueToEdit(int value) {
+        if (value == -1) {
+            if (passwd.length() > 0) {
+                passwd = passwd.substring(0, passwd.length() - 1);
+                showPasswd(passwd.length());
+            }
+        } else {
+            //如果已经有小数点，则小数点后面不能超过两位
+            passwd += value;
+            showPasswd(passwd.length());
+        }
+        if (passwd.length() > 5) {
+            icb.callback(passwd);
+        }
+        return true;
+    }
+
+    private void showPasswd(int num) {
+        switch (num) {
+            case 0:
+                vPassd1.setVisibility(View.GONE);
+                vPassd2.setVisibility(View.GONE);
+                vPassd3.setVisibility(View.GONE);
+                vPassd4.setVisibility(View.GONE);
+                vPassd5.setVisibility(View.GONE);
+                vPassd6.setVisibility(View.GONE);
+                break;
+            case 1:
+                vPassd1.setVisibility(View.VISIBLE);
+                vPassd2.setVisibility(View.GONE);
+                vPassd3.setVisibility(View.GONE);
+                vPassd4.setVisibility(View.GONE);
+                vPassd5.setVisibility(View.GONE);
+                vPassd6.setVisibility(View.GONE);
+                break;
+            case 2:
+                vPassd1.setVisibility(View.VISIBLE);
+                vPassd2.setVisibility(View.VISIBLE);
+                vPassd3.setVisibility(View.GONE);
+                vPassd4.setVisibility(View.GONE);
+                vPassd5.setVisibility(View.GONE);
+                vPassd6.setVisibility(View.GONE);
+                break;
+            case 3:
+                vPassd1.setVisibility(View.VISIBLE);
+                vPassd2.setVisibility(View.VISIBLE);
+                vPassd3.setVisibility(View.VISIBLE);
+                vPassd4.setVisibility(View.GONE);
+                vPassd5.setVisibility(View.GONE);
+                vPassd6.setVisibility(View.GONE);
+                break;
+            case 4:
+                vPassd1.setVisibility(View.VISIBLE);
+                vPassd2.setVisibility(View.VISIBLE);
+                vPassd3.setVisibility(View.VISIBLE);
+                vPassd4.setVisibility(View.VISIBLE);
+                vPassd5.setVisibility(View.GONE);
+                vPassd6.setVisibility(View.GONE);
+                break;
+            case 5:
+                vPassd1.setVisibility(View.VISIBLE);
+                vPassd2.setVisibility(View.VISIBLE);
+                vPassd3.setVisibility(View.VISIBLE);
+                vPassd4.setVisibility(View.VISIBLE);
+                vPassd5.setVisibility(View.VISIBLE);
+                vPassd6.setVisibility(View.GONE);
+                break;
+            default:
+                vPassd1.setVisibility(View.VISIBLE);
+                vPassd2.setVisibility(View.VISIBLE);
+                vPassd3.setVisibility(View.VISIBLE);
+                vPassd4.setVisibility(View.VISIBLE);
+                vPassd5.setVisibility(View.VISIBLE);
+                vPassd6.setVisibility(View.VISIBLE);
+                break;
+        }
+    }
+
+    public interface ICallBack {
+        void callback(String pwd);
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/db/BeanPropEnum.java b/app/src/main/java/com/supwisdom/db/BeanPropEnum.java
new file mode 100644
index 0000000..2cc3278
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/db/BeanPropEnum.java
@@ -0,0 +1,32 @@
+package com.supwisdom.db;
+
+public class BeanPropEnum {
+    public enum Conference{
+        confid,
+        confname,
+        confaddr,
+        confdate,
+        confbegintime,
+        confendtime,
+        confsigntime,
+        conftype,
+        remark
+    }
+
+    public enum ControlPara {
+        name,
+        val
+    }
+
+    public enum ConfigPara {
+        id,
+        mode,
+        deviceid,
+        devicename,
+        devphyid,
+        epayIP,
+        epayPort,
+        epayUri,
+        initOK
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/db/ConferenceDao.java b/app/src/main/java/com/supwisdom/db/ConferenceDao.java
new file mode 100644
index 0000000..a6136f9
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/db/ConferenceDao.java
@@ -0,0 +1,168 @@
+package com.supwisdom.db;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+
+import com.supwisdom.swterm.ConferenceRecord;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.locks.Lock;
+
+public class ConferenceDao {
+    private static ConferenceDao dao;
+    private final String TABLE = DBConferenceHelper.TABLE_NAME_CONFERENCE;
+    private DBConferenceHelper dbHelper;
+
+    private ConferenceDao(Context context) {
+        dbHelper = DBConferenceHelper.getInstance(context);
+    }
+
+    public Lock getLock() {
+        return dbHelper.getLock();
+    }
+
+    public static ConferenceDao getInstance(Context context) {
+        if (dao == null) {
+            synchronized (ConferenceDao.class) {
+                if (dao == null) {
+                    dao = new ConferenceDao(context);
+                }
+            }
+        }
+        return dao;
+    }
+
+    public boolean save(ConferenceRecord record) {
+        SQLiteDatabase db = dbHelper.getReadableDatabase();
+        ContentValues values = getContentValues(record);
+        try {
+            db.beginTransaction();
+            if (db.insert(TABLE, null, values) > 0) {
+                db.setTransactionSuccessful();
+                return true;
+            }
+        } finally {
+            db.endTransaction();
+        }
+        return false;
+    }
+
+    public boolean replace(ConferenceRecord record) {
+        SQLiteDatabase db = dbHelper.getReadableDatabase();
+        ContentValues values = getContentValues(record);
+        try {
+            db.beginTransaction();
+            if (db.replace(TABLE, null, values) > 0) {
+                db.setTransactionSuccessful();
+                return true;
+            }
+        } finally {
+            db.endTransaction();
+        }
+        return false;
+    }
+
+    public boolean update(ConferenceRecord record) {
+        SQLiteDatabase db = dbHelper.getWritableDatabase();
+        ContentValues values = getContentValues(record);
+        try {
+            db.beginTransaction();
+            if (db.update(TABLE, values, BeanPropEnum.Conference.confid + "=?", new String[]{record.getConfid()+""}) > 0) {
+                db.setTransactionSuccessful();
+                return true;
+            }
+        } finally {
+            db.endTransaction();
+        }
+        return false;
+    }
+
+    public ConferenceRecord get(int confid) {
+        SQLiteDatabase db = dbHelper.getReadableDatabase();
+        Cursor cursor = null;
+        try {
+            cursor = db.query(TABLE, null, BeanPropEnum.Conference.confid.toString() + "=?",
+                    new String[]{"" + confid}, null, null, null);
+            if (cursor != null && cursor.moveToNext()) {
+                return getRecord(cursor);
+            }
+        } finally {
+            if (cursor != null) {
+                cursor.close();
+            }
+        }
+        return null;
+    }
+
+    public List<ConferenceRecord> getByDate(String date) {
+        SQLiteDatabase db = dbHelper.getReadableDatabase();
+        Cursor cursor = null;
+        try {
+            cursor = db.query(TABLE, null, BeanPropEnum.Conference.confdate.toString() + "=?",
+                    new String[]{date}, null, null, null);
+            List<ConferenceRecord> list = new ArrayList<>();
+            while (cursor != null && cursor.moveToNext()) {
+                list.add(getRecord(cursor));
+            }
+            return list;
+        } finally {
+            if (cursor != null) {
+                cursor.close();
+            }
+        }
+    }
+
+    /**
+     * 获取正在进行的会议，签到时间和结束时间之间
+     * @param date
+     * @param time
+     * @return
+     */
+    public ConferenceRecord getByDateTime(String date, String time) {
+        SQLiteDatabase db = dbHelper.getReadableDatabase();
+        Cursor cursor = null;
+        try {
+            cursor = db.query(TABLE, null, BeanPropEnum.Conference.confdate.toString() + "=? and " + BeanPropEnum.Conference.confsigntime + "<=? and " + BeanPropEnum.Conference.confendtime + ">=?",
+                    new String[]{date, time, time}, null, null, null);
+            if (cursor != null && cursor.moveToNext()) {
+                return getRecord(cursor);
+            }
+        } finally {
+            if (cursor != null) {
+                cursor.close();
+            }
+        }
+        return null;
+    }
+
+    private ConferenceRecord getRecord(Cursor cursor){
+        ConferenceRecord record = new ConferenceRecord();
+        record.setConfid(cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Conference.confid.toString())));
+        record.setConfname(cursor.getString(cursor.getColumnIndex(BeanPropEnum.Conference.confname.toString())));
+        record.setConfaddr(cursor.getString(cursor.getColumnIndex(BeanPropEnum.Conference.confaddr.toString())));
+        record.setConfdate(cursor.getString(cursor.getColumnIndex(BeanPropEnum.Conference.confdate.toString())));
+        record.setConfbegintime(cursor.getString(cursor.getColumnIndex(BeanPropEnum.Conference.confbegintime.toString())));
+        record.setConfendtime(cursor.getString(cursor.getColumnIndex(BeanPropEnum.Conference.confendtime.toString())));
+        record.setConfsigntime(cursor.getString(cursor.getColumnIndex(BeanPropEnum.Conference.confsigntime.toString())));
+        record.setConftype(cursor.getString(cursor.getColumnIndex(BeanPropEnum.Conference.conftype.toString())));
+        record.setRemark(cursor.getString(cursor.getColumnIndex(BeanPropEnum.Conference.remark.toString())));
+        return record;
+    }
+
+    private ContentValues getContentValues(ConferenceRecord record){
+        ContentValues values = new ContentValues();
+        values.put(BeanPropEnum.Conference.confid.toString(), record.getConfid());
+        values.put(BeanPropEnum.Conference.confname.toString(), record.getConfname());
+        values.put(BeanPropEnum.Conference.confaddr.toString(), record.getConfaddr());
+        values.put(BeanPropEnum.Conference.confdate.toString(), record.getConfdate());
+        values.put(BeanPropEnum.Conference.confbegintime.toString(), record.getConfbegintime());
+        values.put(BeanPropEnum.Conference.confendtime.toString(), record.getConfendtime());
+        values.put(BeanPropEnum.Conference.confsigntime.toString(), record.getConfsigntime());
+        values.put(BeanPropEnum.Conference.conftype.toString(), record.getConftype());
+        values.put(BeanPropEnum.Conference.remark.toString(), record.getRemark());
+        return values;
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/db/ConfigParaDao.java b/app/src/main/java/com/supwisdom/db/ConfigParaDao.java
new file mode 100644
index 0000000..04b9b06
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/db/ConfigParaDao.java
@@ -0,0 +1,134 @@
+package com.supwisdom.db;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import com.supwisdom.swterm.ConfigParaRecord;
+import java.util.concurrent.locks.Lock;
+
+/**
+ * Created by zzq on 2016-04-14.
+ */
+public class ConfigParaDao {
+    private int INDEX = 1;
+    private static ConfigParaDao dao;
+    private final String TABLE = DBConferenceHelper.TABLE_NAME_CONFIGPARA;
+    private DBConferenceHelper dbHelper;
+
+    private ConfigParaDao(Context context) {
+        dbHelper = DBConferenceHelper.getInstance(context);
+    }
+
+    public Lock getLock() {
+        return dbHelper.getLock();
+    }
+
+    public static ConfigParaDao getInstance(Context context) {
+        if (dao == null) {
+            synchronized (ConfigParaDao.class) {
+                if (dao == null) {
+                    dao = new ConfigParaDao(context);
+                }
+            }
+        }
+        return dao;
+    }
+
+    public boolean replace(ConfigParaRecord record) {
+        SQLiteDatabase db = dbHelper.getReadableDatabase();
+        ContentValues values = getContentValues(record);
+        try {
+            db.beginTransaction();
+            if (db.replace(TABLE, null, values) > 0) {
+                db.setTransactionSuccessful();
+                return true;
+            }
+        } finally {
+            db.endTransaction();
+        }
+        return false;
+    }
+
+    public boolean update(ConfigParaRecord record) {
+        SQLiteDatabase db = dbHelper.getWritableDatabase();
+        ContentValues values = getContentValues(record);
+        try {
+            db.beginTransaction();
+            if (db.update(TABLE, values, BeanPropEnum.ConfigPara.id + "=?", new String[]{Integer.toString(INDEX)}) > 0) {
+                db.setTransactionSuccessful();
+                return true;
+            }
+        } finally {
+            db.endTransaction();
+        }
+        return false;
+    }
+
+    public ConfigParaRecord get() {
+        SQLiteDatabase db = dbHelper.getReadableDatabase();
+        Cursor cursor = null;
+        try {
+            cursor = db.query(TABLE, null, BeanPropEnum.ConfigPara.id.toString() + "=?",
+                    new String[]{"" + INDEX}, null, null, null);
+            if (cursor != null && cursor.moveToNext()) {
+                return getRecord(cursor);
+            }
+        } finally {
+            if (cursor != null) {
+                cursor.close();
+            }
+        }
+        return null;
+    }
+
+    private ConfigParaRecord getRecord(Cursor cursor) {
+        ConfigParaRecord record = new ConfigParaRecord();
+        record.setMode(cursor.getInt(cursor.getColumnIndex(BeanPropEnum.ConfigPara.mode.toString())));
+        record.setDeviceid(cursor.getInt(cursor.getColumnIndex(BeanPropEnum.ConfigPara.deviceid.toString())));
+        record.setDevicename(cursor.getString(cursor.getColumnIndex(BeanPropEnum.ConfigPara.devicename.toString())));
+        record.setDevphyid(cursor.getString(cursor.getColumnIndex(BeanPropEnum.ConfigPara.devphyid.toString())));
+        record.setEpayIP(cursor.getString(cursor.getColumnIndex(BeanPropEnum.ConfigPara.epayIP.toString())));
+        record.setEpayPort(cursor.getInt(cursor.getColumnIndex(BeanPropEnum.ConfigPara.epayPort.toString())));
+        record.setEpayUri(cursor.getString(cursor.getColumnIndex(BeanPropEnum.ConfigPara.epayUri.toString())));
+        int value = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.ConfigPara.initOK.toString()));
+        if (value == 1) {
+            record.setInitOK(true);
+        } else {
+            record.setInitOK(false);
+        }
+        return record;
+    }
+
+    public boolean clear() {
+        SQLiteDatabase db = dbHelper.getWritableDatabase();
+        try {
+            db.beginTransaction();
+            if (db.delete(TABLE, null, null) < 0) {
+                return false;
+            }
+            db.setTransactionSuccessful();
+            return true;
+        } finally {
+            db.endTransaction();
+        }
+    }
+
+    private ContentValues getContentValues(ConfigParaRecord record) {
+        ContentValues values = new ContentValues();
+        values.put(BeanPropEnum.ConfigPara.id.toString(), INDEX);
+        values.put(BeanPropEnum.ConfigPara.mode.toString(), record.getMode());
+        values.put(BeanPropEnum.ConfigPara.deviceid.toString(), record.getDeviceid());
+        values.put(BeanPropEnum.ConfigPara.devicename.toString(), record.getDevicename());
+        values.put(BeanPropEnum.ConfigPara.devphyid.toString(), record.getDevphyid());
+        values.put(BeanPropEnum.ConfigPara.epayIP.toString(), record.getEpayIP());
+        values.put(BeanPropEnum.ConfigPara.epayPort.toString(), record.getEpayPort());
+        values.put(BeanPropEnum.ConfigPara.epayUri.toString(), record.getEpayUri());
+        if (record.isInitOK()) {
+            values.put(BeanPropEnum.ConfigPara.initOK.toString(), 1);
+        } else {
+            values.put(BeanPropEnum.ConfigPara.initOK.toString(), 0);
+        }
+        return values;
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/db/ControlParaDao.java b/app/src/main/java/com/supwisdom/db/ControlParaDao.java
new file mode 100644
index 0000000..2adc9cb
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/db/ControlParaDao.java
@@ -0,0 +1,113 @@
+package com.supwisdom.db;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+
+import com.supwisdom.swterm.ControlParaRecord;
+
+import java.util.concurrent.locks.Lock;
+
+/**
+ * Created by zzq on 2016-06-20.
+ */
+public class ControlParaDao {
+    private static ControlParaDao dao;
+    private DBParaHelper dbHelper;
+    private final String TABLE = DBParaHelper.TABLE_NAME_CONTROLPARA;
+
+    private ControlParaDao(Context context) {
+        dbHelper = DBParaHelper.getInstance(context);
+    }
+
+    public Lock getLock() {
+        return dbHelper.getLock();
+    }
+
+    public static ControlParaDao getInstance(Context context) {
+        if (dao == null) {
+            synchronized (ControlParaDao.class) {
+                if (dao == null) {
+                    dao = new ControlParaDao(context);
+                }
+            }
+        }
+        return dao;
+    }
+
+    public boolean replace(ControlParaRecord record) {
+        SQLiteDatabase db = dbHelper.getReadableDatabase();
+        ContentValues values = getContentValues(record);
+        try {
+            db.beginTransaction();
+            if (db.replace(TABLE, null, values) > 0) {
+                db.setTransactionSuccessful();
+                return true;
+            }
+        } finally {
+            db.endTransaction();
+        }
+        return false;
+    }
+
+    public boolean update(ControlParaRecord record) {
+        SQLiteDatabase db = dbHelper.getWritableDatabase();
+        ContentValues values = getContentValues(record);
+        try {
+            db.beginTransaction();
+            if (db.update(TABLE, values, BeanPropEnum.ControlPara.name + "=?", new String[]{record.getName()}) > 0) {
+                db.setTransactionSuccessful();
+                return true;
+            }
+        } finally {
+            db.endTransaction();
+        }
+        return false;
+    }
+
+    public ControlParaRecord get(String name) {
+        SQLiteDatabase db = dbHelper.getReadableDatabase();
+        Cursor cursor = null;
+        try {
+            cursor = db.query(TABLE, null, BeanPropEnum.ControlPara.name.toString() + "=?",
+                    new String[]{name}, null, null, null);
+            if (cursor != null && cursor.moveToNext()) {
+                return getRecord(cursor);
+            }
+        } finally {
+            if (cursor != null) {
+                cursor.close();
+            }
+        }
+        return null;
+    }
+
+    private ControlParaRecord getRecord(Cursor cursor) {
+        ControlParaRecord record = new ControlParaRecord();
+        record.setName(cursor.getString(cursor.getColumnIndex(BeanPropEnum.ControlPara.name.toString())));
+        record.setValue(cursor.getString(cursor.getColumnIndex(BeanPropEnum.ControlPara.val.toString())));
+        return record;
+    }
+
+    public boolean clear() {
+        SQLiteDatabase db = dbHelper.getWritableDatabase();
+        try {
+            db.beginTransaction();
+            if (db.delete(DBParaHelper.TABLE_NAME_CONTROLPARA, null, null) < 0) {
+                return false;
+            }
+            db.setTransactionSuccessful();
+            return true;
+        } finally {
+            db.endTransaction();
+        }
+    }
+
+    private ContentValues getContentValues(ControlParaRecord record) {
+        ContentValues values = new ContentValues();
+        values.put(BeanPropEnum.ControlPara.name.toString(), record.getName());
+        values.put(BeanPropEnum.ControlPara.val.toString(), record.getValue());
+        return values;
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/db/DBConferenceHelper.java b/app/src/main/java/com/supwisdom/db/DBConferenceHelper.java
new file mode 100644
index 0000000..3b2c71a
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/db/DBConferenceHelper.java
@@ -0,0 +1,74 @@
+package com.supwisdom.db;
+
+import android.content.Context;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+public class DBConferenceHelper extends SQLiteOpenHelper {
+
+    public static final String TABLE_NAME_CONFERENCE = "tb_conference";
+    public static final String TABLE_NAME_CONFIGPARA = "tb_configpara";
+
+    private static final String CREATE_TABLE_NAME_CONFERENCE = "create table IF NOT EXISTS "
+            + TABLE_NAME_CONFERENCE + " ( "
+            + BeanPropEnum.Conference.confid + " integer primary key, "
+            + BeanPropEnum.Conference.confname + " varchar(64), "
+            + BeanPropEnum.Conference.confaddr + " varchar(64), "
+            + BeanPropEnum.Conference.confdate + " char(8), "
+            + BeanPropEnum.Conference.confbegintime + " char(6), "
+            + BeanPropEnum.Conference.confendtime + " char(6), "
+            + BeanPropEnum.Conference.confsigntime + " char(6), "
+            + BeanPropEnum.Conference.conftype + " char(1), "
+            + BeanPropEnum.Conference.remark + " varchar(100)) ";
+
+    private static final String CREATE_TABLE_NAME_CONFIGPARA = "create table IF NOT EXISTS "
+            + TABLE_NAME_CONFIGPARA + " ( "
+            + BeanPropEnum.ConfigPara.id + " long primary key, "
+            + BeanPropEnum.ConfigPara.mode + " integer, "
+            + BeanPropEnum.ConfigPara.deviceid + " integer, "
+            + BeanPropEnum.ConfigPara.devicename + " varchar(64), "
+            + BeanPropEnum.ConfigPara.devphyid + " char(12), "
+            + BeanPropEnum.ConfigPara.epayIP + " varchar(128), "
+            + BeanPropEnum.ConfigPara.epayPort + " integer, "
+            + BeanPropEnum.ConfigPara.epayUri + " varchar(128), "
+            + BeanPropEnum.ConfigPara.initOK + " integer ) ";
+
+    private static final String DB_NAME = "supwisdom.swpos.dbdtl";
+    private static final int VERSION = 1;
+    private static volatile DBConferenceHelper instance;
+    private static final Lock lock = new ReentrantLock();
+
+    private DBConferenceHelper(Context context){
+        super(context, DB_NAME, null, VERSION);
+    }
+
+    public Lock getLock() {
+        return lock;
+    }
+
+    public static DBConferenceHelper getInstance(Context context) {
+        if (null == instance) {
+            synchronized (DBConferenceHelper.class) {
+                if (null == instance) {
+                    instance = new DBConferenceHelper(context);
+                }
+            }
+        }
+        return instance;
+    }
+
+    @Override
+    public void onCreate(SQLiteDatabase db) {
+        db.execSQL(CREATE_TABLE_NAME_CONFERENCE);
+        db.execSQL(CREATE_TABLE_NAME_CONFIGPARA);
+    }
+
+    @Override
+    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+        if(oldVersion < newVersion){
+
+        }
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/db/DBParaHelper.java b/app/src/main/java/com/supwisdom/db/DBParaHelper.java
new file mode 100644
index 0000000..b575fbb
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/db/DBParaHelper.java
@@ -0,0 +1,52 @@
+package com.supwisdom.db;
+
+import android.content.Context;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+public class DBParaHelper extends SQLiteOpenHelper {
+    public static final String TABLE_NAME_CONTROLPARA = "tb_controlpara";
+
+    private static final String CREATE_TABLE_NAME_CONTROLPARA = "create table IF NOT EXISTS "
+            + TABLE_NAME_CONTROLPARA + " ( "
+            + BeanPropEnum.ControlPara.name + " varchar(64) primary key,"
+            + BeanPropEnum.ControlPara.val + " varchar(64) )";
+
+    private static final String DB_NAME = "supwisdom.swpos.dbpara";
+
+    private static final int VERSION = 1;
+    private volatile static DBParaHelper instance;
+    private static final Lock lock = new ReentrantLock();
+
+    private DBParaHelper(Context context) {
+        super(context, DB_NAME, null, VERSION);
+    }
+
+    public static DBParaHelper getInstance(Context context) {
+        if (null == instance) {
+            synchronized (DBParaHelper.class) {
+                if (null == instance) {
+                    instance = new DBParaHelper(context);
+                }
+            }
+        }
+        return instance;
+    }
+
+    public Lock getLock() {
+        return lock;
+    }
+
+    @Override
+    public void onCreate(SQLiteDatabase db) {
+        db.execSQL(CREATE_TABLE_NAME_CONTROLPARA);
+    }
+
+    @Override
+    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/db/SDCardContext.java b/app/src/main/java/com/supwisdom/db/SDCardContext.java
new file mode 100644
index 0000000..d39a7de
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/db/SDCardContext.java
@@ -0,0 +1,69 @@
+package com.supwisdom.db;
+
+import android.content.Context;
+import android.content.ContextWrapper;
+import android.database.DatabaseErrorHandler;
+import android.database.sqlite.SQLiteDatabase;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * Created by zzq on 2016-10-14.
+ */
+public class SDCardContext extends ContextWrapper {
+    public SDCardContext(Context context) {
+        super(context);
+    }
+
+    @Override
+    public File getDatabasePath(String name) {
+        if (android.os.Environment.MEDIA_MOUNTED.equals(android.os.Environment.getExternalStorageState())) {
+            //获取sd卡路径
+            String dbDir = android.os.Environment.getExternalStorageDirectory().getAbsolutePath();
+            dbDir += "/supwisdom";//数据库所在目录
+            String dbPath = dbDir + "/" + name;//数据库路径
+            //判断目录是否存在，不存在则创建该目录
+            File dirFile = new File(dbDir);
+            if (!dirFile.exists()) {
+                dirFile.mkdirs();
+            }
+            File dbFile = new File(dbPath);
+            if (!dbFile.exists()) {
+                try {
+                    if (dbFile.createNewFile()) {
+                        return dbFile;
+                    }
+                } catch (IOException e) {
+                    // TODO Auto-generated catch block
+                    e.printStackTrace();
+                }
+            } else {
+                return dbFile;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public SQLiteDatabase openOrCreateDatabase(String name, int mode,
+                                               SQLiteDatabase.CursorFactory factory) {
+        File file = getDatabasePath(name);
+        if (file == null) {
+            return super.openOrCreateDatabase(name, mode, factory);
+        } else {
+            return SQLiteDatabase.openOrCreateDatabase(file, factory);
+        }
+    }
+
+    @Override
+    public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.
+            CursorFactory factory, DatabaseErrorHandler errorHandler) {
+        File file = getDatabasePath(name);
+        if (file == null) {
+            return super.openOrCreateDatabase(name, mode, factory, errorHandler);
+        } else {
+            return SQLiteDatabase.openOrCreateDatabase(file, factory);
+        }
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/okhttp/Callbackok.java b/app/src/main/java/com/supwisdom/okhttp/Callbackok.java
new file mode 100644
index 0000000..89f71b2
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/okhttp/Callbackok.java
@@ -0,0 +1,8 @@
+package com.supwisdom.okhttp;
+
+/**
+ * Created by zzq on 2016-05-20.
+ */
+public interface Callbackok<T> {
+  void callbackok(T t);
+}
diff --git a/app/src/main/java/com/supwisdom/okhttp/NetworkHandler.java b/app/src/main/java/com/supwisdom/okhttp/NetworkHandler.java
new file mode 100644
index 0000000..922eca7
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/okhttp/NetworkHandler.java
@@ -0,0 +1,278 @@
+package com.supwisdom.okhttp;
+
+import android.support.annotation.Nullable;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.SecureRandom;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.concurrent.TimeUnit;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+
+import okhttp3.Call;
+import okhttp3.FormBody;
+import okhttp3.MediaType;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+import okhttp3.Response;
+
+
+/**
+ * Created by zzq on 2016-04-12.
+ */
+@SuppressWarnings("ALL")
+public class NetworkHandler {
+    private static NetworkHandler instance = null;
+    private OkHttpClient client;
+    private final OkHttpClient clientLong;
+    private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
+    private static final MediaType FORM_ENCODE = MediaType.parse("application/x-www-form-urlencoded;charset=utf-8");
+    private int commTime = 2;
+
+    public void setCommTime(int communicateTime) {
+        if (communicateTime != 0 && commTime != communicateTime) {
+            this.commTime = communicateTime;
+            client = new OkHttpClient()
+                    .newBuilder()
+                    .retryOnConnectionFailure(false)
+                    .readTimeout(commTime, TimeUnit.SECONDS)
+                    .writeTimeout(1, TimeUnit.SECONDS)
+                    .connectTimeout(commTime, TimeUnit.SECONDS)
+                    .hostnameVerifier(new TrustAllHostnameVerifier())
+                    .sslSocketFactory(createSSLSocketFactory())
+                    .build();
+        }
+    }
+
+    private NetworkHandler() {
+        client = new OkHttpClient()
+                .newBuilder()
+                .retryOnConnectionFailure(false)
+                .readTimeout(commTime, TimeUnit.SECONDS)
+                .writeTimeout(1, TimeUnit.SECONDS)
+                .connectTimeout(commTime, TimeUnit.SECONDS)
+                .hostnameVerifier(new TrustAllHostnameVerifier())
+                .sslSocketFactory(createSSLSocketFactory())
+                .build();
+        clientLong = new OkHttpClient()
+                .newBuilder()
+                .retryOnConnectionFailure(false)
+                .readTimeout(35, TimeUnit.SECONDS)
+                .writeTimeout(1, TimeUnit.SECONDS)
+                .connectTimeout(3, TimeUnit.SECONDS)
+                .hostnameVerifier(new TrustAllHostnameVerifier())
+                .sslSocketFactory(createSSLSocketFactory())
+                .build();
+    }
+
+    private static class TrustAllCerts implements X509TrustManager {
+        @Override
+        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+        }
+
+        @Override
+        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+        }
+
+        @Override
+        public X509Certificate[] getAcceptedIssuers() {
+            return new X509Certificate[0];
+        }
+    }
+
+    private static class TrustAllHostnameVerifier implements HostnameVerifier {
+        @Override
+        public boolean verify(String hostname, SSLSession session) {
+            return true;
+        }
+    }
+
+    private static SSLSocketFactory createSSLSocketFactory() {
+        try {
+            SSLContext sc = SSLContext.getInstance("TLS");
+            sc.init(null, new TrustManager[]{new TrustAllCerts()}, new SecureRandom());
+            return sc.getSocketFactory();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static NetworkHandler getInstance() {
+        if (instance == null) {
+            synchronized (NetworkHandler.class) {
+                if (instance == null) {
+                    instance = new NetworkHandler();
+                }
+            }
+        }
+        return instance;
+    }
+
+    public TransResp get(String url, WebParams params) {
+        Request request = new Request.Builder()
+                .url(geturl(url, params))
+                .addHeader("Accept", "application/json; q=0.5")
+                .addHeader("Connection", "close")
+                .build();
+        return getTransResp(request);
+    }
+
+    public void get(String url, WebParams params, final Callbackok callback) {
+        Request request = new Request.Builder()
+                .url(geturl(url, params))
+                .addHeader("Accept", "application/json; q=0.5")
+                .addHeader("Connection", "close")
+                .build();
+        client.newCall(request).enqueue(new okhttp3.Callback() {
+            @Override
+            public void onFailure(Call call, IOException e) {
+                callback.callbackok(null);
+            }
+
+            @Override
+            public void onResponse(Call call, Response response) {
+                try {
+                    String content = response.body().string();
+                    TransResp resp = new TransResp(response.code(), response.message());
+                    if (response.isSuccessful()) {
+                        resp.setRetjson(content);
+                    }
+                    callback.callbackok(resp);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    callback.callbackok(null);
+                }
+            }
+        });
+    }
+
+    public TransResp post(String url, WebParams params) {
+        FormBody.Builder builder = new FormBody.Builder();
+        for (String name : params.allParameterNames()) {
+            builder.add(name, params.getParameterString(name));
+        }
+        Request request = new Request.Builder()
+                .url(url)
+                .addHeader("Accept", "application/json; q=0.5")
+                .addHeader("Content-type", "application/x-www-form-urlencoded")
+                .addHeader("Connection", "close")
+                .post(builder.build())
+                .build();
+        return getTransResp(request);
+    }
+
+    public TransResp longPost(String url, WebParams params) {
+        FormBody.Builder builder = new FormBody.Builder();
+        for (String name : params.allParameterNames()) {
+            builder.add(name, params.getParameterString(name));
+        }
+        Request request = new Request.Builder()
+                .url(url)
+                .addHeader("Accept", "application/json; q=0.5")
+                .addHeader("Content-type", "application/x-www-form-urlencoded")
+                .addHeader("Connection", "close")
+                .post(builder.build())
+                .build();
+        return getLongTransResp(request);
+    }
+
+    public TransResp post(String url, String json) {
+        RequestBody body = RequestBody.create(JSON, json);
+        Request request = new Request.Builder()
+                .url(url)
+                .addHeader("Accept", "application/json; q=0.5")
+                .addHeader("Content-type", "application/x-www-form-urlencoded")
+                .addHeader("Connection", "close")
+                .post(body)
+                .build();
+        return getTransResp(request);
+    }
+
+    public void post(String url, String json, final Callbackok callback) {
+        RequestBody body = RequestBody.create(JSON, json);
+        Request request = new Request.Builder()
+                .url(url)
+                .addHeader("Accept", "application/json; q=0.5")
+                .addHeader("Content-type", "application/x-www-form-urlencoded")
+                .addHeader("Connection", "close")
+                .post(body)
+                .build();
+        client.newCall(request).enqueue(new okhttp3.Callback() {
+            @Override
+            public void onFailure(Call call, IOException e) {
+                callback.callbackok(null);
+            }
+
+            @Override
+            public void onResponse(Call call, Response response) {
+                try {
+                    String content = response.body().string();
+                    TransResp resp = new TransResp(response.code(), response.message());
+                    if (response.isSuccessful()) {
+                        resp.setRetjson(content);
+                    }
+                    callback.callbackok(resp);
+                } catch (Exception e) {
+                    callback.callbackok(null);
+                }
+            }
+        });
+    }
+
+    @Nullable
+    private TransResp getLongTransResp(Request request) {
+        try {
+            Response response = clientLong.newCall(request).execute();
+            /*响应主体只能被消耗一次*/
+            String content = response.body().string();
+            TransResp resp = new TransResp(response.code(), response.message());
+            if (response.isSuccessful()) {
+                resp.setRetjson(content);
+            }
+            return resp;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    @Nullable
+    private TransResp getTransResp(Request request) {
+        try {
+            Response response = client.newCall(request).execute();
+            /*响应主体只能被消耗一次*/
+            String content = response.body().string();
+            TransResp resp = new TransResp(response.code(), response.message());
+            if (response.isSuccessful()) {
+                resp.setRetjson(content);
+            }
+            return resp;
+        } catch (Exception e) {
+            e.printStackTrace();
+            //通讯超时
+            return null;
+        }
+    }
+
+    private String geturl(String url, WebParams params) {
+        StringBuilder sb = new StringBuilder();
+        sb.append(url);
+        if (params != null) {
+            try {
+                sb.append(params.encodeURL());
+            } catch (UnsupportedEncodingException e) {
+                e.printStackTrace();
+            }
+        }
+        return sb.toString();
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/okhttp/TransResp.java b/app/src/main/java/com/supwisdom/okhttp/TransResp.java
new file mode 100644
index 0000000..6ae8d1c
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/okhttp/TransResp.java
@@ -0,0 +1,57 @@
+package com.supwisdom.okhttp;
+
+/**
+ * Created by linqing.he on 2015/1/12.
+ */
+public class TransResp {
+  /**
+   * HTTP返回码
+   */
+  private int retcode;
+  /**
+   * 返回消息，如果是200 则为空，非200则为返回错误信息
+   */
+  private String retmsg;
+  /**
+   * 返回json信息
+   */
+  private String retjson;
+
+  public TransResp() {
+
+  }
+
+  public TransResp(int retcode, String retmsg) {
+    this.retcode = retcode;
+    this.retmsg = retmsg;
+  }
+
+  public int getRetcode() {
+    return retcode;
+  }
+
+  public void setRetcode(int retcode) {
+    this.retcode = retcode;
+  }
+
+  public String getRetmsg() {
+    return retmsg;
+  }
+
+  public void setRetmsg(String retmsg) {
+    this.retmsg = retmsg;
+  }
+
+  public String getRetjson() {
+    return retjson;
+  }
+
+  public void setRetjson(String retjson) {
+    this.retjson = retjson;
+  }
+
+  @Override
+  public String toString() {
+    return retcode + retmsg + retjson;
+  }
+}
diff --git a/app/src/main/java/com/supwisdom/okhttp/WebAPISession.java b/app/src/main/java/com/supwisdom/okhttp/WebAPISession.java
new file mode 100644
index 0000000..b8abcaa
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/okhttp/WebAPISession.java
@@ -0,0 +1,74 @@
+package com.supwisdom.okhttp;
+
+import com.supwisdom.util.PublicDef;
+
+/**
+ * Copyright (C), 2000-2013, Supwisdom Co., Ltd.
+ * File custname: com.supwisdom.protocol
+ * Description: TODO Modify History（或Change Log）:
+ * 操作类型（创建、修改等） 操作日期 操作者 操作内容简述
+ * 创建 13-4-19 tangcheng
+ * <p/>
+ *
+ * @author tangcheng
+ * @version 1.0
+ * @since 1.0
+ */
+public class WebAPISession implements Cloneable {
+    public String getAppId() {
+        return appId;
+    }
+
+    public String getAppSecret() {
+        return appSecret;
+    }
+
+    public String getTermId() {
+        return termId;
+    }
+
+
+    public void setTermId(String termId) {
+        this.termId = termId;
+    }
+
+    /**
+     * appid，appsecret暂时写死在代码
+     */
+    private final String appId = PublicDef.APP_ID;
+    private final String appSecret = PublicDef.APP_SECRET;
+    private String termId = "";
+    public String epayurl = "";
+    private String sessionKey = null;
+
+    public String getEpayurl() {
+        return epayurl;
+    }
+
+    public void setEpayurl(String epayurl) {
+        this.epayurl = epayurl;
+    }
+
+    private boolean isAuthorized;
+
+    public WebAPISession() {
+        isAuthorized = false;
+    }
+
+    @Override
+    public Object clone() throws CloneNotSupportedException {
+        WebAPISession another = new WebAPISession();
+        another.termId = this.termId;
+        another.sessionKey = this.sessionKey;
+        another.isAuthorized = isAuthorized;
+        return another;
+    }
+
+    public String getSessionKey() {
+        return sessionKey;
+    }
+
+    public void setSessionKey(String sessionKey) {
+        this.sessionKey = sessionKey;
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/okhttp/WebParams.java b/app/src/main/java/com/supwisdom/okhttp/WebParams.java
new file mode 100644
index 0000000..5b3d3a1
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/okhttp/WebParams.java
@@ -0,0 +1,109 @@
+package com.supwisdom.okhttp;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.Set;
+
+/**
+ * Copyright (C), 2000-2013, Supwisdom Co., Ltd.
+ * File custname: com.supwisdom.protocol
+ * Description: TODO Modify History（或Change Log）:
+ * 操作类型（创建、修改等） 操作日期 操作者 操作内容简述
+ * 创建 13-4-19 tangcheng
+ * <p/>
+ *
+ * @author tangcheng
+ * @version 1.0
+ * @since 1.0
+ */
+public class WebParams {
+  private HashMap<String, Object> mParameters = new HashMap<String, Object>();
+
+  public WebParams() {
+  }
+
+  public WebParams setParameter(String name, String value) {
+    mParameters.put(name, value);
+    return this;
+  }
+
+  public WebParams setParameter(String name, int value) {
+    mParameters.put(name, value);
+    return this;
+  }
+
+  public WebParams setParameter(String name, float value) {
+    mParameters.put(name, value);
+    return this;
+  }
+
+  public String getParameterString(String name) {
+    Object ret = mParameters.get(name);
+    if (String.class.isInstance(ret)) {
+      return (String) ret;
+    } else if (Integer.class.isInstance(ret)) {
+      return String.valueOf(ret);
+    } else if (Double.class.isInstance(ret)) {
+      return String.valueOf(ret);
+    }
+    return "";
+  }
+
+  public int getParameterInt(String name) {
+    Object ret = mParameters.get(name);
+    if (Integer.class.isInstance(ret)) {
+      return (Integer) ret;
+    }
+    return 0;
+  }
+
+  public float getParameterFloat(String name) {
+    Object ret = mParameters.get(name);
+    if (Float.class.isInstance(ret)) {
+      return (Float) ret;
+    }
+    return 0;
+  }
+
+  public void removeParameter(String name) {
+    if (mParameters.containsKey(name)) {
+      mParameters.remove(name);
+    }
+  }
+
+  public String encodeURL() throws UnsupportedEncodingException {
+    StringBuilder result = new StringBuilder();
+    for (String name : mParameters.keySet()) {
+      Object value = mParameters.get(name);
+      result.append(URLEncoder.encode(name, "utf-8"))
+          .append("=")
+          .append(URLEncoder.encode(value.toString(), "utf-8"))
+          .append("&");
+    }
+    return result.toString();
+  }
+
+  public int encodeURL(OutputStream output) throws IOException {
+    DataOutputStream byteStream = new DataOutputStream(output);
+    Writer writer = new OutputStreamWriter(byteStream, "utf-8");
+    for (String name : mParameters.keySet()) {
+      Object value = mParameters.get(name);
+      writer.write(URLEncoder.encode(name, "utf-8"));
+      writer.write("=");
+      writer.write(URLEncoder.encode(value.toString(), "utf-8"));
+      writer.write("&");
+    }
+    return byteStream.size();
+  }
+
+  public Set<String> allParameterNames() {
+    return mParameters.keySet();
+  }
+
+}
diff --git a/app/src/main/java/com/supwisdom/service/ConferenceApi.java b/app/src/main/java/com/supwisdom/service/ConferenceApi.java
new file mode 100644
index 0000000..1c8c18f
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/service/ConferenceApi.java
@@ -0,0 +1,174 @@
+package com.supwisdom.service;
+
+import com.supwisdom.bean.AttRateBean;
+import com.supwisdom.bean.BaseResp;
+import com.supwisdom.bean.CheckDtlBean;
+import com.supwisdom.bean.CheckDtlResp;
+import com.supwisdom.bean.ConferenceBean;
+import com.supwisdom.bean.ConferenceResp;
+import com.supwisdom.conferencecheck.SPApplication;
+import com.supwisdom.conferencecheck.YktSession;
+import com.supwisdom.okhttp.TransResp;
+import com.supwisdom.okhttp.WebParams;
+import com.supwisdom.swterm.ConferenceRecord;
+import com.supwisdom.swterm.Pos;
+import com.supwisdom.util.GsonUtil;
+import com.supwisdom.util.LogUtil;
+import com.supwisdom.util.PublicDef;
+
+import org.apache.http.HttpStatus;
+
+public class ConferenceApi {
+
+    private String TAG = "ConferenceApi";
+
+    private Pos pos;
+
+    public ConferenceApi(){
+        pos = SPApplication.getsInstance().getPos();
+    }
+
+    public BaseResp checkLink(){
+        try{
+            WebParams params = new WebParams();
+            params.setParameter("devphyid", pos.getConfigPara().getDevphyid());
+            TransResp resp = YktSession.getInstance().sendYktRequestPost("/conference/test", params);
+            if(resp == null){
+                return new BaseResp(PublicDef.ERROR, "通讯超时");
+            }
+            if (resp.getRetcode() != HttpStatus.SC_OK) {
+                return new BaseResp(PublicDef.ERROR, "链接错误码:"+resp.getRetcode()+"-"+resp.getRetmsg());
+            }
+            BaseResp baseResp = GsonUtil.GsonToBean(resp.getRetjson(), BaseResp.class);
+            if(baseResp.getRetcode() != PublicDef.SUCCESS){
+                return new BaseResp(PublicDef.ERROR, "链接失败:"+baseResp.getRetcode() + "-" +baseResp.getRetmsg());
+            }
+            return new BaseResp(PublicDef.SUCCESS, "链接成功");
+        }catch (Exception e){
+            e.printStackTrace();
+            LogUtil.d(TAG, "checkLink exception:" + e.getMessage());
+            return new BaseResp(PublicDef.ERROR, "链接异常");
+        }
+    }
+
+    public BaseResp syncConference(String date){
+        try{
+            WebParams params = new WebParams();
+            params.setParameter("devphyid", pos.getConfigPara().getDevphyid())
+                    .setParameter("confdate", date);
+            TransResp resp = YktSession.getInstance().sendYktRequestPost("/conference/getconference", params);
+            if(resp == null){
+                return new BaseResp(PublicDef.ERROR, "通讯超时");
+            }
+            if (resp.getRetcode() != HttpStatus.SC_OK) {
+                return new BaseResp(PublicDef.ERROR, "同步会议错误码:"+resp.getRetcode()+"-"+resp.getRetmsg());
+            }
+            ConferenceResp conferenceResp = GsonUtil.GsonToBean(resp.getRetjson(), ConferenceResp.class);
+            if(conferenceResp.getRetcode() != PublicDef.SUCCESS){
+                return new BaseResp(PublicDef.ERROR, "同步会议失败:"+conferenceResp.getRetcode()+"-"+conferenceResp.getRetmsg());
+            }
+            if(null != conferenceResp.getConflist() && conferenceResp.getConflist().size() > 0){
+                boolean saveResult = true;
+                for(int i=0; i<conferenceResp.getConflist().size(); i++){
+                    ConferenceBean cb = conferenceResp.getConflist().get(i);
+                    ConferenceRecord cr = pos.getConferenceById(cb.getConfid());
+                    if(null == cr){
+                        // 本地没有此会议id，保存
+                        ConferenceRecord record = new ConferenceRecord();
+                        record.setConfid(cb.getConfid());
+                        record.setConfname(cb.getConfname());
+                        record.setConfdate(cb.getConfdate());
+                        record.setConftype(cb.getConftype());
+                        record.setConfbegintime(cb.getStarttime());
+                        record.setConfendtime(cb.getEndtime());
+                        record.setConfsigntime(cb.getAttendtime());
+                        record.setConfaddr(cb.getConfarea());
+                        if(!pos.insertConference(record)){
+                            saveResult = false;
+                            break;
+                        }
+                    }
+                }
+                if(!saveResult)
+                    return new BaseResp(PublicDef.ERROR, "保存会议异常");
+            }
+            return new BaseResp(PublicDef.SUCCESS, "同步成功");
+        }catch (Exception e){
+            e.printStackTrace();
+            LogUtil.d(TAG, "syncConference exception："+e.getMessage());
+            return new BaseResp(PublicDef.ERROR, "同步会议异常");
+        }
+    }
+
+    public AttRateBean getAttrate(int confid){
+        AttRateBean attRateBean = new AttRateBean();
+        try{
+            WebParams params = new WebParams();
+            params.setParameter("confid", confid);
+            TransResp resp = YktSession.getInstance().sendYktRequestPost("/conference/getattrate", params);
+            if(resp == null){
+                attRateBean.setRetcode(PublicDef.ERROR);
+                attRateBean.setRetmsg("通讯超时");
+                return attRateBean;
+            }
+            if (resp.getRetcode() != HttpStatus.SC_OK) {
+                attRateBean.setRetcode(PublicDef.ERROR);
+                attRateBean.setRetmsg("签到率错误码:"+resp.getRetcode()+"-"+resp.getRetmsg());
+                return attRateBean;
+            }
+            AttRateBean baseResp = GsonUtil.GsonToBean(resp.getRetjson(), AttRateBean.class);
+            if(baseResp.getRetcode() != PublicDef.SUCCESS){
+                attRateBean.setRetcode(PublicDef.ERROR);
+                attRateBean.setRetmsg("查询签到率失败:"+baseResp.getRetcode()+"-"+baseResp.getRetmsg());
+                return attRateBean;
+            }
+            attRateBean.setRetcode(PublicDef.SUCCESS);
+            attRateBean.setRetmsg("查询签到率成功");
+            attRateBean.setTotcnt(baseResp.getTotcnt());
+            attRateBean.setActualcnt(baseResp.getActualcnt());
+            attRateBean.setAttrate(baseResp.getAttrate());
+            return attRateBean;
+        }catch (Exception e){
+            e.printStackTrace();
+            LogUtil.d(TAG, "getAttRate exception:" + e.getMessage());
+            attRateBean.setRetcode(PublicDef.ERROR);
+            attRateBean.setRetmsg("查询签到率异常");
+            return attRateBean;
+        }
+    }
+
+    public CheckDtlResp getCheckDtl(int confid){
+        CheckDtlResp checkDtlResp = new CheckDtlResp();
+        try{
+            WebParams params = new WebParams();
+            params.setParameter("confid", confid+"");
+            TransResp resp = YktSession.getInstance().sendYktRequestPost("/conference/getconfpeople", params);
+            if(resp == null){
+                checkDtlResp.setRetcode(PublicDef.ERROR);
+                checkDtlResp.setRetmsg("通讯超时");
+                return checkDtlResp;
+            }
+            if (resp.getRetcode() != HttpStatus.SC_OK) {
+                checkDtlResp.setRetcode(PublicDef.ERROR);
+                checkDtlResp.setRetmsg("签到流水错误码:"+resp.getRetcode()+"-"+resp.getRetmsg());
+                return checkDtlResp;
+            }
+            CheckDtlResp baseResp = GsonUtil.GsonToBean(resp.getRetjson(), CheckDtlResp.class);
+            if(baseResp.getRetcode() != PublicDef.SUCCESS){
+                checkDtlResp.setRetcode(PublicDef.ERROR);
+                checkDtlResp.setRetmsg("查询签到流水失败:"+baseResp.getRetcode()+"-"+baseResp.getRetmsg());
+                return checkDtlResp;
+            }
+            checkDtlResp.setRetcode(PublicDef.SUCCESS);
+            checkDtlResp.setRetmsg("查询流水成功");
+            checkDtlResp.setPeoplelist(baseResp.getPeoplelist());
+            return checkDtlResp;
+        }catch (Exception e){
+            e.printStackTrace();
+            LogUtil.d(TAG, "getCheckDtl exception:" + e.getMessage());
+            checkDtlResp.setRetcode(PublicDef.ERROR);
+            checkDtlResp.setRetmsg("查询签到流水异常");
+            return checkDtlResp;
+        }
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/swterm/CheckRecord.java b/app/src/main/java/com/supwisdom/swterm/CheckRecord.java
new file mode 100644
index 0000000..47b9894
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/swterm/CheckRecord.java
@@ -0,0 +1,58 @@
+package com.supwisdom.swterm;
+
+public class CheckRecord {
+    private String custname;
+    private String custtypename;
+    private String deptname;
+    private String date;
+    private String time;
+    private String status;
+
+    public String getCustname() {
+        return custname;
+    }
+
+    public void setCustname(String custname) {
+        this.custname = custname;
+    }
+
+    public String getCusttypename() {
+        return custtypename;
+    }
+
+    public void setCusttypename(String custtypename) {
+        this.custtypename = custtypename;
+    }
+
+    public String getDeptname() {
+        return deptname;
+    }
+
+    public void setDeptname(String deptname) {
+        this.deptname = deptname;
+    }
+
+    public String getDate() {
+        return date;
+    }
+
+    public void setDate(String date) {
+        this.date = date;
+    }
+
+    public String getTime() {
+        return time;
+    }
+
+    public void setTime(String time) {
+        this.time = time;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/swterm/ConferenceRecord.java b/app/src/main/java/com/supwisdom/swterm/ConferenceRecord.java
new file mode 100644
index 0000000..89f4557
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/swterm/ConferenceRecord.java
@@ -0,0 +1,85 @@
+package com.supwisdom.swterm;
+
+public class ConferenceRecord {
+    private int confid;
+    private String confname;
+    private String confaddr;
+    private String confdate;
+    private String confbegintime;
+    private String confendtime;
+    private String confsigntime;
+    private String conftype;
+    private String remark;
+
+    public int getConfid() {
+        return confid;
+    }
+
+    public void setConfid(int confid) {
+        this.confid = confid;
+    }
+
+    public String getConfname() {
+        return confname;
+    }
+
+    public void setConfname(String confname) {
+        this.confname = confname;
+    }
+
+    public String getConfaddr() {
+        return confaddr;
+    }
+
+    public void setConfaddr(String confaddr) {
+        this.confaddr = confaddr;
+    }
+
+    public String getConfdate() {
+        return confdate;
+    }
+
+    public void setConfdate(String confdate) {
+        this.confdate = confdate;
+    }
+
+    public String getConfbegintime() {
+        return confbegintime;
+    }
+
+    public void setConfbegintime(String confbegintime) {
+        this.confbegintime = confbegintime;
+    }
+
+    public String getConfendtime() {
+        return confendtime;
+    }
+
+    public void setConfendtime(String confendtime) {
+        this.confendtime = confendtime;
+    }
+
+    public String getConfsigntime() {
+        return confsigntime;
+    }
+
+    public void setConfsigntime(String confsigntime) {
+        this.confsigntime = confsigntime;
+    }
+
+    public String getConftype() {
+        return conftype;
+    }
+
+    public void setConftype(String conftype) {
+        this.conftype = conftype;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/swterm/ConfigParaRecord.java b/app/src/main/java/com/supwisdom/swterm/ConfigParaRecord.java
new file mode 100644
index 0000000..f6a69dd
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/swterm/ConfigParaRecord.java
@@ -0,0 +1,78 @@
+package com.supwisdom.swterm;
+
+public class ConfigParaRecord {
+    private int mode;// 功能模式 1--会议签到
+    private int deviceid; // 设备ID
+    private String devicename;//设备名称
+    private String devphyid;
+
+    private String epayIP;
+    private int epayPort;
+    private String epayUri;
+
+    private boolean initOK; //是否初始化 true--已初始化,false--未初始化
+
+    public int getMode() {
+        return mode;
+    }
+
+    public void setMode(int mode) {
+        this.mode = mode;
+    }
+
+    public int getDeviceid() {
+        return deviceid;
+    }
+
+    public void setDeviceid(int deviceid) {
+        this.deviceid = deviceid;
+    }
+
+    public String getDevicename() {
+        return devicename;
+    }
+
+    public void setDevicename(String devicename) {
+        this.devicename = devicename;
+    }
+
+    public String getDevphyid() {
+        return devphyid;
+    }
+
+    public void setDevphyid(String devphyid) {
+        this.devphyid = devphyid;
+    }
+
+    public String getEpayIP() {
+        return epayIP;
+    }
+
+    public void setEpayIP(String epayIP) {
+        this.epayIP = epayIP;
+    }
+
+    public int getEpayPort() {
+        return epayPort;
+    }
+
+    public void setEpayPort(int epayPort) {
+        this.epayPort = epayPort;
+    }
+
+    public String getEpayUri() {
+        return epayUri;
+    }
+
+    public void setEpayUri(String epayUri) {
+        this.epayUri = epayUri;
+    }
+
+    public boolean isInitOK() {
+        return initOK;
+    }
+
+    public void setInitOK(boolean initOK) {
+        this.initOK = initOK;
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/swterm/ControlParaRecord.java b/app/src/main/java/com/supwisdom/swterm/ControlParaRecord.java
new file mode 100644
index 0000000..33e1e11
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/swterm/ControlParaRecord.java
@@ -0,0 +1,30 @@
+package com.supwisdom.swterm;
+
+public class ControlParaRecord {
+    private String name;
+    private String value;
+
+    public ControlParaRecord() {
+    }
+
+    public ControlParaRecord(String name, String value) {
+        this.name = name;
+        this.value = value;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/swterm/Pos.java b/app/src/main/java/com/supwisdom/swterm/Pos.java
new file mode 100644
index 0000000..77a1dff
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/swterm/Pos.java
@@ -0,0 +1,127 @@
+package com.supwisdom.swterm;
+
+import android.content.Context;
+
+import com.supwisdom.db.ConferenceDao;
+import com.supwisdom.db.ConfigParaDao;
+import com.supwisdom.db.ControlParaDao;
+import com.supwisdom.db.SDCardContext;
+
+import java.util.HashMap;
+import java.util.List;
+
+public class Pos {
+    private final Context context;
+
+    private ConferenceDao conferenceDao;
+
+    private ControlParaDao controlParaDao;
+    private HashMap<String, ControlParaRecord> controlParamap;
+
+    private ConfigParaDao configParaDao;
+    private ConfigParaRecord configParaRecord;
+
+    public Pos(Context context){
+        this.context = context;
+        controlParaDao = ControlParaDao.getInstance(context);
+        controlParamap = new HashMap<>();
+
+        // 存储到SD卡
+        SDCardContext sdContext = new SDCardContext(context);
+        conferenceDao = ConferenceDao.getInstance(sdContext);
+        configParaDao = ConfigParaDao.getInstance(sdContext);
+    }
+
+    public List<ConferenceRecord> getConferences(String date){
+        try {
+            conferenceDao.getLock().lock();
+            return conferenceDao.getByDate(date);
+        } finally {
+            conferenceDao.getLock().unlock();
+        }
+    }
+
+    public ConferenceRecord getConference(String date, String time){
+        try {
+            conferenceDao.getLock().lock();
+            return conferenceDao.getByDateTime(date, time);
+        } finally {
+            conferenceDao.getLock().unlock();
+        }
+    }
+
+    public ConferenceRecord getConferenceById(int conid){
+        try {
+            conferenceDao.getLock().lock();
+            return conferenceDao.get(conid);
+        } finally {
+            conferenceDao.getLock().unlock();
+        }
+    }
+
+    public boolean insertConference(ConferenceRecord record) {
+        try {
+            conferenceDao.getLock().lock();
+            if (conferenceDao.save(record)) {
+                return true;
+            }
+        } finally {
+            conferenceDao.getLock().unlock();
+        }
+        return false;
+    }
+
+    public boolean replaceConfigPara(ConfigParaRecord record) {
+        try {
+            configParaDao.getLock().lock();
+            if (configParaDao.replace(record)) {
+                configParaRecord = record;
+                return true;
+            }
+        } finally {
+            configParaDao.getLock().unlock();
+        }
+        return false;
+    }
+
+    public ConfigParaRecord getConfigPara() {
+        if (configParaRecord == null) {
+            try {
+                configParaDao.getLock().lock();
+                configParaRecord = configParaDao.get();
+            } finally {
+                configParaDao.getLock().unlock();
+            }
+        }
+        return configParaRecord;
+    }
+
+    public boolean replaceControlPara(ControlParaRecord record) {
+        try {
+            controlParaDao.getLock().lock();
+            if (controlParaDao.replace(record)) {
+                controlParamap.put(record.getName(), record);
+                return true;
+            }
+        } finally {
+            controlParaDao.getLock().unlock();
+        }
+        return false;
+    }
+
+    public ControlParaRecord getControlPara(String name) {
+        if (controlParamap.containsKey(name)) {
+            return controlParamap.get(name);
+        }
+        try {
+            controlParaDao.getLock().lock();
+            ControlParaRecord record = controlParaDao.get(name);
+            if (record != null) {
+                controlParamap.put(record.getName(), record);
+            }
+            return record;
+        } finally {
+            controlParaDao.getLock().unlock();
+        }
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/util/AppExitUtil.java b/app/src/main/java/com/supwisdom/util/AppExitUtil.java
new file mode 100644
index 0000000..3e6dedb
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/util/AppExitUtil.java
@@ -0,0 +1,56 @@
+package com.supwisdom.util;
+
+import android.app.Activity;
+
+import java.util.HashSet;
+import java.util.Iterator;
+
+/**
+ * Created by jov on 2015/2/5.
+ */
+public class AppExitUtil {
+    private static HashSet<Activity> acys = new HashSet<>();
+
+    public static void add(Activity acy) {
+        acys.add(acy);
+    }
+
+    public static void remove(Activity acy) {
+        acys.remove(acy);
+        if (!acy.isFinishing()) {
+            acy.finish();
+        }
+        if (acys.size() == 0) {
+            killprocess();
+        }
+    }
+
+    public static void exit() {
+        Iterator iter = acys.iterator();
+        Activity arrs[] = new Activity[acys.size()];
+        int i = 0;
+        while (iter.hasNext()) {
+            Activity tmp = (Activity) iter.next();
+            arrs[i] = tmp;
+            i += 1;
+        }
+        acys.clear();
+        for (int j = 0; j < arrs.length; j++) {
+            if (arrs[j] != null && !arrs[j].isFinishing()) {
+                arrs[j].finish();
+                arrs[j] = null;
+            }
+        }
+        killprocess();
+    }
+
+    private static void killprocess() {
+        ThreadPool.getShortPool().execute(new Runnable() {
+            @Override
+            public void run() {
+                CommonUtil.doSleep(2000);
+                android.os.Process.killProcess(android.os.Process.myPid());
+            }
+        });
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/util/CommonUtil.java b/app/src/main/java/com/supwisdom/util/CommonUtil.java
new file mode 100644
index 0000000..06b34bd
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/util/CommonUtil.java
@@ -0,0 +1,860 @@
+package com.supwisdom.util;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.media.AudioManager;
+import android.media.SoundPool;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.net.Uri;
+import android.os.Build;
+import android.os.PowerManager;
+import android.provider.Settings;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.EditText;
+
+import com.google.zxing.common.BitSource;
+import com.google.zxing.qrcode.decoder.Mode;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.lang.reflect.Method;
+import java.security.InvalidParameterException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.text.DecimalFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+
+/**
+ * Created by jov on 2015/1/16.
+ */
+@SuppressWarnings("ALL")
+public class CommonUtil {
+    private static FastDateFormat FORMAT_yyyyMMdd = FastDateFormat.getInstance("yyyyMMdd");
+    private static FastDateFormat FORMAT_yyMMdd = FastDateFormat.getInstance("yyMMdd");
+    private static FastDateFormat FORMAT_HHmmss = FastDateFormat.getInstance("HHmmss");
+    private static FastDateFormat FORMAT_HHmm = FastDateFormat.getInstance("HHmm");
+    private static FastDateFormat FORMAT_yyyyMMddHHmmss = FastDateFormat.getInstance("yyyyMMddHHmmss");
+    private static FastDateFormat FORMAT_yyyy_MM_dd_HH_mm_ss = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");
+    private static FastDateFormat FORMAT_yyyy_MM_dd = FastDateFormat.getInstance("yyyy-MM-dd");
+    private static FastDateFormat FORMAT_HH_mm_ss = FastDateFormat.getInstance("HH:mm:ss");
+    private static FastDateFormat FORMAT_HH_mm = FastDateFormat.getInstance("HH:mm");
+    private static FastDateFormat FORMAT_WEEK = FastDateFormat.getInstance("EEEE");
+
+    private static int soundId;
+    private static SoundPool soundPool;
+    private static HashMap<Integer, Integer> soundMap = new HashMap<>();
+
+    public static void DUMP(String classname, String logmsg) {
+        if (isEmpty(logmsg)) {
+            return;
+        }
+        String datetime = getNowDateTimeNoFormat();
+        StringBuilder msg = new StringBuilder();
+        msg.append(classname).append("-").append(datetime.substring(8)).append("\r\n").append(logmsg);
+        FileUtil.writeLogFile(msg.toString());
+    }
+
+    public static String getExceptionStack(Exception e) {
+        if (e == null) {
+            return "null";
+        }
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter(sw);
+        e.printStackTrace(pw);
+        return sw.toString();
+    }
+
+    /**
+     * 计算超时时间，精确到毫秒
+     *
+     * @param milliSeconds
+     * @return
+     */
+    public static long getExpireTime(long milliSeconds) {
+        return (new Date().getTime() + milliSeconds);
+    }
+
+    public static long getNowTime() {
+        return new Date().getTime();
+    }
+
+    public static String getNowDate() {
+        return FORMAT_yyyy_MM_dd_HH_mm_ss.format(new Date());
+    }
+
+    public static String getWeek() {
+        return FORMAT_WEEK.format(new Date());
+    }
+
+    public static String getNowDateSpecFormat() {
+        return FORMAT_yyyy_MM_dd.format(new Date());
+    }
+
+    public static String getNowTimeSpecFormat() {
+        return FORMAT_HH_mm_ss.format(new Date());
+    }
+
+    public static String getNowDateTimeNoFormat() {
+        return FORMAT_yyyyMMddHHmmss.format(new Date());
+    }
+
+    public static String getNowShortDateNoFormat() {
+        return FORMAT_yyMMdd.format(new Date());
+    }
+
+    public static String getNowDateNoFormat() {
+        return FORMAT_yyyyMMdd.format(new Date());
+    }
+
+    public static String getNowTimeNoFormat() {
+        return FORMAT_HHmmss.format(new Date());
+    }
+
+    public static String getNowTimeNoFormat2() {
+        return FORMAT_HHmm.format(new Date());
+    }
+
+    public static String getYesterdayDateNoFormat() {
+        return FORMAT_yyyyMMdd.format(new Date(new Date().getTime() - 24 * 60 * 60 * 1000));
+    }
+
+    public static String getDayDateNoFormatBefore(int daynum) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.add(Calendar.DATE, -daynum);
+        return FORMAT_yyyyMMdd.format(calendar.getTime());
+    }
+
+    public static long getNowTimeByDateString(String datetime) {
+        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
+        try {
+            return format.parse(datetime).getTime();
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return 0;
+    }
+
+    public static boolean isEmpty(String str) {
+        return str == null || str.trim().length() == 0;
+    }
+
+    public static boolean isNetWorkConnected(Context context) {
+        if (context != null) {
+            ConnectivityManager mConnectivityManager = (ConnectivityManager) context
+                    .getSystemService(Context.CONNECTIVITY_SERVICE);
+            NetworkInfo mNetworkInfo = mConnectivityManager
+                    .getActiveNetworkInfo();
+            if (mNetworkInfo != null) {
+                return mNetworkInfo.isAvailable();
+            }
+        }
+        return false;
+    }
+
+    public static boolean isNumeric(String str) {
+        Pattern pattern = Pattern.compile("[0-9]*");
+        Matcher isNum = pattern.matcher(str);
+        if (!isNum.matches()) {
+            return false;
+        }
+        return true;
+    }
+
+    public static String formatDate(String date){
+        if(null == date)
+            return "";
+        if(date.length() != 8)
+            return date;
+        return date.substring(0,4) + "-" + date.substring(4, 6) + "-" + date.substring(6);
+    }
+
+    public static String formatTime(String time){
+        if(null == time)
+            return "";
+        if(time.length() == 4){
+            return time.substring(0,2) + ":" + time.substring(2);
+        }else if(time.length() == 6){
+            return time.substring(0,2) + ":" + time.substring(2,4) + ":" + time.substring(4);
+        }else{
+            return time;
+        }
+    }
+
+    public static boolean isIP(String str) {
+        if (str.matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}")) {
+            String s[] = str.split("\\.");
+            if (Integer.parseInt(s[0]) < 255)
+                if (Integer.parseInt(s[1]) < 255)
+                    if (Integer.parseInt(s[2]) < 255)
+                        if (Integer.parseInt(s[3]) < 255)
+                            return true;
+        }
+        return false;
+    }
+
+    public static String getSystemMills() {
+        return String.format("%08d", System.currentTimeMillis() % 10000000);
+    }
+
+    /**
+     * 获得指定日期的前一天
+     */
+    public static String getSpecifiedDayBefore(String specifiedDay) {
+        //SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        Calendar c = Calendar.getInstance();
+        Date date = null;
+        try {
+            date = new SimpleDateFormat("yyyyMMdd").parse(specifiedDay);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        c.setTime(date);
+        int day = c.get(Calendar.DATE);
+        c.set(Calendar.DATE, day - 1);
+        String dayBefore = new SimpleDateFormat("yyyyMMdd").format(c.getTime());
+        return dayBefore;
+    }
+
+    /**
+     * 获得指定日期的后一天
+     */
+    public static String getSpecifiedDayAfter(String specifiedDay) {
+        Calendar c = Calendar.getInstance();
+        Date date = null;
+        try {
+            date = new SimpleDateFormat("yyyyMMdd").parse(specifiedDay);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        c.setTime(date);
+        int day = c.get(Calendar.DATE);
+        c.set(Calendar.DATE, day + 1);
+        String dayAfter = new SimpleDateFormat("yyyyMMdd").format(c.getTime());
+        return dayAfter;
+    }
+
+    public static String encodingMD5(String val) {
+        MessageDigest md5 = null;
+        try {
+            md5 = MessageDigest.getInstance("MD5");
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException("MD5 should be unsupported", e);
+        }
+        md5.update(val.getBytes());
+        byte[] m = md5.digest();//加密
+        return getString(m);
+    }
+
+    private static String getString(byte[] b) {
+        StringBuffer sb = new StringBuffer();
+        for (int i = 0; i < b.length; i++) {
+            sb.append(b[i]);
+        }
+        return sb.toString();
+    }
+
+    public static String showFormatAmount(String preHint, int amount) {
+        return String.format("%s: %.02f元", preHint, amount / 100.0f);
+    }
+
+    /**
+     * 作用:读取该字节某一位的值是否为1
+     * 为1返回true
+     * 为0返回false
+     *
+     * @param data
+     * @param bitOffset
+     * @return
+     */
+    public static boolean checkBit(byte data, int bitOffset) {
+        int result = 0;
+        result = data & (1 << bitOffset);//00011000
+        if (result == 0) {
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+    public static int setBit(int data, int position) {
+        int finalPos = 7 - position;
+        int result = data;
+        result |= (1 << finalPos);
+        return result;
+    }
+
+    public static int clearBit(int data, int position) {
+        int finalPos = 7 - position;
+        int result = data;
+        result &= ~(1 << finalPos);
+        return result;
+    }
+
+    public static void setDatetime(String date, String time) {
+        try {
+            Process process = Runtime.getRuntime().exec("su");
+            String datetime = date + "." + time; //测试的设置的时间【时间格式 yyyyMMdd.HHmmss】
+            DataOutputStream os = new DataOutputStream(process.getOutputStream());
+            os.writeBytes("setprop persist.sys.timezone GMT\n");
+            os.writeBytes("/system/bin/date -s " + datetime + "\n");
+            os.writeBytes("clock -w\n");
+            os.writeBytes("exit\n");
+            os.flush();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void doSleep(long ms) {
+        try {
+            Thread.sleep(ms);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+    }
+
+    private static String hexStr = "0123456789ABCDEF";
+
+    public static byte[] hexStringToBinary(String hexString) {
+        String tmp = hexString.toUpperCase();
+        //hexString的长度对2取整，作为bytes的长度
+        int len = tmp.length() / 2;
+        byte[] bytes = new byte[len];
+        byte high = 0;//字节高四位
+        byte low = 0;//字节低四位
+
+        for (int i = 0; i < len; i++) {
+            //右移四位得到高位
+            high = (byte) ((hexStr.indexOf(tmp.charAt(2 * i))) << 4);
+            low = (byte) hexStr.indexOf(tmp.charAt(2 * i + 1));
+            bytes[i] = (byte) (high | low);//高地位做或运算
+        }
+        return bytes;
+    }
+
+    public static String getHexStringByBytes(byte[] bytes) {
+        StringBuilder sb = new StringBuilder();
+        int i;
+        for (i = 0; i < bytes.length; i++) {
+            sb.append(hexStr.charAt((bytes[i] >> 4) & 0x0F)).append(hexStr.charAt((bytes[i] & 0x0F)));
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 加密
+     *
+     * @param content 待加密内容
+     * @param key     加密的密钥
+     * @return
+     */
+    private static byte[] mIV = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+    public static byte[] desEncrypt(String content, String key) {
+        String algorithm;
+        byte[] desKey = HexString2Bytes(key);
+        byte[] theKey;
+        if (desKey.length == 8) {
+            algorithm = "DES";
+            theKey = desKey;
+        } else if (desKey.length == 16) {
+            algorithm = "DESede";
+            theKey = new byte[24];
+            System.arraycopy(desKey, 0, theKey, 0, 16);
+            System.arraycopy(desKey, 0, theKey, 16, 8);
+        } else {
+            throw new InvalidParameterException("Key length must be 8 or 16");
+        }
+        try {
+            //8 倍加密数据
+            byte[] tmp = content.getBytes();
+            int size = tmp.length / 8;
+            if (tmp.length % 8 != 0) {
+                size += 1;
+            }
+            byte[] data = new byte[size * 8];
+            System.arraycopy(tmp, 0, data, 0, tmp.length);
+
+            SecretKeySpec enkey = new SecretKeySpec(theKey, algorithm);
+            Cipher cipher = Cipher.getInstance(algorithm + "/CBC/NoPadding");
+            IvParameterSpec zeroIv = new IvParameterSpec(mIV);
+            cipher.init(Cipher.ENCRYPT_MODE, enkey, zeroIv);
+            return cipher.doFinal(data);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 解密
+     *
+     * @param encData 待解密内容
+     * @param key     解密的密钥
+     * @return
+     */
+    public static byte[] desDecrypt(byte[] encData, String key) {
+        String algorithm;
+        byte[] theKey;
+        byte[] desKey = HexString2Bytes(key);
+        if (desKey.length == 8) {
+            algorithm = "DES";
+            theKey = desKey;
+        } else if (desKey.length == 16) {
+            algorithm = "DESede";
+            theKey = new byte[24];
+            System.arraycopy(desKey, 0, theKey, 0, 16);
+            System.arraycopy(desKey, 0, theKey, 16, 8);
+        } else {
+            throw new InvalidParameterException("Key length must be 8 or 16");
+        }
+
+        try {
+            SecretKeySpec enkey = new SecretKeySpec(theKey, algorithm);
+            Cipher cipher = Cipher.getInstance(algorithm + "/CBC/NoPadding");
+            IvParameterSpec zeroIv = new IvParameterSpec(mIV);
+            cipher.init(Cipher.DECRYPT_MODE, enkey, zeroIv);
+            return cipher.doFinal(encData);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    public static byte[] HexString2Bytes(String src) {
+        byte[] ret = new byte[src.length() / 2];
+        byte[] tmp = src.getBytes();
+        for (int i = 0; i < tmp.length / 2; i++) {
+            ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);
+        }
+        return ret;
+    }
+
+    public static byte uniteBytes(byte src0, byte src1) {
+        byte _b0 = Byte.decode("0x" + new String(new byte[]{src0})).byteValue();
+        _b0 = (byte) (_b0 << 4);
+        byte _b1 = Byte.decode("0x" + new String(new byte[]{src1})).byteValue();
+        byte ret = (byte) (_b0 ^ _b1);
+        return ret;
+    }
+
+    private static java.text.DecimalFormat decimalFormat = new java.text.DecimalFormat("0.00");
+    private static java.text.DecimalFormat decimalFormatNo = new java.text.DecimalFormat("0");
+
+    public static String decialStrFormat(String doubleStr) {
+        try {
+            double temp = Double.valueOf(doubleStr);
+            return decimalFormat.format(temp);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    public static String decialStrFormat(double d) {
+        try {
+            return decimalFormat.format(d);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    public static String decialStrFormatNo(double d) {
+        try {
+            return decimalFormatNo.format(d);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    public static int YuanToFen(double yuan) {
+        return (int) (Math.round(yuan * 100));
+    }
+
+    public static boolean moneyCompare(double x1, double x2) {
+        return YuanToFen(x1) == YuanToFen(x2);
+    }
+
+    public static double formatYuan(double yuan) {
+        DecimalFormat df = new DecimalFormat("##0.00");
+        double money = ((double) YuanToFen(yuan)) / 100;
+        return Double.valueOf(df.format(money));
+    }
+
+    //关闭状态栏
+    public static void closeBar(Context context) {
+        //隐藏虚拟按键，并且全屏
+        if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api
+            View v = ((Activity) context).getWindow().getDecorView();
+            v.setSystemUiVisibility(View.GONE);
+        } else if (Build.VERSION.SDK_INT >= 19) {
+            //for new api versions.
+            View decorView = ((Activity) context).getWindow().getDecorView();
+            int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
+                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN;
+            decorView.setSystemUiVisibility(uiOptions);
+        }
+    }
+
+    //打开状态栏
+    public static void showBar(Context context) {
+        if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api
+            View v = ((Activity) context).getWindow().getDecorView();
+            v.setSystemUiVisibility(View.VISIBLE);
+        } else if (Build.VERSION.SDK_INT >= 19) {
+            //for new api versions.
+            View decorView = ((Activity) context).getWindow().getDecorView();
+            int uiOptions = View.STATUS_BAR_VISIBLE;
+            decorView.setSystemUiVisibility(uiOptions);
+        }
+    }
+
+    public static void upgrade(Context context, String filename) {
+        Intent intent = new Intent(Intent.ACTION_VIEW);
+        Uri uri = Uri.fromFile(new File(filename));
+        intent.setDataAndType(uri, "application/vnd.android.package-archive");
+        ((Activity) context).startActivityForResult(intent, 0);
+    }
+
+    public static void copyLogToUSB() {
+        try {
+            Process proc = Runtime.getRuntime().exec(new String[]{"su", "-c", "cp -R /mnt/sdcard/Yuexiao/pos /mnt/usb_storage"});
+            proc.waitFor();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static String filterCardErr(String msg) {
+        int index = msg.indexOf("Error:");
+        return msg.substring(index + 7);
+    }
+
+    /*优化a811扫码*/
+    public static void writeLinnuuxParams() {
+        try {
+            FileOutputStream fos = new FileOutputStream("/sys/module/gc0308/parameters/exposure");
+            fos.write("20".getBytes());
+            fos.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * get App versionCode
+     *
+     * @param context
+     * @return
+     */
+    public static String getVersionCode(Context context) {
+        try {
+            PackageManager packageManager = context.getPackageManager();
+            PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
+            return packageInfo.versionCode + "";
+        } catch (PackageManager.NameNotFoundException e) {
+            e.printStackTrace();
+            return "error:" + e.getMessage();
+        }
+    }
+
+    /**
+     * get App versionName
+     *
+     * @param context
+     * @return
+     */
+    public static String getVersionName(Context context) {
+        try {
+            PackageManager packageManager = context.getPackageManager();
+            PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
+            return packageInfo.versionName;
+        } catch (PackageManager.NameNotFoundException e) {
+            e.printStackTrace();
+            return "error:" + e.getMessage();
+        }
+    }
+
+    /**
+     * 跳转网络设置页；
+     */
+    public static void startNetSetting(Context context) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+            context.startActivity(new Intent(Settings.ACTION_SETTINGS));
+        } else {
+            context.startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS));
+        }
+    }
+
+    /**
+     * 软键盘隐藏
+     */
+    public static void softWindowHidden(Activity activity) {
+        activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
+    }
+
+    public static void softWindowVisible(Activity activity) {
+        activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
+    }
+
+    /**
+     * 唤醒屏幕
+     */
+    public static void acquireWakeLock(Context context) {
+        /*FULL_WAKE_LOCK：保持CPU 运转，保持屏幕高亮显示，键盘灯也保持亮度
+          ACQUIRE_CAUSES_WAKEUP：强制使屏幕亮起，这种锁主要针对一些必须通知用户的操作.
+          ON_AFTER_RELEASE：当锁被释放时，保持屏幕亮起一段时间*/
+        try {
+            PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+            @SuppressLint("InvalidWakeLockTag") PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.ON_AFTER_RELEASE
+                    | PowerManager.ACQUIRE_CAUSES_WAKEUP
+                    | PowerManager.FULL_WAKE_LOCK, "Tag");
+            wakeLock.acquire();
+            wakeLock.release();
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+    }
+
+    public static String getPasswordStar(int len) {
+        switch (len) {
+            case 0:
+                return " ";
+            case 1:
+                return "*";
+            case 2:
+                return "**";
+            case 3:
+                return "***";
+            case 4:
+                return "****";
+            case 5:
+                return "*****";
+            case 6:
+                return "******";
+            default:
+                return " ";
+        }
+    }
+
+    /**
+     * @param value 整形
+     * @return 小端数组
+     */
+    public static byte[] decodeInt(int value) {
+        byte[] arr = new byte[4];
+        arr[0] = (byte) (value & 0xFF);
+        arr[1] = (byte) (value >> 8 & 0xFF);
+        arr[2] = (byte) (value >> 16 & 0xFF);
+        arr[3] = (byte) (value >> 24 & 0xFF);
+        return arr;
+    }
+
+    public static String getSerialNumber() {
+        try {
+            Class<?> c = Class.forName("android.os.SystemProperties");
+            Method get = c.getMethod("get", String.class);
+            return (String) get.invoke(c, "ro.product.firmware");
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 系统参数control_flag bit位含义
+     * <p>
+     * **第0bit 1表示从后台获取营业额,0表示取本地记录
+     * **第1bit 1打开扫码头消费 0关闭扫码头消费
+     * **第2bit 1开启虚拟卡消费 0关闭虚拟卡消费
+     * **第3bit 1开启正扫消费 0关闭
+     * **第4bit 1开启支付宝卡代扣 0关闭
+     */
+    public static boolean isSystemRevenue(int controlFlag) {
+        return (controlFlag & 0x01) != 0;
+    }
+
+    public static boolean codeEnable(int controlFlag) {
+        return (controlFlag & 0x02) != 0;
+    }
+
+    public static boolean nfcEnable(int controlFlag) {
+        return (controlFlag & 0x04) != 0;
+    }
+
+    public static boolean scanEnable(int controlFlag) {
+        return (controlFlag & 0x08) != 0;
+    }
+
+    public static boolean alicardEnable(int controlFlag) {
+        return (controlFlag & 0x10) != 0;
+    }
+
+
+    public static String getEditView(EditText et) {
+        return et.getText().toString().trim().replace(" ", "");
+    }
+
+    /**
+     *
+     */
+    public static boolean isAliCode(byte[] rawCode) {
+        if (rawCode == null || rawCode.length < 3) {
+            return false;
+        }
+        BitSource bits = new BitSource(rawCode);// 获取原始字节（带标识码和校验码）
+        Mode mode = Mode.forBits(bits.readBits(4));// 获取qr类型（8bit或者kanji等等）
+        int count = bits.readBits(8);
+        if (count > 100) {
+            byte[] codeb = new byte[4];
+            for (int i = 0; i < 4; i++) {
+                codeb[i] = (byte) bits.readBits(8);
+            }
+            long code = Long.parseLong(getHexStringByBytes(codeb), 16);
+            if (code > 24 && code < 31) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * @param activity
+     * @param brightness [1-255]
+     * @desc 根据亮度值修改当前window亮度
+     */
+    public static void setAppBrightness(Activity activity, int brightness) {
+        Window window = activity.getWindow();
+        WindowManager.LayoutParams lp = window.getAttributes();
+        if (brightness == -1) {
+            if (lp.screenBrightness < 0) {
+                /**
+                 * 已经是正常亮度
+                 */
+                return;
+            }
+            lp.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE;
+        } else {
+            if (lp.screenBrightness > 0) {
+                /**
+                 * 已经屏保亮度
+                 */
+                return;
+            }
+//            stopAutoBrightness(activity);
+            if (brightness <= 0) {
+                lp.screenBrightness = 1 / 255.0f;
+            } else {
+                lp.screenBrightness = brightness / 255.0f;
+            }
+        }
+        window.setAttributes(lp);
+        /**
+         * 生效？
+         */
+//        getActivityBrightness(activity)
+    }
+
+    /**
+     * 获取当前activity的屏幕亮度
+     *
+     * @param activity 当前的activity对象
+     * @return 亮度值范围为0-0.1f，如果为-1.0，则亮度与全局同步。
+     */
+    private static Float getActivityBrightness(Activity activity) {
+        return activity.getWindow().getAttributes().screenBrightness;
+    }
+
+    /**
+     * 判断是否开启了自动亮度调节
+     * *
+     * * @param aContext
+     * * @return
+     *      
+     */
+    private static boolean isAutoBrightness(ContentResolver aContentResolver) {
+        try {
+            return Settings.System.getInt(aContentResolver, Settings.System.SCREEN_BRIGHTNESS_MODE) == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
+        } catch (Settings.SettingNotFoundException e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+    /**
+     * 停止自动亮度调节
+     *
+     * @param activity
+     */
+    private static void stopAutoBrightness(Activity activity) {
+        Settings.System.putInt(activity.getContentResolver(),
+                Settings.System.SCREEN_BRIGHTNESS_MODE,
+                Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
+    }
+
+    /**
+     * 开启亮度自动调节
+     *
+     * @param activity
+     */
+    private static void startAutoBrightness(Activity activity) {
+        Settings.System.putInt(activity.getContentResolver(),
+                Settings.System.SCREEN_BRIGHTNESS_MODE,
+                Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
+    }
+
+    public static void playMusic(Context context, final int mid) {
+        if (soundPool == null) {
+            soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0); //分别对应声音池数量，AudioManager.STREAM_MUSIC 和 0
+        }
+        try {
+            if (soundMap.containsKey(mid)) {
+                soundPool.play(soundMap.get(mid), 1.0f, 1.0f, 1, 0, 1.0f);
+            } else {
+                soundId = soundPool.load(context, mid, 1);
+                soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
+                    @Override
+                    public void onLoadComplete(SoundPool pool, int sampleId, int status) {
+                        soundMap.put(mid, soundId);
+                        //  加载完成
+                        try {
+                            pool.play(soundId, 1.0f, 1.0f, 1, 0, 1.0f);
+                        } catch (Exception e) {
+                        }
+                    }
+                });
+            }
+        } catch (Exception e) {
+        }
+    }
+
+    public static void releaseMusic() {
+        if (soundPool != null) {
+            soundPool.release();
+            soundPool = null;
+        }
+        if (soundMap != null) {
+            soundMap.clear();
+        }
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/util/Constants.java b/app/src/main/java/com/supwisdom/util/Constants.java
new file mode 100644
index 0000000..5b4f89a
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/util/Constants.java
@@ -0,0 +1,7 @@
+package com.supwisdom.util;
+
+public class Constants {
+    public static final String CALLBACK_URL_QR_PARAM = "QR";
+
+    public static int CURRENTCONFID = 0;
+}
diff --git a/app/src/main/java/com/supwisdom/util/Encrypt.java b/app/src/main/java/com/supwisdom/util/Encrypt.java
new file mode 100644
index 0000000..996a4f1
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/util/Encrypt.java
@@ -0,0 +1,116 @@
+package com.supwisdom.util;
+
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.security.InvalidKeyException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+
+/**
+ * @author zzq
+ * @date 2018/7/23
+ * @desc algorithm
+ */
+public class Encrypt {
+    public static String HASH256(String text) {
+        return algorithm(text, "SHA-256");
+    }
+
+    public static String HASH256(InputStream fis) {
+        return algorithm(fis, "SHA-256");
+    }
+
+    public static String HASH256(InputStream fis, String extData) {
+        return algorithm(fis, "SHA-256", extData);
+    }
+
+    public static String HASH512(String text) {
+        return algorithm(text, "SHA-512");
+    }
+
+    public static String MD5(String text) {
+        return algorithm(text, "MD5");
+    }
+
+    public static String HMACSHA1(String data, String key) {
+        try {
+            String algorithm = "HmacSHA1";
+            Mac mac = Mac.getInstance(algorithm);
+            SecretKeySpec spec = new SecretKeySpec(key.getBytes(), algorithm);
+            mac.init(spec);
+            byte[] byteHMAC = mac.doFinal(data.getBytes());
+            return CommonUtil.getHexStringByBytes(byteHMAC);
+        } catch (InvalidKeyException e) {
+            e.printStackTrace();
+        } catch (NoSuchAlgorithmException ignore) {
+            ignore.printStackTrace();
+        }
+        return null;
+    }
+
+    private static String algorithm(String text, String algorithm) {
+        if (text != null && text.length() > 0) {
+            try {
+                //创建具有指定算法名称的信息摘要
+                MessageDigest md = MessageDigest.getInstance(algorithm);
+                //使用指定的字节数组对摘要进行最后更新，然后完成摘要计算
+                byte[] results = md.digest(text.getBytes("UTF-8"));
+                //将得到的字节数组变成字符串返回
+                String resultString = CommonUtil.getHexStringByBytes(results);
+                return resultString.toUpperCase();
+            } catch (NoSuchAlgorithmException ex) {
+                ex.printStackTrace();
+            } catch (UnsupportedEncodingException ex) {
+                ex.printStackTrace();
+            }
+        }
+        return null;
+    }
+
+    private static String algorithm(InputStream fis, String algorithm) {
+        try {
+            //拿到一个MD5转换器,如果想使用SHA-1或SHA-256，则传入SHA-1,SHA-256
+            MessageDigest md = MessageDigest.getInstance(algorithm);
+
+            //分多次将一个文件读入，对于大型文件而言，比较推荐这种方式，占用内存比较少。
+            byte[] buffer = new byte[1024];
+            int length;
+            while ((length = fis.read(buffer, 0, 1024)) != -1) {
+                md.update(buffer, 0, length);
+            }
+            fis.close();
+            //转换并返回包含16个元素字节数组,返回数值范围为-128到127
+            byte[] results = md.digest();
+            return CommonUtil.getHexStringByBytes(results);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    private static String algorithm(InputStream fis, String algorithm, String extData) {
+        try {
+            //拿到一个MD5转换器,如果想使用SHA-1或SHA-256，则传入SHA-1,SHA-256
+            MessageDigest md = MessageDigest.getInstance(algorithm);
+
+            //分多次将一个文件读入，对于大型文件而言，比较推荐这种方式，占用内存比较少。
+            byte[] buffer = new byte[1024];
+            int length;
+            while ((length = fis.read(buffer, 0, 1024)) != -1) {
+                md.update(buffer, 0, length);
+            }
+            fis.close();
+            md.update(extData.getBytes("UTF-8"));
+
+            //转换并返回包含16个元素字节数组,返回数值范围为-128到127
+            byte[] results = md.digest();
+            return CommonUtil.getHexStringByBytes(results);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/util/FastDateFormat.java b/app/src/main/java/com/supwisdom/util/FastDateFormat.java
new file mode 100644
index 0000000..869ccd4
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/util/FastDateFormat.java
@@ -0,0 +1,1015 @@
+package com.supwisdom.util;
+
+//
+// Source code recreated from a .class file by IntelliJ IDEA
+// (powered by Fernflower decompiler)
+//
+
+import java.text.DateFormat;
+import java.text.DateFormatSymbols;
+import java.text.FieldPosition;
+import java.text.Format;
+import java.text.ParsePosition;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.TimeZone;
+
+public class FastDateFormat extends Format {
+  public static final int FULL = 0;
+  public static final int LONG = 1;
+  public static final int MEDIUM = 2;
+  public static final int SHORT = 3;
+  static final double LOG_10 = Math.log(10.0D);
+  private static String cDefaultPattern;
+  private static Map cInstanceCache = new HashMap(7);
+  private static Map cDateInstanceCache = new HashMap(7);
+  private static Map cTimeInstanceCache = new HashMap(7);
+  private static Map cDateTimeInstanceCache = new HashMap(7);
+  private static Map cTimeZoneDisplayCache = new HashMap(7);
+  private final String mPattern;
+  private final TimeZone mTimeZone;
+  private final boolean mTimeZoneForced;
+  private final Locale mLocale;
+  private final boolean mLocaleForced;
+  private FastDateFormat.Rule[] mRules;
+  private int mMaxLengthEstimate;
+
+  protected FastDateFormat(String pattern, TimeZone timeZone, Locale locale) {
+    if (pattern == null) {
+      throw new IllegalArgumentException("The pattern must not be null");
+    } else {
+      this.mPattern = pattern;
+      this.mTimeZoneForced = timeZone != null;
+      if (timeZone == null) {
+        timeZone = TimeZone.getDefault();
+      }
+
+      this.mTimeZone = timeZone;
+      this.mLocaleForced = locale != null;
+      if (locale == null) {
+        locale = Locale.getDefault();
+      }
+
+      this.mLocale = locale;
+    }
+  }
+
+  protected StringBuffer applyRules(Calendar calendar, StringBuffer buf) {
+    FastDateFormat.Rule[] rules = this.mRules;
+    int len = this.mRules.length;
+
+    for (int i = 0; i < len; ++i) {
+      rules[i].appendTo(buf, calendar);
+    }
+
+    return buf;
+  }
+
+  public boolean equals(Object obj) {
+    if (!(obj instanceof FastDateFormat)) {
+      return false;
+    } else {
+      FastDateFormat other = (FastDateFormat) obj;
+      return (this.mPattern == other.mPattern || this.mPattern.equals(other.mPattern)) && (this.mTimeZone == other.mTimeZone || this.mTimeZone.equals(other.mTimeZone)) && (this.mLocale == other.mLocale || this.mLocale.equals(other.mLocale)) && this.mTimeZoneForced == other.mTimeZoneForced && this.mLocaleForced == other.mLocaleForced;
+    }
+  }
+
+  public String format(long millis) {
+    return this.format(new Date(millis));
+  }
+
+  public StringBuffer format(long millis, StringBuffer buf) {
+    return this.format(new Date(millis), buf);
+  }
+
+  public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
+    if (obj instanceof Date) {
+      return this.format((Date) obj, toAppendTo);
+    } else if (obj instanceof Calendar) {
+      return this.format((Calendar) obj, toAppendTo);
+    } else if (obj instanceof Long) {
+      return this.format(((Long) obj).longValue(), toAppendTo);
+    } else {
+      throw new IllegalArgumentException("Unknown class: " + (obj == null ? "<null>" : obj.getClass().getName()));
+    }
+  }
+
+  public String format(Calendar calendar) {
+    return this.format(calendar, new StringBuffer(this.mMaxLengthEstimate)).toString();
+  }
+
+  public StringBuffer format(Calendar calendar, StringBuffer buf) {
+    if (this.mTimeZoneForced) {
+      calendar = (Calendar) calendar.clone();
+      calendar.setTimeZone(this.mTimeZone);
+    }
+
+    return this.applyRules(calendar, buf);
+  }
+
+  public String format(Date date) {
+    GregorianCalendar c = new GregorianCalendar(this.mTimeZone);
+    c.setTime(date);
+    return this.applyRules(c, new StringBuffer(this.mMaxLengthEstimate)).toString();
+  }
+
+  public StringBuffer format(Date date, StringBuffer buf) {
+    GregorianCalendar c = new GregorianCalendar(this.mTimeZone);
+    c.setTime(date);
+    return this.applyRules(c, buf);
+  }
+
+  public static FastDateFormat getDateInstance(int style) {
+    return getDateInstance(style, (TimeZone) null, (Locale) null);
+  }
+
+  public static FastDateFormat getDateInstance(int style, Locale locale) {
+    return getDateInstance(style, (TimeZone) null, locale);
+  }
+
+  public static FastDateFormat getDateInstance(int style, TimeZone timeZone) {
+    return getDateInstance(style, timeZone, (Locale) null);
+  }
+
+  public static synchronized FastDateFormat getDateInstance(int style, TimeZone timeZone, Locale locale) {
+    Object key = new Integer(style);
+    if (timeZone != null) {
+      key = new FastDateFormat.Pair(key, timeZone);
+    }
+
+    if (locale != null) {
+      key = new FastDateFormat.Pair(key, locale);
+    }
+
+    FastDateFormat format = (FastDateFormat) cDateInstanceCache.get(key);
+    if (format == null) {
+      if (locale == null) {
+        locale = Locale.getDefault();
+      }
+
+      try {
+        SimpleDateFormat formatter = (SimpleDateFormat) DateFormat.getDateInstance(style, locale);
+        String pattern = formatter.toPattern();
+        format = getInstance(pattern, timeZone, locale);
+        cDateInstanceCache.put(key, format);
+      } catch (ClassCastException var7) {
+        throw new IllegalArgumentException("No date pattern for locale: " + locale);
+      }
+    }
+
+    return format;
+  }
+
+  public static FastDateFormat getDateTimeInstance(int dateStyle, int timeStyle) {
+    return getDateTimeInstance(dateStyle, timeStyle, (TimeZone) null, (Locale) null);
+  }
+
+  public static FastDateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale locale) {
+    return getDateTimeInstance(dateStyle, timeStyle, (TimeZone) null, locale);
+  }
+
+  public static FastDateFormat getDateTimeInstance(int dateStyle, int timeStyle, TimeZone timeZone) {
+    return getDateTimeInstance(dateStyle, timeStyle, timeZone, (Locale) null);
+  }
+
+  public static synchronized FastDateFormat getDateTimeInstance(int dateStyle, int timeStyle, TimeZone timeZone, Locale locale) {
+    FastDateFormat.Pair key = new FastDateFormat.Pair(new Integer(dateStyle), new Integer(timeStyle));
+    if (timeZone != null) {
+      key = new FastDateFormat.Pair(key, timeZone);
+    }
+
+    if (locale != null) {
+      key = new FastDateFormat.Pair(key, locale);
+    }
+
+    FastDateFormat format = (FastDateFormat) cDateTimeInstanceCache.get(key);
+    if (format == null) {
+      if (locale == null) {
+        locale = Locale.getDefault();
+      }
+
+      try {
+        SimpleDateFormat formatter = (SimpleDateFormat) DateFormat.getDateTimeInstance(dateStyle, timeStyle, locale);
+        String pattern = formatter.toPattern();
+        format = getInstance(pattern, timeZone, locale);
+        cDateTimeInstanceCache.put(key, format);
+      } catch (ClassCastException var8) {
+        throw new IllegalArgumentException("No date time pattern for locale: " + locale);
+      }
+    }
+
+    return format;
+  }
+
+  private static synchronized String getDefaultPattern() {
+    if (cDefaultPattern == null) {
+      cDefaultPattern = (new SimpleDateFormat()).toPattern();
+    }
+
+    return cDefaultPattern;
+  }
+
+  public static FastDateFormat getInstance() {
+    return getInstance(getDefaultPattern(), (TimeZone) null, (Locale) null);
+  }
+
+  public static FastDateFormat getInstance(String pattern) {
+    return getInstance(pattern, (TimeZone) null, (Locale) null);
+  }
+
+  public static FastDateFormat getInstance(String pattern, Locale locale) {
+    return getInstance(pattern, (TimeZone) null, locale);
+  }
+
+  public static FastDateFormat getInstance(String pattern, TimeZone timeZone) {
+    return getInstance(pattern, timeZone, (Locale) null);
+  }
+
+  public static synchronized FastDateFormat getInstance(String pattern, TimeZone timeZone, Locale locale) {
+    FastDateFormat emptyFormat = new FastDateFormat(pattern, timeZone, locale);
+    FastDateFormat format = (FastDateFormat) cInstanceCache.get(emptyFormat);
+    if (format == null) {
+      format = emptyFormat;
+      emptyFormat.init();
+      cInstanceCache.put(emptyFormat, emptyFormat);
+    }
+
+    return format;
+  }
+
+  public Locale getLocale() {
+    return this.mLocale;
+  }
+
+  public int getMaxLengthEstimate() {
+    return this.mMaxLengthEstimate;
+  }
+
+  public String getPattern() {
+    return this.mPattern;
+  }
+
+  public static FastDateFormat getTimeInstance(int style) {
+    return getTimeInstance(style, (TimeZone) null, (Locale) null);
+  }
+
+  public static FastDateFormat getTimeInstance(int style, Locale locale) {
+    return getTimeInstance(style, (TimeZone) null, locale);
+  }
+
+  public static FastDateFormat getTimeInstance(int style, TimeZone timeZone) {
+    return getTimeInstance(style, timeZone, (Locale) null);
+  }
+
+  public static synchronized FastDateFormat getTimeInstance(int style, TimeZone timeZone, Locale locale) {
+    Object key = new Integer(style);
+    if (timeZone != null) {
+      key = new FastDateFormat.Pair(key, timeZone);
+    }
+
+    if (locale != null) {
+      key = new FastDateFormat.Pair(key, locale);
+    }
+
+    FastDateFormat format = (FastDateFormat) cTimeInstanceCache.get(key);
+    if (format == null) {
+      if (locale == null) {
+        locale = Locale.getDefault();
+      }
+
+      try {
+        SimpleDateFormat formatter = (SimpleDateFormat) DateFormat.getTimeInstance(style, locale);
+        String pattern = formatter.toPattern();
+        format = getInstance(pattern, timeZone, locale);
+        cTimeInstanceCache.put(key, format);
+      } catch (ClassCastException var7) {
+        throw new IllegalArgumentException("No date pattern for locale: " + locale);
+      }
+    }
+
+    return format;
+  }
+
+  public TimeZone getTimeZone() {
+    return this.mTimeZone;
+  }
+
+  static synchronized String getTimeZoneDisplay(TimeZone tz, boolean daylight, int style, Locale locale) {
+    FastDateFormat.TimeZoneDisplayKey key = new FastDateFormat.TimeZoneDisplayKey(tz, daylight, style, locale);
+    String value = (String) cTimeZoneDisplayCache.get(key);
+    if (value == null) {
+      value = tz.getDisplayName(daylight, style, locale);
+      cTimeZoneDisplayCache.put(key, value);
+    }
+
+    return value;
+  }
+
+  public boolean getTimeZoneOverridesCalendar() {
+    return this.mTimeZoneForced;
+  }
+
+  public int hashCode() {
+    byte total = 0;
+    int total1 = total + this.mPattern.hashCode();
+    total1 += this.mTimeZone.hashCode();
+    total1 += this.mTimeZoneForced ? 1 : 0;
+    total1 += this.mLocale.hashCode();
+    total1 += this.mLocaleForced ? 1 : 0;
+    return total1;
+  }
+
+  protected void init() {
+    List rulesList = this.parsePattern();
+    this.mRules = (FastDateFormat.Rule[]) rulesList.toArray(new FastDateFormat.Rule[rulesList.size()]);
+    int len = 0;
+    int i = this.mRules.length;
+
+    while (true) {
+      --i;
+      if (i < 0) {
+        this.mMaxLengthEstimate = len;
+        return;
+      }
+
+      len += this.mRules[i].estimateLength();
+    }
+  }
+
+  public Object parseObject(String source, ParsePosition pos) {
+    pos.setIndex(0);
+    pos.setErrorIndex(0);
+    return null;
+  }
+
+  protected List parsePattern() {
+    DateFormatSymbols symbols = new DateFormatSymbols(this.mLocale);
+    ArrayList rules = new ArrayList();
+    String[] ERAs = symbols.getEras();
+    String[] months = symbols.getMonths();
+    String[] shortMonths = symbols.getShortMonths();
+    String[] weekdays = symbols.getWeekdays();
+    String[] shortWeekdays = symbols.getShortWeekdays();
+    String[] AmPmStrings = symbols.getAmPmStrings();
+    int length = this.mPattern.length();
+    int[] indexRef = new int[1];
+
+    for (int i = 0; i < length; ++i) {
+      indexRef[0] = i;
+      String token = this.parseToken(this.mPattern, indexRef);
+      i = indexRef[0];
+      int tokenLen = token.length();
+      if (tokenLen == 0) {
+        break;
+      }
+
+      char c = token.charAt(0);
+      Object rule;
+      switch (c) {
+        case '\'':
+          String sub = token.substring(1);
+          if (sub.length() == 1) {
+            rule = new FastDateFormat.CharacterLiteral(sub.charAt(0));
+          } else {
+            rule = new FastDateFormat.StringLiteral(sub);
+          }
+          break;
+        case 'D':
+          rule = this.selectNumberRule(6, tokenLen);
+          break;
+        case 'E':
+          rule = new FastDateFormat.TextField(7, tokenLen < 4 ? shortWeekdays : weekdays);
+          break;
+        case 'F':
+          rule = this.selectNumberRule(8, tokenLen);
+          break;
+        case 'G':
+          rule = new FastDateFormat.TextField(0, ERAs);
+          break;
+        case 'H':
+          rule = this.selectNumberRule(11, tokenLen);
+          break;
+        case 'K':
+          rule = this.selectNumberRule(10, tokenLen);
+          break;
+        case 'M':
+          if (tokenLen >= 4) {
+            rule = new FastDateFormat.TextField(2, months);
+          } else if (tokenLen == 3) {
+            rule = new FastDateFormat.TextField(2, shortMonths);
+          } else if (tokenLen == 2) {
+            rule = FastDateFormat.TwoDigitMonthField.INSTANCE;
+          } else {
+            rule = FastDateFormat.UnpaddedMonthField.INSTANCE;
+          }
+          break;
+        case 'S':
+          rule = this.selectNumberRule(14, tokenLen);
+          break;
+        case 'W':
+          rule = this.selectNumberRule(4, tokenLen);
+          break;
+        case 'Z':
+          if (tokenLen == 1) {
+            rule = FastDateFormat.TimeZoneNumberRule.INSTANCE_NO_COLON;
+          } else {
+            rule = FastDateFormat.TimeZoneNumberRule.INSTANCE_COLON;
+          }
+          break;
+        case 'a':
+          rule = new FastDateFormat.TextField(9, AmPmStrings);
+          break;
+        case 'd':
+          rule = this.selectNumberRule(5, tokenLen);
+          break;
+        case 'h':
+          rule = new FastDateFormat.TwelveHourField(this.selectNumberRule(10, tokenLen));
+          break;
+        case 'k':
+          rule = new FastDateFormat.TwentyFourHourField(this.selectNumberRule(11, tokenLen));
+          break;
+        case 'm':
+          rule = this.selectNumberRule(12, tokenLen);
+          break;
+        case 's':
+          rule = this.selectNumberRule(13, tokenLen);
+          break;
+        case 'w':
+          rule = this.selectNumberRule(3, tokenLen);
+          break;
+        case 'y':
+          if (tokenLen >= 4) {
+            rule = this.selectNumberRule(1, tokenLen);
+          } else {
+            rule = FastDateFormat.TwoDigitYearField.INSTANCE;
+          }
+          break;
+        case 'z':
+          if (tokenLen >= 4) {
+            rule = new FastDateFormat.TimeZoneNameRule(this.mTimeZone, this.mTimeZoneForced, this.mLocale, 1);
+          } else {
+            rule = new FastDateFormat.TimeZoneNameRule(this.mTimeZone, this.mTimeZoneForced, this.mLocale, 0);
+          }
+          break;
+        default:
+          throw new IllegalArgumentException("Illegal pattern component: " + token);
+      }
+
+      rules.add(rule);
+    }
+
+    return rules;
+  }
+
+  protected String parseToken(String pattern, int[] indexRef) {
+    StringBuffer buf = new StringBuffer();
+    int i = indexRef[0];
+    int length = pattern.length();
+    char c = pattern.charAt(i);
+    if (c >= 65 && c <= 90 || c >= 97 && c <= 122) {
+      buf.append(c);
+
+      while (i + 1 < length) {
+        char var8 = pattern.charAt(i + 1);
+        if (var8 != c) {
+          break;
+        }
+
+        buf.append(c);
+        ++i;
+      }
+    } else {
+      buf.append('\'');
+
+      for (boolean inLiteral = false; i < length; ++i) {
+        c = pattern.charAt(i);
+        if (c == 39) {
+          if (i + 1 < length && pattern.charAt(i + 1) == 39) {
+            ++i;
+            buf.append(c);
+          } else {
+            inLiteral ^= true;
+          }
+        } else {
+          if (!inLiteral && (c >= 65 && c <= 90 || c >= 97 && c <= 122)) {
+            --i;
+            break;
+          }
+
+          buf.append(c);
+        }
+      }
+    }
+
+    indexRef[0] = i;
+    return buf.toString();
+  }
+
+  protected FastDateFormat.NumberRule selectNumberRule(int field, int padding) {
+    switch (padding) {
+      case 1:
+        return new FastDateFormat.UnpaddedNumberField(field);
+      case 2:
+        return new FastDateFormat.TwoDigitNumberField(field);
+      default:
+        return new FastDateFormat.PaddedNumberField(field, padding);
+    }
+  }
+
+  public String toString() {
+    return "FastDateFormat[" + this.mPattern + "]";
+  }
+
+  private interface Rule {
+    void appendTo(StringBuffer var1, Calendar var2);
+
+    int estimateLength();
+  }
+
+  private interface NumberRule extends FastDateFormat.Rule {
+    void appendTo(StringBuffer var1, int var2);
+  }
+
+  private static class CharacterLiteral implements FastDateFormat.Rule {
+    private final char mValue;
+
+    CharacterLiteral(char value) {
+      this.mValue = value;
+    }
+
+    public void appendTo(StringBuffer buffer, Calendar calendar) {
+      buffer.append(this.mValue);
+    }
+
+    public int estimateLength() {
+      return 1;
+    }
+  }
+
+  private static class StringLiteral implements FastDateFormat.Rule {
+    private final String mValue;
+
+    StringLiteral(String value) {
+      this.mValue = value;
+    }
+
+    public void appendTo(StringBuffer buffer, Calendar calendar) {
+      buffer.append(this.mValue);
+    }
+
+    public int estimateLength() {
+      return this.mValue.length();
+    }
+  }
+
+  private static class TextField implements FastDateFormat.Rule {
+    private final int mField;
+    private final String[] mValues;
+
+    TextField(int field, String[] values) {
+      this.mField = field;
+      this.mValues = values;
+    }
+
+    public void appendTo(StringBuffer buffer, Calendar calendar) {
+      buffer.append(this.mValues[calendar.get(this.mField)]);
+    }
+
+    public int estimateLength() {
+      int max = 0;
+      int i = this.mValues.length;
+
+      while (true) {
+        --i;
+        if (i < 0) {
+          return max;
+        }
+
+        int len = this.mValues[i].length();
+        if (len > max) {
+          max = len;
+        }
+      }
+    }
+  }
+
+  private static class UnpaddedNumberField implements FastDateFormat.NumberRule {
+    static final FastDateFormat.UnpaddedNumberField INSTANCE_YEAR = new FastDateFormat.UnpaddedNumberField(1);
+    private final int mField;
+
+    UnpaddedNumberField(int field) {
+      this.mField = field;
+    }
+
+    public final void appendTo(StringBuffer buffer, int value) {
+      if (value < 10) {
+        buffer.append((char) (value + 48));
+      } else if (value < 100) {
+        buffer.append((char) (value / 10 + 48));
+        buffer.append((char) (value % 10 + 48));
+      } else {
+        buffer.append(Integer.toString(value));
+      }
+
+    }
+
+    public void appendTo(StringBuffer buffer, Calendar calendar) {
+      this.appendTo(buffer, calendar.get(this.mField));
+    }
+
+    public int estimateLength() {
+      return 4;
+    }
+  }
+
+  private static class UnpaddedMonthField implements FastDateFormat.NumberRule {
+    static final FastDateFormat.UnpaddedMonthField INSTANCE = new FastDateFormat.UnpaddedMonthField();
+
+    UnpaddedMonthField() {
+    }
+
+    public final void appendTo(StringBuffer buffer, int value) {
+      if (value < 10) {
+        buffer.append((char) (value + 48));
+      } else {
+        buffer.append((char) (value / 10 + 48));
+        buffer.append((char) (value % 10 + 48));
+      }
+
+    }
+
+    public void appendTo(StringBuffer buffer, Calendar calendar) {
+      this.appendTo(buffer, calendar.get(2) + 1);
+    }
+
+    public int estimateLength() {
+      return 2;
+    }
+  }
+
+  private static class PaddedNumberField implements FastDateFormat.NumberRule {
+    private final int mField;
+    private final int mSize;
+
+    PaddedNumberField(int field, int size) {
+      if (size < 3) {
+        throw new IllegalArgumentException();
+      } else {
+        this.mField = field;
+        this.mSize = size;
+      }
+    }
+
+    public final void appendTo(StringBuffer buffer, int value) {
+      int digits;
+      if (value < 100) {
+        digits = this.mSize;
+
+        while (true) {
+          --digits;
+          if (digits < 2) {
+            buffer.append((char) (value / 10 + 48));
+            buffer.append((char) (value % 10 + 48));
+            break;
+          }
+
+          buffer.append('0');
+        }
+      } else {
+        if (value < 1000) {
+          digits = 3;
+        } else {
+          digits = (int) (Math.log((double) value) / FastDateFormat.LOG_10) + 1;
+        }
+
+        int i = this.mSize;
+
+        while (true) {
+          --i;
+          if (i < digits) {
+            buffer.append(Integer.toString(value));
+            break;
+          }
+
+          buffer.append('0');
+        }
+      }
+
+    }
+
+    public void appendTo(StringBuffer buffer, Calendar calendar) {
+      this.appendTo(buffer, calendar.get(this.mField));
+    }
+
+    public int estimateLength() {
+      return 4;
+    }
+  }
+
+  private static class TwoDigitNumberField implements FastDateFormat.NumberRule {
+    private final int mField;
+
+    TwoDigitNumberField(int field) {
+      this.mField = field;
+    }
+
+    public final void appendTo(StringBuffer buffer, int value) {
+      if (value < 100) {
+        buffer.append((char) (value / 10 + 48));
+        buffer.append((char) (value % 10 + 48));
+      } else {
+        buffer.append(Integer.toString(value));
+      }
+
+    }
+
+    public void appendTo(StringBuffer buffer, Calendar calendar) {
+      this.appendTo(buffer, calendar.get(this.mField));
+    }
+
+    public int estimateLength() {
+      return 2;
+    }
+  }
+
+  private static class TwoDigitYearField implements FastDateFormat.NumberRule {
+    static final FastDateFormat.TwoDigitYearField INSTANCE = new FastDateFormat.TwoDigitYearField();
+
+    TwoDigitYearField() {
+    }
+
+    public final void appendTo(StringBuffer buffer, int value) {
+      buffer.append((char) (value / 10 + 48));
+      buffer.append((char) (value % 10 + 48));
+    }
+
+    public void appendTo(StringBuffer buffer, Calendar calendar) {
+      this.appendTo(buffer, calendar.get(1) % 100);
+    }
+
+    public int estimateLength() {
+      return 2;
+    }
+  }
+
+  private static class TwoDigitMonthField implements FastDateFormat.NumberRule {
+    static final FastDateFormat.TwoDigitMonthField INSTANCE = new FastDateFormat.TwoDigitMonthField();
+
+    TwoDigitMonthField() {
+    }
+
+    public final void appendTo(StringBuffer buffer, int value) {
+      buffer.append((char) (value / 10 + 48));
+      buffer.append((char) (value % 10 + 48));
+    }
+
+    public void appendTo(StringBuffer buffer, Calendar calendar) {
+      this.appendTo(buffer, calendar.get(2) + 1);
+    }
+
+    public int estimateLength() {
+      return 2;
+    }
+  }
+
+  private static class TwelveHourField implements FastDateFormat.NumberRule {
+    private final FastDateFormat.NumberRule mRule;
+
+    TwelveHourField(FastDateFormat.NumberRule rule) {
+      this.mRule = rule;
+    }
+
+    public void appendTo(StringBuffer buffer, int value) {
+      this.mRule.appendTo(buffer, value);
+    }
+
+    public void appendTo(StringBuffer buffer, Calendar calendar) {
+      int value = calendar.get(10);
+      if (value == 0) {
+        value = calendar.getLeastMaximum(10) + 1;
+      }
+
+      this.mRule.appendTo(buffer, value);
+    }
+
+    public int estimateLength() {
+      return this.mRule.estimateLength();
+    }
+  }
+
+  private static class TwentyFourHourField implements FastDateFormat.NumberRule {
+    private final FastDateFormat.NumberRule mRule;
+
+    TwentyFourHourField(FastDateFormat.NumberRule rule) {
+      this.mRule = rule;
+    }
+
+    public void appendTo(StringBuffer buffer, int value) {
+      this.mRule.appendTo(buffer, value);
+    }
+
+    public void appendTo(StringBuffer buffer, Calendar calendar) {
+      int value = calendar.get(11);
+      if (value == 0) {
+        value = calendar.getMaximum(11) + 1;
+      }
+
+      this.mRule.appendTo(buffer, value);
+    }
+
+    public int estimateLength() {
+      return this.mRule.estimateLength();
+    }
+  }
+
+  private static class TimeZoneNameRule implements FastDateFormat.Rule {
+    private final TimeZone mTimeZone;
+    private final boolean mTimeZoneForced;
+    private final Locale mLocale;
+    private final int mStyle;
+    private final String mStandard;
+    private final String mDaylight;
+
+    TimeZoneNameRule(TimeZone timeZone, boolean timeZoneForced, Locale locale, int style) {
+      this.mTimeZone = timeZone;
+      this.mTimeZoneForced = timeZoneForced;
+      this.mLocale = locale;
+      this.mStyle = style;
+      if (timeZoneForced) {
+        this.mStandard = FastDateFormat.getTimeZoneDisplay(timeZone, false, style, locale);
+        this.mDaylight = FastDateFormat.getTimeZoneDisplay(timeZone, true, style, locale);
+      } else {
+        this.mStandard = null;
+        this.mDaylight = null;
+      }
+
+    }
+
+    public void appendTo(StringBuffer buffer, Calendar calendar) {
+      if (this.mTimeZoneForced) {
+        if (this.mTimeZone.useDaylightTime() && calendar.get(16) != 0) {
+          buffer.append(this.mDaylight);
+        } else {
+          buffer.append(this.mStandard);
+        }
+      } else {
+        TimeZone timeZone = calendar.getTimeZone();
+        if (timeZone.useDaylightTime() && calendar.get(16) != 0) {
+          buffer.append(FastDateFormat.getTimeZoneDisplay(timeZone, true, this.mStyle, this.mLocale));
+        } else {
+          buffer.append(FastDateFormat.getTimeZoneDisplay(timeZone, false, this.mStyle, this.mLocale));
+        }
+      }
+
+    }
+
+    public int estimateLength() {
+      return this.mTimeZoneForced ? Math.max(this.mStandard.length(), this.mDaylight.length()) : (this.mStyle == 0 ? 4 : 40);
+    }
+  }
+
+  private static class TimeZoneNumberRule implements FastDateFormat.Rule {
+    static final FastDateFormat.TimeZoneNumberRule INSTANCE_COLON = new FastDateFormat.TimeZoneNumberRule(true);
+    static final FastDateFormat.TimeZoneNumberRule INSTANCE_NO_COLON = new FastDateFormat.TimeZoneNumberRule(false);
+    final boolean mColon;
+
+    TimeZoneNumberRule(boolean colon) {
+      this.mColon = colon;
+    }
+
+    public void appendTo(StringBuffer buffer, Calendar calendar) {
+      int offset = calendar.get(15) + calendar.get(16);
+      if (offset < 0) {
+        buffer.append('-');
+        offset = -offset;
+      } else {
+        buffer.append('+');
+      }
+
+      int hours = offset / 3600000;
+      buffer.append((char) (hours / 10 + 48));
+      buffer.append((char) (hours % 10 + 48));
+      if (this.mColon) {
+        buffer.append(':');
+      }
+
+      int minutes = offset / '\uea60' - 60 * hours;
+      buffer.append((char) (minutes / 10 + 48));
+      buffer.append((char) (minutes % 10 + 48));
+    }
+
+    public int estimateLength() {
+      return 5;
+    }
+  }
+
+  private static class TimeZoneDisplayKey {
+    private final TimeZone mTimeZone;
+    private final int mStyle;
+    private final Locale mLocale;
+
+    TimeZoneDisplayKey(TimeZone timeZone, boolean daylight, int style, Locale locale) {
+      this.mTimeZone = timeZone;
+      if (daylight) {
+        style |= -2147483648;
+      }
+
+      this.mStyle = style;
+      this.mLocale = locale;
+    }
+
+    public boolean equals(Object obj) {
+      if (this == obj) {
+        return true;
+      } else if (!(obj instanceof FastDateFormat.TimeZoneDisplayKey)) {
+        return false;
+      } else {
+        FastDateFormat.TimeZoneDisplayKey other = (FastDateFormat.TimeZoneDisplayKey) obj;
+        return this.mTimeZone.equals(other.mTimeZone) && this.mStyle == other.mStyle && this.mLocale.equals(other.mLocale);
+      }
+    }
+
+    public int hashCode() {
+      return this.mStyle * 31 + this.mLocale.hashCode();
+    }
+  }
+
+  private static class Pair {
+    private final Object mObj1;
+    private final Object mObj2;
+
+    public Pair(Object obj1, Object obj2) {
+      this.mObj1 = obj1;
+      this.mObj2 = obj2;
+    }
+
+    public boolean equals(Object obj) {
+      if (this == obj) {
+        return true;
+      } else if (!(obj instanceof FastDateFormat.Pair)) {
+        return false;
+      } else {
+        boolean var10000;
+        label51:
+        {
+          label44:
+          {
+            FastDateFormat.Pair key;
+            label35:
+            {
+              key = (FastDateFormat.Pair) obj;
+              if (this.mObj1 == null) {
+                if (key.mObj1 == null) {
+                  break label35;
+                }
+
+                var10000 = false;
+              } else {
+                var10000 = this.mObj1.equals(key.mObj1);
+              }
+
+              if (!var10000) {
+                break label44;
+              }
+            }
+
+            if (this.mObj2 == null) {
+              if (key.mObj2 == null) {
+                break label51;
+              }
+
+              var10000 = false;
+            } else {
+              var10000 = this.mObj2.equals(key.mObj2);
+            }
+
+            if (var10000) {
+              break label51;
+            }
+          }
+
+          var10000 = false;
+          return var10000;
+        }
+
+        var10000 = true;
+        return var10000;
+      }
+    }
+
+    public int hashCode() {
+      return (this.mObj1 == null ? 0 : this.mObj1.hashCode()) + (this.mObj2 == null ? 0 : this.mObj2.hashCode());
+    }
+
+    public String toString() {
+      return "[" + this.mObj1 + ':' + this.mObj2 + ']';
+    }
+  }
+}
diff --git a/app/src/main/java/com/supwisdom/util/FileUtil.java b/app/src/main/java/com/supwisdom/util/FileUtil.java
new file mode 100644
index 0000000..f719abe
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/util/FileUtil.java
@@ -0,0 +1,145 @@
+package com.supwisdom.util;
+
+import android.os.Environment;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+
+/**
+ * Created by zz on 2020-03-30.
+ */
+public class FileUtil {
+    private static final String ROOT_DIR = "/YueXiao/pos/";
+    private static final String ROOT_PRIVATE_DIR = "/supwisdom/";
+    private static final String CACHE_FILE_DIR = ROOT_DIR + "cache/";
+    private static final String CRASH_FILE_DIR = ROOT_DIR + "crash/";
+    private static final String CRASH_FILE_PRE = "crash-";
+    private static final String LOG_FILE_DIR = ROOT_DIR + "log/";
+    private static final String LOG_FILE_PRE = "log-";
+    private static final String DTL_FILE_DIR = ROOT_DIR + "dtl/";
+    private static final String DTL_FILE_PRE = "dtl-";
+
+    public static File getUpdateFile(String fileName) {
+        return createFile(CACHE_FILE_DIR, fileName);
+    }
+
+    public static File getCfgFile(String fileName) {
+        return createFile(ROOT_PRIVATE_DIR, fileName);
+    }
+
+    public static InputStream getCfgFileStream(String fileName) {
+        if (android.os.Environment.MEDIA_MOUNTED.equals(android.os.Environment.getExternalStorageState())) {
+            File rootFile = new File(Environment.getExternalStorageDirectory() + ROOT_PRIVATE_DIR);
+            if (!rootFile.exists()) {
+                return null;
+            }
+            File retFile = new File(rootFile, fileName);
+            if (retFile.exists()) {
+                try {
+                    return new FileInputStream(retFile);
+                } catch (FileNotFoundException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return null;
+    }
+
+    public static void removeDtlFile(int beforeday) {
+        removeFile(DTL_FILE_DIR, DTL_FILE_PRE, beforeday);
+    }
+
+    public static void removeLogFile(int beforeday) {
+        removeFile(LOG_FILE_DIR, LOG_FILE_PRE, beforeday);
+    }
+
+    public static void removeCrashFile(int beforeday) {
+        removeFile(CRASH_FILE_DIR, CRASH_FILE_PRE, beforeday);
+    }
+
+
+    public static void writeDtlFile(String msg) {
+        String pathfile = DTL_FILE_DIR + DTL_FILE_PRE + CommonUtil.getNowDateNoFormat() + ".txt";
+        writeFile(pathfile, msg, true);
+    }
+
+    public static void writeCrashFile(String msg) {
+        String pathfile = CRASH_FILE_DIR + CRASH_FILE_PRE + CommonUtil.getNowDateNoFormat() + ".txt";
+        writeFile(pathfile, msg, true);
+    }
+
+    public static void writeLogFile(String msg) {
+        String pathfile = LOG_FILE_DIR + LOG_FILE_PRE + CommonUtil.getNowDateNoFormat() + ".txt";
+        writeFile(pathfile, msg, true);
+    }
+
+    private static void writeFile(String targetPath, String msg, boolean append) {
+        if (android.os.Environment.MEDIA_MOUNTED.equals(android.os.Environment.getExternalStorageState())) {
+            File targetFile = new File(Environment.getExternalStorageDirectory() + targetPath);
+            if (!targetFile.getParentFile().exists()) {
+                targetFile.getParentFile().mkdirs();
+            }
+            try {
+                OutputStreamWriter osw = new OutputStreamWriter(
+                        new FileOutputStream(targetFile, append), "utf-8");
+                try {
+                    osw.write(msg);
+                    osw.write("</br>\n");
+                    osw.flush();
+                    osw.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            } catch (UnsupportedEncodingException e1) {
+                e1.printStackTrace();
+            } catch (FileNotFoundException e1) {
+                e1.printStackTrace();
+            }
+        }
+    }
+
+    private static void removeFile(String targetPath, String prefile, int beforeday) {
+        if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
+            File rootFile = new File(Environment.getExternalStorageDirectory() + targetPath);
+            if (!rootFile.exists()) {
+                return;
+            }
+            String logname = prefile + CommonUtil.getDayDateNoFormatBefore(beforeday) + ".txt";
+            File[] files = rootFile.listFiles();
+            for (File file : files) {
+                String fullfilename = file.getAbsolutePath();
+                String filename = fullfilename.substring(fullfilename.lastIndexOf('/') + 1);
+                if (filename.startsWith(prefile) &&
+                        filename.endsWith(".txt")) {
+                    if (filename.compareTo(logname) < 0) {
+                        file.delete();
+                    }
+                }
+            }
+        }
+    }
+
+    private static File createFile(String path, String fileName) {
+        if (android.os.Environment.MEDIA_MOUNTED.equals(android.os.Environment.getExternalStorageState())) {
+            File rootFile = new File(Environment.getExternalStorageDirectory() + path);
+            if (!rootFile.exists()) {
+                rootFile.mkdirs();
+            }
+            File retFile = new File(rootFile, fileName);
+            if (!retFile.exists()) {
+                try {
+                    retFile.createNewFile();
+                } catch (IOException e) {
+                    return null;
+                }
+            }
+            return retFile;
+        }
+        return null;
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/util/GsonUtil.java b/app/src/main/java/com/supwisdom/util/GsonUtil.java
new file mode 100644
index 0000000..7fad16d
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/util/GsonUtil.java
@@ -0,0 +1,64 @@
+package com.supwisdom.util;
+
+import com.alibaba.fastjson.JSON;
+
+/**
+ * Created by zzq on 2016-01-08.
+ */
+public class GsonUtil {
+    private GsonUtil() {
+    }
+
+    /**
+     * 转成json
+     *
+     * @param object
+     * @return
+     */
+    public static String GsonString(Object object) {
+        return JSON.toJSONString(object);
+    }
+
+    /**
+     * 转成bean
+     *
+     * @param gsonString
+     * @param cls
+     * @return
+     */
+    public static <T> T GsonToBean(String gsonString, Class<T> cls) {
+        return JSON.parseObject(gsonString, cls);
+    }
+
+    /**
+     * 转成list
+     *
+     * @param gsonString
+     * @param cls
+     * @return
+     */
+//    public static <T> List<T> GsonToList(String gsonString, Class<T> cls) {
+//        return JSON.parseObject(gsonString, new TypeReference<ArrayList<T>>() {
+//        });
+//    }
+
+    /**
+     * 转成list中有map的
+     *
+     * @param gsonString
+     * @return
+     */
+//    public static <T> List<Map<String, T>> GsonToListMaps(String gsonString, Class<T> cls) {
+//        return null;
+//    }
+
+    /**
+     * 转成map的
+     *
+     * @param gsonString
+     * @return
+     */
+//    public static <T> Map<String, T> GsonToMaps(String gsonString, Class<T> cls) {
+//        return (Map<String, T>) JSON.parse(gsonString);
+//    }
+}
diff --git a/app/src/main/java/com/supwisdom/util/LogUtil.java b/app/src/main/java/com/supwisdom/util/LogUtil.java
new file mode 100644
index 0000000..7691e2c
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/util/LogUtil.java
@@ -0,0 +1,40 @@
+package com.supwisdom.util;
+
+/**
+ * @author zzq
+ * @date 2018/8/19
+ * @desc
+ */
+public class LogUtil {
+    private static int DEBUG = 3;
+    private static int INFO = 2;
+    private static int ERROR = 1;
+    private static int curlevel = DEBUG;
+
+    public static void setLevel(int level) {
+        curlevel = level;
+    }
+
+    public static void d(String tag, String msg) {
+        if (curlevel >= DEBUG) {
+            writeLog(tag, msg);
+        }
+    }
+
+    public static void i(String tag, String msg) {
+        if (curlevel >= INFO) {
+            writeLog(tag, msg);
+        }
+    }
+
+    public static void e(String tag, String msg) {
+        if (curlevel >= ERROR) {
+            writeLog(tag, msg);
+        }
+    }
+
+    private static void writeLog(String tag, String msg) {
+        String time = CommonUtil.getNowDate() + "--";
+        FileUtil.writeLogFile(tag + ":" + time + "--" + msg);
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/util/PublicDef.java b/app/src/main/java/com/supwisdom/util/PublicDef.java
new file mode 100644
index 0000000..2cdac14
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/util/PublicDef.java
@@ -0,0 +1,48 @@
+package com.supwisdom.util;
+
+public class PublicDef {
+    /**
+     * 签名方式
+     */
+    public static final String signMethod = "HMAC";
+
+    public static final String APP_ID = "20001";
+    public static final String APP_SECRET = "nzoqPYMIu91VViA/mEIG5FtJXi8=";
+
+    /**
+     * 维护人员密码
+     */
+    public static final String MANAGER_PWD = "111111";
+
+    public static final int MSG_SHOWTIME = 1;
+    public static final int MSG_SHOWCONFERENCE = 2;
+    public static final int MSG_SHOWNETSTATUS = 3;
+    public static final int MSG_SHOWRATE_LIST = 4;
+    public static final int MSG_SHOWRATE_NOLIST = 5;
+
+    public static final String CONTROL_HAS_REGISTER = "hasregister";
+
+    /**
+     * 状态
+     **/
+    public static final int SUCCESS = 0; // 成功均为 0, 非0失败
+    public static final int ERROR = 1; // 成功均为 0, 非0失败
+
+    /**
+     * Toast show
+     */
+    public static final int TOAST_SHOW_CRY = 800;
+    public static final int TOAST_SHOW_SMILE = 801;
+    public static final int TOAST_SHOW_DOUBT = 802;
+
+    public static final String LIST_TYPE = "list";  // 有名单会议
+    public static final String NOLIST_TYPE = "nolist";  // 无名单会议
+
+    //人员参会状态
+    public static final String ATTENDSTATUS_UNCHECK="uncheck";//未签到
+    public static final String ATTENDSTATUS_CHECKED="checked";//已签到
+    public static final String ATTENDSTATUS_LATE="late";//迟到
+    public static final String ATTENDSTATUS_CLOSED="closed";//关闭
+    public static final String ATTENDSTATUS_INSTEAD="instead";//代签
+    public static final String ATTENDSTATUS_HAND="handcheck";//手工签到
+}
diff --git a/app/src/main/java/com/supwisdom/util/QRCodeUtil.java b/app/src/main/java/com/supwisdom/util/QRCodeUtil.java
new file mode 100644
index 0000000..9ef20eb
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/util/QRCodeUtil.java
@@ -0,0 +1,40 @@
+package com.supwisdom.util;
+
+import android.graphics.Bitmap;
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.MultiFormatWriter;
+import com.google.zxing.WriterException;
+import com.google.zxing.common.BitMatrix;
+
+public class QRCodeUtil {
+    /**
+     * 将指定的内容生成成二维码
+     *
+     * @param content 将要生成二维码的内容
+     * @return 返回生成好的二维码事件
+     * @throws com.google.zxing.WriterException WriterException异常
+     * @size 二维码的长宽（等距）
+     */
+    public static Bitmap CreateTwoDCode(String content, int size) throws WriterException {
+        // 生成二维矩阵,编码时指定大小,不要生成了图片以后再进行缩放,这样会模糊导致识别失败
+        BitMatrix matrix = new MultiFormatWriter().encode(content,
+                BarcodeFormat.QR_CODE, size, size);
+        int width = matrix.getWidth();
+        int height = matrix.getHeight();
+        // 二维矩阵转为一维像素数组,也就是一直横着排了
+        int[] pixels = new int[width * height];
+        for (int y = 0; y < height; y++) {
+            for (int x = 0; x < width; x++) {
+                if (matrix.get(x, y)) {
+                    pixels[y * width + x] = 0xff000000;
+                }
+            }
+        }
+
+        Bitmap bitmap = Bitmap.createBitmap(width, height,
+                Bitmap.Config.ARGB_8888);
+        // 通过像素数组生成bitmap,具体参考api
+        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
+        return bitmap;
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/util/ThreadPool.java b/app/src/main/java/com/supwisdom/util/ThreadPool.java
new file mode 100644
index 0000000..c5a533b
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/util/ThreadPool.java
@@ -0,0 +1,176 @@
+package com.supwisdom.util;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by zzq on 2016-01-11.
+ */
+public class ThreadPool {
+  private static final String DEFAULT_SINGLE_POOL_NAME = "DEFAULT_SINGLE_POOL_NAME";
+
+  private static ThreadPoolProxy mLongPool = null;
+  private static Object mLongLock = new Object();
+
+  private static ThreadPoolProxy mShortPool = null;
+  private static Object mShortLock = new Object();
+
+  private static ThreadPoolProxy mDownloadPool = null;
+  private static Object mDownloadLock = new Object();
+
+  private static Map<String, ThreadPoolProxy> mMap = new HashMap<String, ThreadPoolProxy>();
+  private static Object mSingleLock = new Object();
+  //ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
+
+  /**
+   * 获取下载线程
+   */
+  public static ThreadPoolProxy getDownloadPool() {
+    if (mDownloadPool == null) {
+      synchronized (mDownloadLock) {
+        if (mDownloadPool == null) {
+          //获取CPU核数
+          int num = Runtime.getRuntime().availableProcessors();
+          int corePoolSize = num + 1;
+          int maximumPoolSize = 2 * num + 1;
+          mDownloadPool = new ThreadPoolProxy(corePoolSize, maximumPoolSize, 1L);
+        }
+      }
+    }
+    return mDownloadPool;
+  }
+
+  /**
+   * 获取一个用于执行长耗时任务的线程池，避免和短耗时任务处在同一个队列而阻塞了重要的短耗时任务，通常用来联网操作
+   */
+
+  public static ThreadPoolProxy getLongPool() {
+    if (mLongPool == null) {
+      synchronized (mLongLock) {
+        if (mLongPool == null) {
+          //获取CPU核数
+          int num = Runtime.getRuntime().availableProcessors();
+          int corePoolSize = num + 1;
+          int maximumPoolSize = 2 * num + 1;
+          mLongPool = new ThreadPoolProxy(corePoolSize, maximumPoolSize, 1L);
+        }
+      }
+    }
+    return mLongPool;
+  }
+
+  /**
+   * 获取一个用于执行短耗时任务的线程池，避免因为和耗时长的任务处在同一个队列而长时间得不到执行，通常用来执行本地的IO/SQL
+   */
+  public static ThreadPoolProxy getShortPool() {
+    if (mShortPool == null) {
+      synchronized (mShortLock) {
+        if (mShortPool == null) {
+          //获取CPU核数
+          int num = Runtime.getRuntime().availableProcessors();
+          int corePoolSize = num + 1;
+          int maximumPoolSize = 2 * num + 1;
+          mShortPool = new ThreadPoolProxy(corePoolSize, maximumPoolSize, 1L);
+        }
+      }
+    }
+    return mShortPool;
+  }
+
+  /**
+   * 获取一个单线程池，所有任务将会被按照加入的顺序执行，免除了同步开销的问题
+   */
+  public static ThreadPoolProxy getSinglePool() {
+    return getSinglePool(DEFAULT_SINGLE_POOL_NAME);
+  }
+
+  /**
+   * 获取一个单线程池，所有任务将会被按照加入的顺序执行，免除了同步开销的问题
+   */
+  public static ThreadPoolProxy getSinglePool(String name) {
+    synchronized (mSingleLock) {
+      ThreadPoolProxy singlePool = mMap.get(name);
+      if (singlePool == null) {
+        singlePool = new ThreadPoolProxy(1, 1, 1L);
+        mMap.put(name, singlePool);
+      }
+      return singlePool;
+    }
+  }
+
+  public static class ThreadPoolProxy {
+    private ThreadPoolExecutor mPool;
+    private int mCorePoolSize;
+    private int mMaximumPoolSize;
+    private long mKeepAliveTime;
+
+    private ThreadPoolProxy(int corePoolSize, int maximumPoolSize, long keepAliveTime) {
+      mCorePoolSize = corePoolSize;
+      mMaximumPoolSize = maximumPoolSize;
+      mKeepAliveTime = keepAliveTime;
+    }
+
+    /**
+     * 执行任务，当线程池处于关闭，将会重新创建新的线程池
+     */
+    public synchronized void execute(Runnable run) {
+      if (run == null) {
+        return;
+      }
+      if (mPool == null || mPool.isShutdown()) {
+        //参数说明
+        //当线程池中的线程小于mCorePoolSize，直接创建新的线程加入线程池执行任务
+        //当线程池中的线程数目等于mCorePoolSize，将会把任务放入任务队列BlockingQueue中
+        //当BlockingQueue中的任务放满了，将会创建新的线程去执行，
+        //但是当总线程数大于mMaximumPoolSize时，将会抛出异常，交给RejectedExecutionHandler处理
+        //mKeepAliveTime是线程执行完任务后，且队列中没有可以执行的任务，存活的时间，后面的参数是时间单位
+        //ThreadFactory是每次创建新的线程工厂
+        mPool = new ThreadPoolExecutor(mCorePoolSize, mMaximumPoolSize, mKeepAliveTime, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
+      }
+      mPool.execute(run);
+    }
+
+    /**
+     * 取消线程池中某个还未执行的任务
+     */
+    public synchronized void cancel(Runnable run) {
+      if (mPool != null && (!mPool.isShutdown() || mPool.isTerminating())) {
+        mPool.getQueue().remove(run);
+      }
+    }
+
+    /**
+     * 取消线程池中某个还未执行的任务
+     */
+    public synchronized boolean contains(Runnable run) {
+      if (mPool != null && (!mPool.isShutdown() || mPool.isTerminating())) {
+        return mPool.getQueue().contains(run);
+      } else {
+        return false;
+      }
+    }
+
+    /**
+     * 立刻关闭线程池，并且正在执行的任务也将会被中断
+     */
+    public void stop() {
+      if (mPool != null && (!mPool.isShutdown() || mPool.isTerminating())) {
+        mPool.shutdownNow();
+      }
+    }
+
+    /**
+     * 平缓关闭单任务线程池，但是会确保所有已经加入的任务都将会被执行完毕才关闭
+     */
+    public synchronized void shutdown() {
+      if (mPool != null && (!mPool.isShutdown() || mPool.isTerminating())) {
+        mPool.shutdownNow();
+      }
+    }
+  }
+
+}
diff --git a/app/src/main/java/com/supwisdom/view/SWToast.java b/app/src/main/java/com/supwisdom/view/SWToast.java
new file mode 100644
index 0000000..73190ab
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/view/SWToast.java
@@ -0,0 +1,53 @@
+package com.supwisdom.view;
+
+import android.content.Context;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.supwisdom.conferencecheck.R;
+import com.supwisdom.util.PublicDef;
+
+/**
+ * Created by zzq on 2016-05-18.
+ */
+public class SWToast {
+    public static void show(Context context, String msg, int showway) {
+        LayoutInflater Inflater = LayoutInflater.from(context);
+        View layout = Inflater.inflate(R.layout.sw_toast, null);
+
+        ImageView cry = (ImageView) layout.findViewById(R.id.pic_cry);
+        ImageView smile = (ImageView) layout.findViewById(R.id.pic_smile);
+        ImageView doubt = (ImageView) layout.findViewById(R.id.pic_doubt);
+        if (showway == PublicDef.TOAST_SHOW_CRY) {
+            cry.setVisibility(View.VISIBLE);
+            smile.setVisibility(View.GONE);
+            doubt.setVisibility(View.GONE);
+        } else if (showway == PublicDef.TOAST_SHOW_SMILE) {
+            cry.setVisibility(View.GONE);
+            smile.setVisibility(View.VISIBLE);
+            doubt.setVisibility(View.GONE);
+        } else if (showway == PublicDef.TOAST_SHOW_DOUBT) {
+            cry.setVisibility(View.GONE);
+            smile.setVisibility(View.GONE);
+            doubt.setVisibility(View.VISIBLE);
+        } else {
+            cry.setVisibility(View.GONE);
+            smile.setVisibility(View.VISIBLE);
+            doubt.setVisibility(View.GONE);
+        }
+
+        // set a message
+        TextView toastText = (TextView) layout.findViewById(R.id.toasttext);
+        toastText.setText(msg);
+        // Toast...
+        Toast toast = new Toast(context);
+        toast.setGravity(Gravity.CENTER, 0, 0);
+        toast.setDuration(Toast.LENGTH_SHORT);
+        toast.setView(layout);
+        toast.show();
+    }
+}
diff --git a/app/src/main/java/com/visionsmarts/VSBarcodeReader.java b/app/src/main/java/com/visionsmarts/VSBarcodeReader.java
new file mode 100644
index 0000000..feb3b33
--- /dev/null
+++ b/app/src/main/java/com/visionsmarts/VSBarcodeReader.java
@@ -0,0 +1,90 @@
+package com.visionsmarts;
+
+public class VSBarcodeReader {
+    public static final int BARCODE_TYPE_CODABAR = 64;
+    public static final int BARCODE_TYPE_CODE128 = 32;
+    public static final int BARCODE_TYPE_CODE39 = 16;
+    public static final int BARCODE_TYPE_CODE93 = 128;
+    public static final int BARCODE_TYPE_EAN_13_UPC_A = 1;
+    public static final int BARCODE_TYPE_EAN_8 = 2;
+    public static final String BARCODE_TYPE_ID_CODABAR = "CODABAR";
+    public static final String BARCODE_TYPE_ID_CODE128 = "CODE128";
+    public static final String BARCODE_TYPE_ID_CODE39 = "CODE39";
+    public static final String BARCODE_TYPE_ID_CODE93 = "CODE93";
+    public static final String BARCODE_TYPE_ID_EAN_13_UPC_A = "EAN13";
+    public static final String BARCODE_TYPE_ID_EAN_8 = "EAN8";
+    public static final String BARCODE_TYPE_ID_ITF = "ITF";
+    public static final String BARCODE_TYPE_ID_STD2OF5 = "STD2OF5";
+    public static final String BARCODE_TYPE_ID_UPC_E = "UPCE";
+    public static final int BARCODE_TYPE_INVALID = -1;
+    public static final int BARCODE_TYPE_ITF = 8;
+    public static final String BARCODE_TYPE_NAME_CODABAR = "Codabar";
+    public static final String BARCODE_TYPE_NAME_CODE128 = "Code 128";
+    public static final String BARCODE_TYPE_NAME_CODE39 = "Code 39";
+    public static final String BARCODE_TYPE_NAME_CODE93 = "Code 93";
+    public static final String BARCODE_TYPE_NAME_EAN_13_UPC_A = "EAN-13/UPC-A";
+    public static final String BARCODE_TYPE_NAME_EAN_8 = "EAN-8";
+    public static final String BARCODE_TYPE_NAME_ITF = "ITF";
+    public static final String BARCODE_TYPE_NAME_STD2OF5 = "STD 2 of 5";
+    public static final String BARCODE_TYPE_NAME_UPC_E = "UPC-E";
+    public static final int BARCODE_TYPE_STD2OF5 = 256;
+    public static final int BARCODE_TYPE_UPC_E = 4;
+
+    public static class DecoderValues {
+        public int evaluationDays;
+        public int left;
+        public Point lineEnd;
+        public Point lineStart;
+        public int right;
+        public int type;
+
+        public DecoderValues() {
+            this.lineStart = new Point();
+            this.lineEnd = new Point();
+        }
+    }
+
+    public static class Point {
+        public int x;
+        public int y;
+    }
+
+    public static native int VSinit();
+
+    public static native String decodeNextImage(byte[] bArr, int i, int i2, DecoderValues decoderValues);
+
+    public static native String decodeNextImageOmnidirectional(byte[] bArr, int i, int i2, int i3, DecoderValues decoderValues);
+
+    public static native int reset();
+
+    public static native int setBlurryAcceptanceThresholdWithAF(double d);
+
+    static {
+        System.loadLibrary("VSBarcodeReader");
+    }
+
+    public static String format(String barcode, int type) {
+        Object[] objArr;
+        switch (type) {
+            case BARCODE_TYPE_EAN_13_UPC_A /*1*/:
+                if (barcode.substring(0, BARCODE_TYPE_EAN_13_UPC_A).equals("0")) {
+                    objArr = new Object[BARCODE_TYPE_UPC_E];
+                    objArr[0] = barcode.substring(BARCODE_TYPE_EAN_13_UPC_A, BARCODE_TYPE_EAN_8);
+                    objArr[BARCODE_TYPE_EAN_13_UPC_A] = barcode.substring(BARCODE_TYPE_EAN_8, 7);
+                    objArr[BARCODE_TYPE_EAN_8] = barcode.substring(7, 12);
+                    objArr[3] = barcode.substring(12, 13);
+                    return String.format("%s-%s-%s-%s", objArr);
+                }
+                return String.format("%s-%s-%s", new Object[]{barcode.substring(0, BARCODE_TYPE_EAN_13_UPC_A), barcode.substring(BARCODE_TYPE_EAN_13_UPC_A, 7), barcode.substring(7, 13)});
+            case BARCODE_TYPE_EAN_8 /*2*/:
+                objArr = new Object[BARCODE_TYPE_EAN_8];
+                objArr[0] = barcode.substring(0, BARCODE_TYPE_UPC_E);
+                objArr[BARCODE_TYPE_EAN_13_UPC_A] = barcode.substring(BARCODE_TYPE_UPC_E, BARCODE_TYPE_ITF);
+                return String.format("%s-%s", objArr);
+            case BARCODE_TYPE_UPC_E /*4*/:
+                return String.format("%s-%s-%s", new Object[]{barcode.substring(0, BARCODE_TYPE_EAN_13_UPC_A), barcode.substring(BARCODE_TYPE_EAN_13_UPC_A, 7), barcode.substring(7, BARCODE_TYPE_ITF)});
+            default:
+                return barcode;
+        }
+    }
+}
diff --git a/app/src/main/java/com/visionsmarts/VSReaderQR.java b/app/src/main/java/com/visionsmarts/VSReaderQR.java
new file mode 100644
index 0000000..12acf68
--- /dev/null
+++ b/app/src/main/java/com/visionsmarts/VSReaderQR.java
@@ -0,0 +1,190 @@
+package com.visionsmarts;
+
+import java.nio.ByteBuffer;
+import java.nio.charset.CharacterCodingException;
+import java.nio.charset.Charset;
+
+public class VSReaderQR {
+    public static final int MODE_ALPHANUMERIC = 2;
+    public static final int MODE_BYTE = 4;
+    public static final int MODE_KANJI = 8;
+    public static final int MODE_NUMERIC = 1;
+    public static final String QR_CODE_TYPE_ID = "QR";
+
+    public static class DecoderValues {
+        public Point corner1;
+        public Point corner2;
+        public Point corner3;
+        public Point corner4;
+        public int evaluationDays;
+        public int mode;
+
+        public DecoderValues() {
+            this.corner1 = new Point();
+            this.corner2 = new Point();
+            this.corner3 = new Point();
+            this.corner4 = new Point();
+        }
+    }
+
+    private static class ECIMarker {
+        public int eci;
+        public int position;
+
+        private ECIMarker() {
+        }
+    }
+
+    public static class Point {
+        public int x;
+        public int y;
+    }
+
+    public static native byte[] decodeImage(byte[] bArr, int i, int i2, DecoderValues decoderValues);
+
+    static {
+        System.loadLibrary("VSReaderQR");
+    }
+
+    public static String format(byte[] data, int mode) {
+        Charset charset = Charset.forName("UTF-8");
+        if ((mode & MODE_KANJI) == MODE_KANJI) {
+            charset = Charset.forName("Shift_JIS");
+        }
+        int position = 0;
+        if (data.length > 3 && data[0] == 93 && data[MODE_NUMERIC] == 81) {
+            if (data[MODE_ALPHANUMERIC] == 51 || data[MODE_ALPHANUMERIC] == 52) {
+                position = 0 + 3;
+            }
+            if ((data[MODE_ALPHANUMERIC] == 53 || data[MODE_ALPHANUMERIC] == 54) && data.length > 5) {
+                position += 5;
+            }
+        }
+        StringBuilder result = new StringBuilder(data.length);
+        do {
+            ECIMarker nextMarker = findFirstECIMarker(data, position);
+            String next = decodeData(ByteBuffer.wrap(data, position, Math.min(nextMarker.position, data.length) - position), charset);
+            if (next != null) {
+                result.append(next);
+            }
+            if (nextMarker.position != data.length) {
+                position = nextMarker.position + 7;
+                charset = getCharsetForECI(nextMarker.eci);
+                if (charset == null) {
+                    charset = getCharsetForECI(0);
+                }
+            }
+            if (nextMarker.position == data.length) {
+                break;
+            }
+        } while (position < data.length);
+        return result.toString();
+    }
+
+    private static ECIMarker findFirstECIMarker(byte[] data, int fromPosition) {
+        ECIMarker eciMarker = new ECIMarker();
+        eciMarker.position = data.length;
+        int position = fromPosition;
+        while (position < data.length - 6) {
+            if (data[position] == 92 && Character.isDigit(data[position + MODE_NUMERIC]) && Character.isDigit(data[position + MODE_ALPHANUMERIC]) && Character.isDigit(data[position + 3]) && Character.isDigit(data[position + MODE_BYTE]) && Character.isDigit(data[position + 5]) && Character.isDigit(data[position + 6])) {
+                eciMarker.position = position;
+                eciMarker.eci = ((((((data[position + MODE_NUMERIC] - 48) * 100000) + ((data[position + MODE_ALPHANUMERIC] - 48) * 10000)) + ((data[position + 3] - 48) * 1000)) + ((data[position + MODE_BYTE] - 48) * 100)) + ((data[position + 5] - 48) * 10)) + (data[position + 6] - 48);
+                break;
+            }
+            position += MODE_NUMERIC;
+        }
+        return eciMarker;
+    }
+
+    private static Charset getCharsetForECI(int eci) {
+        switch (eci) {
+
+            case MODE_NUMERIC /*1*/:
+                return Charset.forName("ISO-8859-1");
+            case MODE_ALPHANUMERIC /*2*/:
+                return Charset.forName("ISO-8859-1");
+            case MODE_BYTE /*4*/:
+                return Charset.forName("ISO-8859-2");
+            case 5:
+                return Charset.forName("ISO-8859-3");
+            case 6:
+                return Charset.forName("ISO-8859-4");
+            case 7:
+                return Charset.forName("ISO-8859-5");
+            case MODE_KANJI /*8*/:
+                return Charset.forName("ISO-8859-6");
+            case 9:
+                return Charset.forName("ISO-8859-7");
+            case 10:
+                return Charset.forName("ISO-8859-8");
+            case 11:
+                return Charset.forName("ISO-8859-9");
+            case 12:
+                return Charset.forName("ISO-8859-10");
+            case 13:
+                return Charset.forName("ISO-8859-11");
+            case 15:
+                return Charset.forName("ISO-8859-13");
+            case VSBarcodeReader.BARCODE_TYPE_CODE39 /*16*/:
+                return Charset.forName("ISO-8859-14");
+            case 17:
+                return Charset.forName("ISO-8859-15");
+            case 18:
+                return Charset.forName("ISO-8859-16");
+            case 20:
+                return Charset.forName("Shift_JIS");
+            case 21:
+                return Charset.forName("windows-1250");
+            case 22:
+                return Charset.forName("windows-1251");
+            case 23:
+                return Charset.forName("windows-1252");
+            case 24:
+                return Charset.forName("windows-1256");
+            case 25:
+                return Charset.forName("UTF-16BE");
+            case 26:
+                return Charset.forName("UTF-8");
+            case 27:
+                return Charset.forName("EUC-JP");
+            case 28:
+                return Charset.forName("Big5");
+            case 29:
+                return Charset.forName("x-EUC-CN");
+            case 30:
+                return Charset.forName("EUC-KR");
+            case 899:
+                return Charset.forName("UTF-8");
+            default:
+                return null;
+        }
+    }
+
+    public static String decodeData(ByteBuffer data, Charset charset) {
+        try {
+            return charset.newDecoder().decode(data).toString();
+        } catch (CharacterCodingException e) {
+            data.rewind();
+            try {
+                return Charset.forName("Shift_JIS").newDecoder().decode(data).toString();
+            } catch (CharacterCodingException e2) {
+                data.rewind();
+                try {
+                    return Charset.forName("UTF-8").newDecoder().decode(data).toString();
+                } catch (CharacterCodingException e3) {
+                    data.rewind();
+                    try {
+                        return Charset.forName("ISO-8859-1").newDecoder().decode(data).toString();
+                    } catch (CharacterCodingException e4) {
+                        data.rewind();
+                        try {
+                            return Charset.forName("US-ASCII").newDecoder().decode(data).toString();
+                        } catch (CharacterCodingException e5) {
+                            return null;
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/app/src/main/java/com/visionsmarts/pic2shop/activity/ScannerActivity.java b/app/src/main/java/com/visionsmarts/pic2shop/activity/ScannerActivity.java
new file mode 100644
index 0000000..d83243e
--- /dev/null
+++ b/app/src/main/java/com/visionsmarts/pic2shop/activity/ScannerActivity.java
@@ -0,0 +1,227 @@
+package com.visionsmarts.pic2shop.activity;
+
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.res.AssetFileDescriptor;
+import android.media.AudioManager;
+import android.media.MediaPlayer;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.animation.Animation;
+import android.view.animation.LinearInterpolator;
+import android.view.animation.TranslateAnimation;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.supwisdom.conferencecheck.R;
+import com.supwisdom.conferencecheck.activity.BaseActivity;
+import com.supwisdom.conferencecheck.activity.MainActivity;
+import com.visionsmarts.VSBarcodeReader;
+import com.visionsmarts.pic2shop.view.ScannerLiveView;
+import com.visionsmarts.pic2shop.view.ScannerLiveView.Listener;
+
+import java.io.IOException;
+
+public class ScannerActivity extends BaseActivity implements Listener {
+  private static final float BEEP_VOLUME = 0.9f;
+  private MediaPlayer mBeepMediaPlayer;
+  private ScannerLiveView scannerLiveView;
+  private MediaPlayer mediaPlayer;
+  private boolean playBeep;
+  private View exit, exit2;
+  private TextView timer;
+
+  private boolean isExit_time = false;
+  private final static int SECONDE = 31; // 倒计时时间 -秒
+  private int recLen = SECONDE; // 剩余时间
+
+  private TimerService timerService;
+
+  private Handler timerHandler = new Handler(){
+    @Override
+    public void handleMessage(Message msg) {
+      if(msg.what != -9){
+        timer.setText(msg.what + "");
+      }else{
+        exit();
+      }
+      super.handleMessage(msg);
+    }
+  };
+
+  protected void onCreate(Bundle savedInstanceState) {
+    super.onCreate(savedInstanceState);
+      VSBarcodeReader.VSinit();
+      VSBarcodeReader.setBlurryAcceptanceThresholdWithAF(0.0d);
+    //getWindow().setFlags(1024, 1024);
+    //setRequestedOrientation(0);
+    setContentView(R.layout.activity_scanner_new);
+    timer = (TextView) findViewById(R.id.timer);
+    this.scannerLiveView = (ScannerLiveView) findViewById(R.id.scanner_live_view);
+      exit = findViewById(R.id.exit);
+      exit.setOnClickListener(new View.OnClickListener() {
+          @Override
+          public void onClick(View v) {
+            exit();
+          }
+      });
+      exit2 = findViewById(R.id.back_btn);
+      exit2.setOnClickListener(new View.OnClickListener() {
+          @Override
+          public void onClick(View v) {
+            exit();
+          }
+      });
+    initOther();
+  }
+
+  private void exit(){
+    Intent intent = new Intent();
+    Bundle bundle = new Bundle();
+    bundle.putString("vtoken", "");
+    intent.setClass(ScannerActivity.this, MainActivity.class);
+    intent.putExtras(bundle);
+    startActivity(intent);
+    //finish();
+  }
+
+  class TimerService extends Thread{
+    @Override
+    public void run() {
+      while(!isExit_time){
+        recLen--;
+        try {
+          Thread.sleep(1000);
+        } catch (InterruptedException e) {
+          // TODO Auto-generated catch block
+          e.printStackTrace();
+        }
+        Message msg = new Message();
+        if(recLen == 0){
+          msg.what = -9;
+        }else{
+          msg.what = recLen;
+        }
+        timerHandler.sendMessage(msg);
+      }
+    }
+  }
+
+  @Override
+  public boolean dispatchKeyEvent(KeyEvent event){
+      return false;
+  }
+
+  private void initOther() {
+    ImageView mQrLineView = (ImageView) findViewById(R.id.capture_scan_line);
+    TranslateAnimation mAnimation = new TranslateAnimation(TranslateAnimation.ABSOLUTE, 0f, TranslateAnimation.ABSOLUTE, 0f,
+        TranslateAnimation.RELATIVE_TO_PARENT, 0f, TranslateAnimation.RELATIVE_TO_PARENT, 0.9f);
+    mAnimation.setDuration(1500);
+    mAnimation.setRepeatCount(-1);
+    mAnimation.setRepeatMode(Animation.REVERSE);
+    mAnimation.setInterpolator(new LinearInterpolator());
+    mQrLineView.setAnimation(mAnimation);
+
+  }
+
+
+  protected void onResume() {
+    super.onResume();
+    this.scannerLiveView.onResume();
+    this.scannerLiveView.startCamera();
+
+    playBeep = true;
+    AudioManager audioService = (AudioManager) getSystemService(AUDIO_SERVICE);
+    if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {
+      playBeep = false;
+    }
+    initBeepSound();
+    isExit_time = false;
+    timerService = new TimerService();
+    timerService.start();
+  }
+
+  protected void onPause() {
+    super.onPause();
+    isExit_time = true;
+    this.scannerLiveView.stopCamera();
+    this.scannerLiveView.onPause();
+    finish();
+  }
+
+  protected void onDestroy() {
+    super.onDestroy();
+    isExit_time = true;
+    if (this.mBeepMediaPlayer != null) {
+      this.mBeepMediaPlayer.release();
+      this.mBeepMediaPlayer = null;
+    }
+  }
+
+  private void initBeepSound() {
+    if (playBeep && mediaPlayer == null) {
+      setVolumeControlStream(AudioManager.STREAM_MUSIC);
+      mediaPlayer = new MediaPlayer();
+      mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
+      mediaPlayer.setOnCompletionListener(beepListener);
+
+      AssetFileDescriptor file = getResources().openRawResourceFd(R.raw.beep);
+      try {
+        mediaPlayer.setDataSource(file.getFileDescriptor(), file.getStartOffset(), file.getLength());
+        file.close();
+        mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME);
+        mediaPlayer.prepare();
+      } catch (IOException e) {
+        mediaPlayer = null;
+      }
+    }
+  }
+
+  private void playBeepSoundAndVibrate() {
+    if (playBeep && mediaPlayer != null) {
+      mediaPlayer.start();
+    }
+  }
+
+  private final MediaPlayer.OnCompletionListener beepListener = new MediaPlayer.OnCompletionListener() {
+    public void onCompletion(MediaPlayer mediaPlayer) {
+      mediaPlayer.seekTo(0);
+    }
+  };
+
+  public void onCodeScanned(String codeFormat, String codeData) {
+    //setResultAndFinish(codeFormat, codeData);
+    playBeepSoundAndVibrate();
+    processResult(codeData);
+  }
+  public void onCameraIssue() {
+    Log.e("test", "无法获取相机服务，请重试");
+    showMsgDialogWithCallback("无法获取相机服务，请重试");
+  }
+
+  private void processResult(String ret) {
+    Log.e("test", "-----------result:"+ret);
+    Intent intent = new Intent();
+    Bundle bundle = new Bundle();
+    bundle.putString("vtoken", ret);
+    intent.setClass(ScannerActivity.this, MainActivity.class);
+    intent.putExtras(bundle);
+    startActivity(intent);
+    finish();
+  }
+
+  private void showMsgDialogWithCallback(String msg) {
+    new AlertDialog.Builder(this).setTitle(null).setPositiveButton("确定", new DialogInterface.OnClickListener() {
+      @Override
+      public void onClick(DialogInterface dialogInterface, int i) {
+        finish();
+      }
+    }).setCancelable(false).setMessage(msg).show();
+  }
+
+}
diff --git a/app/src/main/java/com/visionsmarts/pic2shop/activity/ScannerLinerActivity.java b/app/src/main/java/com/visionsmarts/pic2shop/activity/ScannerLinerActivity.java
new file mode 100644
index 0000000..a6201ed
--- /dev/null
+++ b/app/src/main/java/com/visionsmarts/pic2shop/activity/ScannerLinerActivity.java
@@ -0,0 +1,53 @@
+package com.visionsmarts.pic2shop.activity;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+import com.supwisdom.conferencecheck.R;
+import com.visionsmarts.VSBarcodeReader;
+import com.visionsmarts.pic2shop.view.ScannerLiveViewLiner;
+import com.visionsmarts.pic2shop.view.ScannerLiveViewLiner.Listener;
+
+public class ScannerLinerActivity extends Activity implements Listener {
+    private ScannerLiveViewLiner scannerLiveView;
+
+
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        VSBarcodeReader.VSinit();
+        VSBarcodeReader.setBlurryAcceptanceThresholdWithAF(0.0d);
+        int theme = 16973831;
+        setTheme(theme);
+        getWindow().setFlags(1024, 1024);
+        int ori = 0;
+        setRequestedOrientation(ori);
+        setContentView(R.layout.activity_scanner_liner);
+        this.scannerLiveView = (ScannerLiveViewLiner) findViewById(R.id.scanner_live_view);
+    }
+
+    protected void onResume() {
+        super.onResume();
+        this.scannerLiveView.onResume();
+    }
+
+    protected void onPause() {
+        super.onPause();
+        this.scannerLiveView.onPause();
+        if (!isFinishing()) {
+            finish();
+        }
+    }
+
+    protected void onDestroy() {
+        super.onDestroy();
+    }
+
+    public void onCodeScanned(String codeFormat, String codeData) {
+        //showSimpleMessageDialog(codeData);
+    }
+
+    public void onCameraIssue() {
+        //showSimpleMessageDialog("fail");
+    }
+
+}
diff --git a/app/src/main/java/com/visionsmarts/pic2shop/view/BarQrCodeUtil.java b/app/src/main/java/com/visionsmarts/pic2shop/view/BarQrCodeUtil.java
new file mode 100644
index 0000000..a5c72e8
--- /dev/null
+++ b/app/src/main/java/com/visionsmarts/pic2shop/view/BarQrCodeUtil.java
@@ -0,0 +1,18 @@
+package com.visionsmarts.pic2shop.view;
+
+import com.visionsmarts.VSReaderQR;
+
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+
+public class BarQrCodeUtil {
+    public static String qrToString(byte[] qrData) {
+        ByteBuffer qrBuffer;
+        if (qrData[qrData.length - 1] == 0) {
+            qrBuffer = ByteBuffer.wrap(qrData, 0, qrData.length - 1);
+        } else {
+            qrBuffer = ByteBuffer.wrap(qrData);
+        }
+        return VSReaderQR.decodeData(qrBuffer, Charset.forName("UTF-8"));
+    }
+}
diff --git a/app/src/main/java/com/visionsmarts/pic2shop/view/ScannerLiveView.java b/app/src/main/java/com/visionsmarts/pic2shop/view/ScannerLiveView.java
new file mode 100644
index 0000000..ad4bdc1
--- /dev/null
+++ b/app/src/main/java/com/visionsmarts/pic2shop/view/ScannerLiveView.java
@@ -0,0 +1,759 @@
+package com.visionsmarts.pic2shop.view;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.ImageFormat;
+import android.graphics.Point;
+import android.hardware.Camera;
+import android.hardware.Camera.AutoFocusCallback;
+import android.hardware.Camera.Parameters;
+import android.hardware.Camera.PreviewCallback;
+import android.hardware.Camera.Size;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.Display;
+import android.view.SurfaceHolder;
+import android.view.SurfaceHolder.Callback;
+import android.view.SurfaceView;
+import android.view.WindowManager;
+
+import com.supwisdom.conferencecheck.R;
+import com.supwisdom.util.Constants;
+import com.visionsmarts.VSBarcodeReader;
+import com.visionsmarts.VSBarcodeReader.DecoderValues;
+import com.visionsmarts.VSReaderQR;
+
+import java.io.IOException;
+import java.util.regex.Pattern;
+
+public class ScannerLiveView extends SurfaceView implements Callback {
+    private Point screen;
+    private static final int BARCODE_TYPES_MASK = 7;
+    private static final Pattern COMMA_PATTERN;
+    private static final int DESIRED_ZOOM_X10 = 27;
+    private static final String TAG;
+    private AutoFocusCallback mAutoFocusCallback;
+    private volatile byte[] mCallbackBuffer;
+    private volatile Camera mCamera;
+    private DecodingThread mDecodingThread;
+    volatile boolean mFoundBarcodeOrQRCode;
+    volatile byte[] mFrameData;
+    volatile boolean mFrameDataIsAutoFocusInProgress;
+    volatile boolean mHasCameraAutoFocus;
+    volatile boolean mIsAutoFocusInProgress;
+    volatile boolean mIsPreviewStarted;
+    Listener mListener;
+    private PreviewCallback mPreviewCallback;
+    private int mPreviewFrameSize;
+    volatile Size mPreviewSize;
+    final ScannerHandler mScannerHandler;
+    private volatile int mCameraDisplayOrientation;
+
+    public interface Listener {
+        void onCodeScanned(String str, String str2);
+        void onCameraIssue();
+    }
+
+    /* renamed from: com.visionsmarts.pic2shop.view.ScannerLiveView.1 */
+    class ScanAutoFocusCallback implements AutoFocusCallback {
+        ScanAutoFocusCallback() {
+        }
+
+        public void onAutoFocus(boolean success, Camera camera) {
+            ScannerLiveView.this.mIsAutoFocusInProgress = false;
+        }
+    }
+
+    /* renamed from: com.visionsmarts.pic2shop.view.ScannerLiveView.2 */
+    class ScanPreviewCallback implements PreviewCallback {
+        ScanPreviewCallback() {
+        }
+
+        public synchronized void onPreviewFrame(byte[] frameData, Camera camera) {
+            if (!(!ScannerLiveView.this.mIsPreviewStarted || ScannerLiveView.this.mDecodingThread == null || ScannerLiveView.this.mFoundBarcodeOrQRCode)) {
+                boolean shouldSendDecodeRequest = ScannerLiveView.this.mFrameData == null;
+                ScannerLiveView.this.mFrameData = frameData;
+                ScannerLiveView.this.mFrameDataIsAutoFocusInProgress = ScannerLiveView.this.mIsAutoFocusInProgress;
+                if (shouldSendDecodeRequest) {
+                    ScannerLiveView.this.mDecodingThread.getHandler().obtainMessage(R.id.decode).sendToTarget();
+                }
+            }
+        }
+    }
+
+    private class DecodingThread extends Thread {
+        DecoderValues mBarcodeDecoderValues;
+        private Handler mHandler;
+        private int mNumberConsecutiveFailedDecodingSinceFocusEnded;
+        private byte[] mPreviewLine;
+        VSReaderQR.DecoderValues mQRDecoderValues;
+
+        /* renamed from: com.visionsmarts.pic2shop.view.ScannerLiveView.DecodingThread.1 */
+        class DecodeMessageHandler extends Handler {
+            DecodeMessageHandler() {
+            }
+
+            public void handleMessage(Message message) {
+                switch (message.what) {
+                    case R.id.decode:
+                        if (ScannerLiveView.this.mIsPreviewStarted && !ScannerLiveView.this.mFoundBarcodeOrQRCode) {
+                            DecodingThread.this.decode();
+                        }
+                        break;
+                    case R.id.quit:
+                        Looper.myLooper().quit();
+                        break;
+                    default:
+                }
+            }
+        }
+
+        public DecodingThread() {
+            this.mNumberConsecutiveFailedDecodingSinceFocusEnded = 0;
+            this.mBarcodeDecoderValues = new DecoderValues();
+            this.mQRDecoderValues = new VSReaderQR.DecoderValues();
+            setPriority(10);
+            initialize();
+        }
+
+        synchronized Handler getHandler() {
+            if (this.mHandler == null) {
+                try {
+                    ScannerLiveView.this.mDecodingThread.wait(1000);
+                } catch (InterruptedException e) {
+                }
+            }
+            return this.mHandler;
+        }
+
+        public void initialize() {
+            if (ScannerLiveView.this.mPreviewSize != null && (this.mPreviewLine == null || this.mPreviewLine.length != ScannerLiveView.this.mPreviewSize.height)) {
+                this.mPreviewLine = new byte[ScannerLiveView.this.mPreviewSize.height];
+            }
+            this.mNumberConsecutiveFailedDecodingSinceFocusEnded = 0;
+            ScannerLiveView.this.mFoundBarcodeOrQRCode = false;
+            VSBarcodeReader.reset();
+        }
+
+        public void run() {
+            Looper.prepare();
+            synchronized (this) {
+                this.mHandler = new DecodeMessageHandler();
+                notify();
+            }
+            Looper.loop();
+        }
+
+        private void decode() {
+            byte[] previewLine = this.mPreviewLine;
+            int width = ScannerLiveView.this.mPreviewSize.width;
+            int height = ScannerLiveView.this.mPreviewSize.height;
+            synchronized (ScannerLiveView.this.mPreviewCallback) {
+                if (ScannerLiveView.this.mFrameData == null) {
+                    return;
+                }
+                byte[] frameData = ScannerLiveView.this.mFrameData;
+                boolean wasAutoFocusInProgress = ScannerLiveView.this.mFrameDataIsAutoFocusInProgress;
+                int offset  =  Math.round((float) (screen.y  / 2));
+                Log.e(TAG,"offset="+offset);
+                try {
+                    for (int i = previewLine.length - 1; i >= 0; i--) {
+                        previewLine[i] = frameData[offset];
+                        offset += width;
+                    }
+                } catch (ArrayIndexOutOfBoundsException e) {
+                }
+                if (ScannerLiveView.this.mFrameData != null) {
+                    String barcode = VSBarcodeReader.decodeNextImage(previewLine, ScannerLiveView.this.mHasCameraAutoFocus ? 1 : 0, ScannerLiveView.BARCODE_TYPES_MASK, this.mBarcodeDecoderValues);
+                    if (ScannerLiveView.this.mFrameData != null) {
+                        if (barcode.length() > 0) {
+                            ScannerLiveView.this.mFoundBarcodeOrQRCode = true;
+                            ScannerLiveView.this.mScannerHandler.obtainMessage(R.id.msg_barcode_found, barcode).sendToTarget();
+                        } else {
+                            try {
+                                byte[] qrData = VSReaderQR.decodeImage(frameData, width, height, this.mQRDecoderValues);
+                                if (qrData.length > 0) {
+                                    ScannerLiveView.this.mFoundBarcodeOrQRCode = true;
+                                    ScannerLiveView.this.mScannerHandler.obtainMessage(R.id.msg_qr_code_found, qrData).sendToTarget();
+                                } else if (wasAutoFocusInProgress) {
+                                    this.mNumberConsecutiveFailedDecodingSinceFocusEnded = 0;
+                                } else {
+                                    this.mNumberConsecutiveFailedDecodingSinceFocusEnded++;
+                                    if (ScannerLiveView.this.mHasCameraAutoFocus && !ScannerLiveView.this.mIsAutoFocusInProgress && this.mNumberConsecutiveFailedDecodingSinceFocusEnded >= 4) {
+                                        ScannerLiveView.this.mScannerHandler.obtainMessage(R.id.auto_focus).sendToTarget();
+                                    }
+                                }
+                            }catch (Exception e){
+                                e.printStackTrace();
+                            }
+                        }
+                        synchronized (ScannerLiveView.this.mPreviewCallback) {
+                            ScannerLiveView.this.mFrameData = null;
+                            if (!(ScannerLiveView.this.mFoundBarcodeOrQRCode || ScannerLiveView.this.mCallbackBuffer == null)) {
+                                ScannerLiveView.this.mCamera.addCallbackBuffer(ScannerLiveView.this.mCallbackBuffer);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private class ScannerHandler extends Handler {
+        private ScannerHandler() {
+        }
+
+        public void handleMessage(Message message) {
+            switch (message.what) {
+                case R.id.auto_focus:
+                    ScannerLiveView.this.requestAutoFocus();
+                    break;
+                case R.id.msg_barcode_found:
+                    if (ScannerLiveView.this.mIsPreviewStarted) {
+                        ScannerLiveView.this.stopCamera();
+                        ScannerLiveView.this.mListener.onCodeScanned(null, (String)message.obj);
+                    }
+                    break;
+                case R.id.msg_qr_code_found:
+                    if (ScannerLiveView.this.mIsPreviewStarted) {
+                        ScannerLiveView.this.stopCamera();
+                        ScannerLiveView.this.mListener.onCodeScanned(Constants.CALLBACK_URL_QR_PARAM, BarQrCodeUtil.qrToString((byte[])message.obj));
+                    }
+                    break;
+                default:
+            }
+        }
+    }
+
+    public ScannerLiveView(Context context) {
+        super(context);
+        this.mPreviewFrameSize = 0;
+        this.mScannerHandler = new ScannerHandler();
+        this.mIsPreviewStarted = false;
+        this.mIsAutoFocusInProgress = false;
+        this.mFrameData = null;
+        this.mFrameDataIsAutoFocusInProgress = false;
+        this.mFoundBarcodeOrQRCode = false;
+        initialize(context);
+    }
+
+    public ScannerLiveView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        this.mPreviewFrameSize = 0;
+        this.mScannerHandler = new ScannerHandler();
+        this.mIsPreviewStarted = false;
+        this.mIsAutoFocusInProgress = false;
+        this.mFrameData = null;
+        this.mFrameDataIsAutoFocusInProgress = false;
+        this.mFoundBarcodeOrQRCode = false;
+        initialize(context);
+    }
+
+    public ScannerLiveView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        this.mPreviewFrameSize = 0;
+        this.mScannerHandler = new ScannerHandler();
+        this.mIsPreviewStarted = false;
+        this.mIsAutoFocusInProgress = false;
+        this.mFrameData = null;
+        this.mFrameDataIsAutoFocusInProgress = false;
+        this.mFoundBarcodeOrQRCode = false;
+        initialize(context);
+    }
+
+    private void initialize(Context context) {
+        this.mListener = (Listener) context;
+        SurfaceHolder holder = getHolder();
+        holder.addCallback(this);
+        holder.setType(3);
+        holder.setKeepScreenOn(true);
+        this.mAutoFocusCallback = new ScanAutoFocusCallback();
+        this.mPreviewCallback = new ScanPreviewCallback();
+        Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
+        screen = new Point();
+        display.getSize(screen);
+    }
+
+
+    public void surfaceCreated(SurfaceHolder holder) {
+        if (holder == null) {
+            throw new IllegalStateException("No SurfaceHolder provided");
+        } else if (this.mCamera == null) {
+            try {
+                this.mCamera = null;
+                try {
+                    Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
+                    int camIdx = 1; // 1-前置，0-后置
+                    Camera.getCameraInfo(camIdx, cameraInfo);
+                    this.mCamera = Camera.open(camIdx);
+                    setCameraDisplayOrientation(camIdx);
+                    /*int cameraCount = Camera.getNumberOfCameras();
+                    for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
+                        Camera.getCameraInfo(camIdx, cameraInfo);
+                        if (cameraInfo.facing == PublicDef.FRONT_CAMERA) { // 前置 or 后置摄像头
+                            this.mCamera = Camera.open(camIdx);
+                            //this.mCamera.setDisplayOrientation(90);
+                            setCameraDisplayOrientation(camIdx);
+                            break;
+                        }
+                    }*/
+                } catch (LinkageError e) {
+                }
+                if (this.mCamera == null) {
+                    try {
+                        this.mCamera = Camera.open(0);
+                        //this.mCamera.setDisplayOrientation(90);
+                        setCameraDisplayOrientation(0);
+                    } catch (LinkageError e2) {
+                    }
+                }
+                if (this.mCamera == null) {
+                    this.mCamera = Camera.open();
+                }
+                this.mCamera.setPreviewDisplay(holder);
+                this.mIsPreviewStarted = false;
+            } catch (IOException e3) {
+                this.mListener.onCameraIssue();
+            } catch (RuntimeException e4) {
+                this.mListener.onCameraIssue();
+            }
+        }
+    }
+
+    public void setCameraDisplayOrientation(int cameraId) {
+        Camera.CameraInfo info = new Camera.CameraInfo();
+        Camera.getCameraInfo(cameraId, info);
+        int degrees = 0;
+        switch (((Activity) getContext()).getWindowManager().getDefaultDisplay().getRotation()) {
+            case 0:
+                degrees = 0;
+                break;
+            case 1:
+                degrees = 90;
+                break;
+            case 2:
+                degrees = 180;
+                break;
+            case 3:
+                degrees = 270;
+                break;
+        }
+        if (info.facing == 1) {
+            this.mCameraDisplayOrientation = (info.orientation + degrees) % 360;
+            this.mCameraDisplayOrientation = (360 - this.mCameraDisplayOrientation) % 360;
+        } else {
+            this.mCameraDisplayOrientation = ((info.orientation - degrees) + 360) % 360;
+        }
+        this.mCamera.setDisplayOrientation(this.mCameraDisplayOrientation);
+    }
+
+    public void surfaceDestroyed(SurfaceHolder holder) {
+        if (this.mCamera != null) {
+            stopCamera();
+            this.mPreviewFrameSize = 0;
+        }
+    }
+
+    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
+        if (this.mCamera != null) {
+            stopCamera();
+            setCameraParameters(screen.y,screen.x);
+            if (isShown()) {
+                startCamera();
+            }
+        }
+    }
+
+    public void onPause() {
+        stopCamera();
+        if (this.mCamera != null) {
+            this.mCamera.release();
+            this.mCamera = null;
+        }
+        Message.obtain(this.mDecodingThread.getHandler(), R.id.quit).sendToTarget();
+        try {
+            this.mDecodingThread.join();
+        } catch (InterruptedException e) {
+        }
+        this.mScannerHandler.removeMessages(R.id.auto_focus);
+        this.mScannerHandler.removeMessages(R.id.msg_barcode_found);
+        this.mScannerHandler.removeMessages(R.id.msg_qr_code_found);
+        this.mDecodingThread = null;
+    }
+
+    public void onResume() {
+        /*this.mScannerOverlay = (ScannerOverlay) ((Activity) getContext()).findViewById(R.id.scanner_overlay);
+        this.mScannerOverlay.setBarcodeLocation(-1, -1);*/
+        this.mDecodingThread = new DecodingThread();
+        this.mDecodingThread.start();
+        startCamera();
+    }
+
+    public void startCamera() {
+        if (this.mCamera != null && !this.mIsPreviewStarted) {
+            this.mIsAutoFocusInProgress = false;
+            this.mFrameData = null;
+            if (this.mDecodingThread != null) {
+                this.mDecodingThread.initialize();
+            }
+            if (this.mPreviewFrameSize > 0) {
+                try {
+                    this.mCallbackBuffer = new byte[this.mPreviewFrameSize];
+                } catch (OutOfMemoryError e) {
+                    this.mCallbackBuffer = null;
+                }
+            }
+            if (this.mCallbackBuffer != null) {
+                this.mCamera.setPreviewCallbackWithBuffer(this.mPreviewCallback);
+                this.mCamera.addCallbackBuffer(this.mCallbackBuffer);
+            } else {
+                this.mCamera.setPreviewCallback(this.mPreviewCallback);
+            }
+            try {
+                this.mCamera.startPreview();
+                this.mIsPreviewStarted = true;
+                requestAutoFocus();
+            } catch (RuntimeException e2) {
+                this.mCamera.setPreviewCallback(null);
+                this.mCallbackBuffer = null;
+                this.mListener.onCameraIssue();
+            }
+        }
+    }
+
+    public void stopCamera() {
+        /*if (this.mCamera != null && this.mIsPreviewStarted) {
+            this.mCamera.setPreviewCallback(null);
+            this.mCamera.stopPreview();
+            this.mIsPreviewStarted = false;
+            if (this.mDecodingThread.getHandler() != null) {
+                this.mDecodingThread.getHandler().removeMessages(R.id.decode);
+            }
+            this.mScannerHandler.removeMessages(R.id.auto_focus);
+            this.mScannerHandler.removeMessages(R.id.msg_barcode_found);
+        }*/
+
+        if (this.mCamera != null && this.mIsPreviewStarted) {
+            synchronized (this.mPreviewCallback) {
+                this.mCamera.setPreviewCallback(null);
+                this.mCamera.stopPreview();
+                this.mIsPreviewStarted = false;
+                this.mCamera.cancelAutoFocus();
+                this.mFrameData = null;
+                this.mCallbackBuffer = null;
+            }
+            if (!(this.mDecodingThread == null || this.mDecodingThread.getHandler() == null)) {
+                this.mDecodingThread.getHandler().removeMessages(R.id.decode);
+            }
+            this.mScannerHandler.removeMessages(R.id.auto_focus);
+            this.mScannerHandler.removeMessages(R.id.msg_barcode_found);
+            this.mScannerHandler.removeMessages(R.id.msg_qr_code_found);
+        }
+
+    }
+
+    void requestAutoFocus() {
+        if (this.mCamera != null && this.mHasCameraAutoFocus && this.mIsPreviewStarted && !this.mIsAutoFocusInProgress) {
+            try {
+                this.mCamera.autoFocus(this.mAutoFocusCallback);
+                this.mIsAutoFocusInProgress = true;
+            } catch (RuntimeException e) {
+                Log.e(TAG, "Camera auto-focus failed: " + e.getLocalizedMessage());
+            }
+        }
+    }
+
+
+    private void setCameraParameters(int screenWidth, int screenHeight) {
+        Parameters parameters = this.mCamera.getParameters();
+        Log.e(TAG,"screenWidth="+screenWidth+",screenHeight="+screenHeight);
+        setPreviewSize(screenWidth, screenHeight, parameters);
+        setZoom(parameters);
+        String focusModeValues = parameters.get("focus-mode-values");
+        if (focusModeValues != null && focusModeValues.contains("macro")) {
+            parameters.set("focus-mode", "macro");
+            this.mHasCameraAutoFocus = true;
+        } else if (focusModeValues == null || !focusModeValues.contains("auto")) {
+            this.mHasCameraAutoFocus = false;
+        } else {
+            parameters.set("focus-mode", "auto");
+            this.mHasCameraAutoFocus = true;
+        }
+        try {
+            this.mCamera.setParameters(parameters);
+        } catch (RuntimeException e) {
+            this.mListener.onCameraIssue();
+        }
+        parameters = this.mCamera.getParameters();
+        this.mPreviewSize = parameters.getPreviewSize();
+        this.mPreviewFrameSize = ((this.mPreviewSize.width * this.mPreviewSize.height) * ImageFormat.getBitsPerPixel(parameters.getPreviewFormat())) / 8;
+    }
+
+    private void setPreviewSize(int screenWidth, int screenHeight, Parameters parameters) {
+        String previewSizeValuesString = parameters.get("preview-size-values");
+        if (previewSizeValuesString == null) {
+            previewSizeValuesString = parameters.get("preview-size-value");
+        }
+        Point bestPreviewSize = null;
+        if (previewSizeValuesString != null) {
+            bestPreviewSize = findBestPreviewSize(previewSizeValuesString, screenWidth, screenHeight);
+        }
+        if (bestPreviewSize != null) {
+            parameters.setPreviewSize(bestPreviewSize.x, bestPreviewSize.y);
+        } else {
+            parameters.setPreviewSize((screenWidth >> 4) << 4, (screenHeight >> 1) << 1);
+        }
+    }
+
+    private static Point findBestPreviewSize(CharSequence previewSizeValuesString, int screenWidth, int screenHeight) {
+        int bestPreviewWidth = 0;
+        int bestPreviewHeight = 0;
+        int minDifference = Integer.MAX_VALUE;
+        for (String previewSizeValueString : COMMA_PATTERN.split(previewSizeValuesString)) {
+            String previewSizeValueString2 = previewSizeValueString.trim();
+            int separatorPosition = previewSizeValueString2.indexOf(120);
+            if (separatorPosition >= 0) {
+                try {
+                    int previewSizeValueWidth = Integer.parseInt(previewSizeValueString2.substring(0, separatorPosition));
+                    int previewSizeValueHeight = Integer.parseInt(previewSizeValueString2.substring(separatorPosition + 1));
+                    int difference = Math.abs(previewSizeValueWidth - screenWidth) + Math.abs(previewSizeValueHeight - screenHeight);
+                    if (difference == 0) {
+                        bestPreviewWidth = previewSizeValueWidth;
+                        bestPreviewHeight = previewSizeValueHeight;
+                        break;
+                    } else if (difference < minDifference) {
+                        bestPreviewWidth = previewSizeValueWidth;
+                        bestPreviewHeight = previewSizeValueHeight;
+                        minDifference = difference;
+                    }
+                } catch (NumberFormatException e) {
+                }
+            }
+        }
+        if (bestPreviewWidth <= 0 || bestPreviewHeight <= 0) {
+            return null;
+        }
+        Log.e(TAG,"bestPreviewWidth="+bestPreviewWidth+",bestPreviewHeight="+bestPreviewHeight);
+        return new Point(bestPreviewWidth, bestPreviewHeight);
+    }
+
+    private void setZoom(Parameters parameters) {
+        String zoomSupportedString = parameters.get("zoom-supported");
+        if (zoomSupportedString == null || Boolean.parseBoolean(zoomSupportedString)) {
+            int maxZoomX10;
+            int desiredZoomX10 = DESIRED_ZOOM_X10;
+            String maxZoomString = parameters.get("max-zoom");
+            if (maxZoomString != null) {
+                try {
+                    maxZoomX10 = (int) (10.0d * Double.parseDouble(maxZoomString));
+                    if (DESIRED_ZOOM_X10 > maxZoomX10) {
+                        desiredZoomX10 = maxZoomX10;
+                    }
+                } catch (NumberFormatException e) {
+                }
+            }
+            String takingPictureZoomMaxString = parameters.get("taking-picture-zoom-max");
+            if (takingPictureZoomMaxString != null) {
+                try {
+                    maxZoomX10 = Integer.parseInt(takingPictureZoomMaxString);
+                    if (desiredZoomX10 > maxZoomX10) {
+                        desiredZoomX10 = maxZoomX10;
+                    }
+                } catch (NumberFormatException e2) {
+                }
+            }
+            String motZoomValuesString = parameters.get("mot-zoom-values");
+            if (motZoomValuesString != null) {
+                desiredZoomX10 = findBestMotZoomX10(motZoomValuesString, desiredZoomX10);
+            }
+            String motZoomStepString = parameters.get("mot-zoom-step");
+            if (motZoomStepString != null) {
+                try {
+                    int motZoomStepX10 = (int) (10.0d * Double.parseDouble(motZoomStepString.trim()));
+                    if (motZoomStepX10 > 1) {
+                        desiredZoomX10 -= desiredZoomX10 % motZoomStepX10;
+                    }
+                } catch (NumberFormatException e3) {
+                }
+            }
+            if (!(maxZoomString == null && motZoomValuesString == null)) {
+                parameters.set("zoom", String.valueOf(((double) desiredZoomX10) / 10.0d));
+            }
+            if (takingPictureZoomMaxString != null) {
+                parameters.set("taking-picture-zoom", desiredZoomX10);
+            }
+        }
+    }
+
+    private static int findBestMotZoomX10(CharSequence motZoomValuesString, int desiredZoomX10) {
+        int bestMotZoomX10 = 0;
+        String[] split = COMMA_PATTERN.split(motZoomValuesString);
+        int length = split.length;
+        int i = 0;
+        while (i < length) {
+            try {
+                int motZoomValueX10 = (int) (10.0d * Double.parseDouble(split[i].trim()));
+                if (Math.abs(desiredZoomX10 - motZoomValueX10) < Math.abs(desiredZoomX10 - bestMotZoomX10)) {
+                    bestMotZoomX10 = motZoomValueX10;
+                }
+                i++;
+            } catch (NumberFormatException e) {
+                return desiredZoomX10;
+            }
+        }
+        return bestMotZoomX10;
+    }
+    /*private void setCameraParameters(int screenWidth, int screenHeight) {
+        Parameters parameters = this.mCamera.getParameters();
+        setPreviewSize(screenWidth, screenHeight, parameters);
+        parameters.set("flash-mode", "off");
+        parameters.set("flash-value", 2);
+        setZoom(parameters);
+        int apiLevel = Integer.parseInt(VERSION.SDK);
+        if (apiLevel <= 3) {
+            this.mHasCameraAutoFocus = true;
+        } else if (apiLevel >= 5) {
+            String focusModeValues = parameters.get("focus-mode-values");
+            if (focusModeValues != null && focusModeValues.contains("macro")) {
+                parameters.set("focus-mode", "macro");
+                this.mHasCameraAutoFocus = true;
+            } else if (focusModeValues == null || !focusModeValues.contains("auto")) {
+                this.mHasCameraAutoFocus = false;
+            } else {
+                parameters.set("focus-mode", "auto");
+                this.mHasCameraAutoFocus = true;
+            }
+        } else {
+            String model = Build.MODEL.toLowerCase();
+            if (model.contains("devour") || model.contains("tattoo")) {
+                this.mHasCameraAutoFocus = false;
+            } else {
+                this.mHasCameraAutoFocus = true;
+            }
+        }
+        this.mCamera.setParameters(parameters);
+        this.mPreviewSize = parameters.getPreviewSize();
+    }
+
+    private void setPreviewSize(int screenWidth, int screenHeight, Parameters parameters) {
+        String previewSizeValuesString = parameters.get("preview-size-values");
+        if (previewSizeValuesString == null) {
+            previewSizeValuesString = parameters.get("preview-size-value");
+        }
+        Point bestPreviewSize = null;
+        if (previewSizeValuesString != null) {
+            bestPreviewSize = findBestPreviewSize(previewSizeValuesString, screenWidth, screenHeight);
+        }
+        if (bestPreviewSize != null) {
+            parameters.setPreviewSize(bestPreviewSize.x, bestPreviewSize.y);
+        } else {
+            parameters.setPreviewSize((screenWidth >> 3) << 3, (screenHeight >> 3) << 3);
+        }
+    }
+
+    private static Point findBestPreviewSize(CharSequence previewSizeValuesString, int screenWidth, int screenHeight) {
+        int bestPreviewWidth = 0;
+        int bestPreviewHeight = 0;
+        int minDifference = Integer.MAX_VALUE;
+        for (String previewSizeValueString : COMMA_PATTERN.split(previewSizeValuesString)) {
+            String previewSizeValueString2 = previewSizeValueString.trim();
+            int separatorPosition = previewSizeValueString2.indexOf(120);
+            if (separatorPosition >= 0) {
+                try {
+                    int previewSizeValueWidth = Integer.parseInt(previewSizeValueString2.substring(0, separatorPosition));
+                    int previewSizeValueHeight = Integer.parseInt(previewSizeValueString2.substring(separatorPosition + 1));
+                    int difference = Math.abs(previewSizeValueWidth - screenWidth) + Math.abs(previewSizeValueHeight - screenHeight);
+                    if (difference == 0) {
+                        bestPreviewWidth = previewSizeValueWidth;
+                        bestPreviewHeight = previewSizeValueHeight;
+                        break;
+                    } else if (difference < minDifference) {
+                        bestPreviewWidth = previewSizeValueWidth;
+                        bestPreviewHeight = previewSizeValueHeight;
+                        minDifference = difference;
+                    }
+                } catch (NumberFormatException e) {
+                }
+            }
+        }
+        if (bestPreviewWidth <= 0 || bestPreviewHeight <= 0) {
+            return null;
+        }
+        return new Point(bestPreviewWidth, bestPreviewHeight);
+    }
+
+    private void setZoom(Parameters parameters) {
+        String zoomSupportedString = parameters.get("zoom-supported");
+        if (zoomSupportedString == null || Boolean.parseBoolean(zoomSupportedString)) {
+            int maxZoomX10;
+            int desiredZoomX10 = DESIRED_ZOOM_X10;
+            String maxZoomString = parameters.get("max-zoom");
+            if (maxZoomString != null) {
+                try {
+                    maxZoomX10 = (int) (10.0d * Double.parseDouble(maxZoomString));
+                    if (DESIRED_ZOOM_X10 > maxZoomX10) {
+                        desiredZoomX10 = maxZoomX10;
+                    }
+                } catch (NumberFormatException e) {
+                }
+            }
+            String takingPictureZoomMaxString = parameters.get("taking-picture-zoom-max");
+            if (takingPictureZoomMaxString != null) {
+                try {
+                    maxZoomX10 = Integer.parseInt(takingPictureZoomMaxString);
+                    if (desiredZoomX10 > maxZoomX10) {
+                        desiredZoomX10 = maxZoomX10;
+                    }
+                } catch (NumberFormatException e2) {
+                }
+            }
+            String motZoomValuesString = parameters.get("mot-zoom-values");
+            if (motZoomValuesString != null) {
+                desiredZoomX10 = findBestMotZoomX10(motZoomValuesString, desiredZoomX10);
+            }
+            String motZoomStepString = parameters.get("mot-zoom-step");
+            if (motZoomStepString != null) {
+                try {
+                    int motZoomStepX10 = (int) (10.0d * Double.parseDouble(motZoomStepString.trim()));
+                    if (motZoomStepX10 > 1) {
+                        desiredZoomX10 -= desiredZoomX10 % motZoomStepX10;
+                    }
+                } catch (NumberFormatException e3) {
+                }
+            }
+            if (!(maxZoomString == null && motZoomValuesString == null)) {
+                parameters.set("zoom", String.valueOf(((double) desiredZoomX10) / 10.0d));
+            }
+            if (takingPictureZoomMaxString != null) {
+                parameters.set("taking-picture-zoom", desiredZoomX10);
+            }
+        }
+    }
+
+    private static int findBestMotZoomX10(CharSequence motZoomValuesString, int desiredZoomX10) {
+        int bestMotZoomX10 = 0;
+        String[] split = COMMA_PATTERN.split(motZoomValuesString);
+        int length = split.length;
+        int i = 0;
+        while (i < length) {
+            try {
+                int motZoomValueX10 = (int) (10.0d * Double.parseDouble(split[i].trim()));
+                if (Math.abs(desiredZoomX10 - motZoomValueX10) < Math.abs(desiredZoomX10 - bestMotZoomX10)) {
+                    bestMotZoomX10 = motZoomValueX10;
+                }
+                i++;
+            } catch (NumberFormatException e) {
+                return desiredZoomX10;
+            }
+        }
+        return bestMotZoomX10;
+    }*/
+
+    static {
+        TAG = ScannerLiveView.class.getSimpleName();
+        COMMA_PATTERN = Pattern.compile(",");
+    }
+}
diff --git a/app/src/main/java/com/visionsmarts/pic2shop/view/ScannerLiveViewLiner.java b/app/src/main/java/com/visionsmarts/pic2shop/view/ScannerLiveViewLiner.java
new file mode 100644
index 0000000..cb5c126
--- /dev/null
+++ b/app/src/main/java/com/visionsmarts/pic2shop/view/ScannerLiveViewLiner.java
@@ -0,0 +1,611 @@
+package com.visionsmarts.pic2shop.view;
+
+import android.annotation.TargetApi;
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.ImageFormat;
+import android.graphics.Point;
+import android.hardware.Camera;
+import android.hardware.Camera.AutoFocusCallback;
+import android.hardware.Camera.CameraInfo;
+import android.hardware.Camera.Parameters;
+import android.hardware.Camera.PreviewCallback;
+import android.hardware.Camera.Size;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.SurfaceHolder;
+import android.view.SurfaceHolder.Callback;
+import android.view.SurfaceView;
+
+import com.supwisdom.conferencecheck.R;
+import com.supwisdom.util.Constants;
+import com.visionsmarts.VSBarcodeReader;
+import com.visionsmarts.VSBarcodeReader.DecoderValues;
+import com.visionsmarts.VSReaderQR;
+
+import java.io.IOException;
+import java.util.regex.Pattern;
+
+public class ScannerLiveViewLiner extends SurfaceView implements Callback {
+    private static final int BARCODE_TYPES_MASK = 7;
+    private static final Pattern COMMA_PATTERN;
+    private static final int DESIRED_ZOOM_X10 = 27;
+    private static final String TAG;
+    private AutoFocusCallback mAutoFocusCallback;
+    private volatile byte[] mCallbackBuffer;
+    private volatile Camera mCamera;
+    private volatile int mCameraDisplayOrientation;
+    private DecodingThread mDecodingThread;
+    volatile boolean mFoundBarcodeOrQRCode;
+    volatile byte[] mFrameData;
+    volatile boolean mFrameDataIsAutoFocusInProgress;
+    volatile boolean mHasCameraAutoFocus;
+    volatile boolean mIsAutoFocusInProgress;
+    volatile boolean mIsPreviewStarted;
+    Listener mListener;
+    private PreviewCallback mPreviewCallback;
+    private int mPreviewFrameSize;
+    volatile Size mPreviewSize;
+    final ScannerHandler mScannerHandler;
+    ScannerOverlay mScannerOverlay;
+
+    /* renamed from: com.visionsmarts.pic2shop.view.ScannerLiveViewLiner.1 */
+    class C01731 implements AutoFocusCallback {
+        C01731() {
+        }
+
+        public void onAutoFocus(boolean success, Camera camera) {
+            ScannerLiveViewLiner.this.mIsAutoFocusInProgress = false;
+        }
+    }
+
+    /* renamed from: com.visionsmarts.pic2shop.view.ScannerLiveViewLiner.2 */
+    class C01742 implements PreviewCallback {
+        C01742() {
+        }
+
+        public synchronized void onPreviewFrame(byte[] frameData, Camera camera) {
+            if (!(!ScannerLiveViewLiner.this.mIsPreviewStarted || ScannerLiveViewLiner.this.mDecodingThread == null || ScannerLiveViewLiner.this.mFoundBarcodeOrQRCode)) {
+                boolean shouldSendDecodeRequest = ScannerLiveViewLiner.this.mFrameData == null;
+                ScannerLiveViewLiner.this.mFrameData = frameData;
+                ScannerLiveViewLiner.this.mFrameDataIsAutoFocusInProgress = ScannerLiveViewLiner.this.mIsAutoFocusInProgress;
+                if (shouldSendDecodeRequest) {
+                    ScannerLiveViewLiner.this.mDecodingThread.getHandler().obtainMessage(R.id.decode).sendToTarget();
+                }
+            }
+        }
+    }
+
+    private class DecodingThread extends Thread {
+        DecoderValues mBarcodeDecoderValues;
+        private Handler mHandler;
+        private int mNumberConsecutiveFailedDecodingSinceFocusEnded;
+        private byte[] mPreviewLine;
+        VSReaderQR.DecoderValues mQRDecoderValues;
+
+        /* renamed from: com.visionsmarts.pic2shop.view.ScannerLiveViewLiner.DecodingThread.1 */
+        class C01751 extends Handler {
+            C01751() {
+            }
+
+            public void handleMessage(Message message) {
+                switch (message.what) {
+                    case R.id.decode:
+                        if (ScannerLiveViewLiner.this.mIsPreviewStarted && !ScannerLiveViewLiner.this.mFoundBarcodeOrQRCode) {
+                            DecodingThread.this.decode();
+                        }
+                        break;
+                    case R.id.quit:
+                        Looper.myLooper().quit();
+                        break;
+                    default:
+                }
+            }
+        }
+
+        public DecodingThread() {
+            this.mNumberConsecutiveFailedDecodingSinceFocusEnded = 0;
+            this.mBarcodeDecoderValues = new DecoderValues();
+            this.mQRDecoderValues = new VSReaderQR.DecoderValues();
+            setPriority(10);
+            initialize();
+        }
+
+        synchronized Handler getHandler() {
+            if (this.mHandler == null) {
+                try {
+                    ScannerLiveViewLiner.this.mDecodingThread.wait(1000);
+                } catch (InterruptedException e) {
+                }
+            }
+            return this.mHandler;
+        }
+
+        public void initialize() {
+            if (ScannerLiveViewLiner.this.mPreviewSize != null && (this.mPreviewLine == null || this.mPreviewLine.length != ScannerLiveViewLiner.this.mPreviewSize.height)) {
+                this.mPreviewLine = new byte[ScannerLiveViewLiner.this.mPreviewSize.height];
+            }
+            this.mNumberConsecutiveFailedDecodingSinceFocusEnded = 0;
+            ScannerLiveViewLiner.this.mFoundBarcodeOrQRCode = false;
+            VSBarcodeReader.reset();
+        }
+
+        public void run() {
+            Looper.prepare();
+            synchronized (this) {
+                this.mHandler = new C01751();
+                notify();
+            }
+            Looper.loop();
+        }
+
+        @TargetApi(8)
+        private void decode() {
+            byte[] previewLine = this.mPreviewLine;
+            int width = ScannerLiveViewLiner.this.mPreviewSize.width;
+            int height = ScannerLiveViewLiner.this.mPreviewSize.height;
+            synchronized (ScannerLiveViewLiner.this.mPreviewCallback) {
+                if (ScannerLiveViewLiner.this.mFrameData == null) {
+                    return;
+                }
+                byte[] frameData = ScannerLiveViewLiner.this.mFrameData;
+                boolean wasAutoFocusInProgress = ScannerLiveViewLiner.this.mFrameDataIsAutoFocusInProgress;
+                int offset = Math.round(ScannerLiveViewLiner.this.mScannerOverlay.getNormalizedLaserLinePosition() * ((float) width));
+                Log.e(TAG,"offset="+offset);
+                int i = previewLine.length - 1;
+                while (i >= 0) {
+                    try {
+                        previewLine[i] = frameData[offset];
+                        offset += width;
+                        i--;
+                    } catch (ArrayIndexOutOfBoundsException e) {
+                        throw new ArrayIndexOutOfBoundsException(e.getMessage() + "; width=" + width + "; height=" + height + "; previewLine.length=" + previewLine.length + "; initOffset=" + Math.round(ScannerLiveViewLiner.this.mScannerOverlay.getNormalizedLaserLinePosition() * ((float) width)));
+                    }
+                }
+                if (ScannerLiveViewLiner.this.mFrameData != null) {
+                    String barcode = VSBarcodeReader.decodeNextImage(previewLine, ScannerLiveViewLiner.this.mHasCameraAutoFocus ? 1 : 0, ScannerLiveViewLiner.BARCODE_TYPES_MASK, this.mBarcodeDecoderValues);
+                    if (ScannerLiveViewLiner.this.mFrameData != null) {
+                        if (this.mBarcodeDecoderValues.left >= 0) {
+                            int left = this.mBarcodeDecoderValues.left;
+                            int right = this.mBarcodeDecoderValues.right;
+                            float lineLength = (float) previewLine.length;
+                            if (ScannerLiveViewLiner.this.mCameraDisplayOrientation == 180) {
+                                ScannerLiveViewLiner.this.mScannerOverlay.setNormalizedBarcodeLocation(((float) (height - right)) / lineLength, ((float) (height - left)) / lineLength);
+                            } else {
+                                ScannerLiveViewLiner.this.mScannerOverlay.setNormalizedBarcodeLocation(((float) left) / lineLength, ((float) right) / lineLength);
+                            }
+                        } else {
+                            ScannerLiveViewLiner.this.mScannerOverlay.setNoBarcodeLocation();
+                        }
+                        if (barcode.length() > 0) {
+                            ScannerLiveViewLiner.this.mFoundBarcodeOrQRCode = true;
+                            ScannerLiveViewLiner.this.mScannerHandler.obtainMessage(R.id.msg_barcode_found, barcode).sendToTarget();
+                        } else {
+                            byte[] qrData = VSReaderQR.decodeImage(frameData, width, height, this.mQRDecoderValues);
+                            if (qrData.length > 0) {
+                                ScannerLiveViewLiner.this.mFoundBarcodeOrQRCode = true;
+                                ScannerLiveViewLiner.this.mScannerHandler.obtainMessage(R.id.msg_qr_code_found, qrData).sendToTarget();
+                            } else if (wasAutoFocusInProgress) {
+                                this.mNumberConsecutiveFailedDecodingSinceFocusEnded = 0;
+                            } else {
+                                this.mNumberConsecutiveFailedDecodingSinceFocusEnded++;
+                                if (ScannerLiveViewLiner.this.mHasCameraAutoFocus && !ScannerLiveViewLiner.this.mIsAutoFocusInProgress && this.mNumberConsecutiveFailedDecodingSinceFocusEnded >= 4) {
+                                    ScannerLiveViewLiner.this.mScannerHandler.obtainMessage(R.id.auto_focus).sendToTarget();
+                                }
+                            }
+                        }
+                        synchronized (ScannerLiveViewLiner.this.mPreviewCallback) {
+                            ScannerLiveViewLiner.this.mFrameData = null;
+                            if (!(ScannerLiveViewLiner.this.mFoundBarcodeOrQRCode || ScannerLiveViewLiner.this.mCallbackBuffer == null)) {
+                                ScannerLiveViewLiner.this.mCamera.addCallbackBuffer(ScannerLiveViewLiner.this.mCallbackBuffer);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public interface Listener {
+        void onCameraIssue();
+
+        void onCodeScanned(String str, String str2);
+    }
+
+    private class ScannerHandler extends Handler {
+        private ScannerHandler() {
+        }
+
+        public void handleMessage(Message message) {
+            switch (message.what) {
+                case R.id.auto_focus:
+                    ScannerLiveViewLiner.this.requestAutoFocus();
+                    break;
+                case R.id.msg_barcode_found:
+                    if (ScannerLiveViewLiner.this.mIsPreviewStarted) {
+                        ScannerLiveViewLiner.this.stopCamera();
+                        ScannerLiveViewLiner.this.mListener.onCodeScanned(null, (String)message.obj);
+                    }
+                    break;
+                case R.id.msg_qr_code_found:
+                    if (ScannerLiveViewLiner.this.mIsPreviewStarted) {
+                        ScannerLiveViewLiner.this.stopCamera();
+                        ScannerLiveViewLiner.this.mListener.onCodeScanned(Constants.CALLBACK_URL_QR_PARAM, BarQrCodeUtil.qrToString((byte[])message.obj));
+                    }
+                    break;
+                default:
+            }
+        }
+    }
+
+    public ScannerLiveViewLiner(Context context) {
+        super(context);
+        this.mPreviewFrameSize = 0;
+        this.mScannerHandler = new ScannerHandler();
+        this.mIsPreviewStarted = false;
+        this.mIsAutoFocusInProgress = false;
+        this.mFrameData = null;
+        this.mFrameDataIsAutoFocusInProgress = false;
+        this.mFoundBarcodeOrQRCode = false;
+        initialize(context);
+    }
+
+    public ScannerLiveViewLiner(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        this.mPreviewFrameSize = 0;
+        this.mScannerHandler = new ScannerHandler();
+        this.mIsPreviewStarted = false;
+        this.mIsAutoFocusInProgress = false;
+        this.mFrameData = null;
+        this.mFrameDataIsAutoFocusInProgress = false;
+        this.mFoundBarcodeOrQRCode = false;
+        initialize(context);
+    }
+
+    public ScannerLiveViewLiner(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        this.mPreviewFrameSize = 0;
+        this.mScannerHandler = new ScannerHandler();
+        this.mIsPreviewStarted = false;
+        this.mIsAutoFocusInProgress = false;
+        this.mFrameData = null;
+        this.mFrameDataIsAutoFocusInProgress = false;
+        this.mFoundBarcodeOrQRCode = false;
+        initialize(context);
+    }
+
+    private void initialize(Context context) {
+        this.mListener = (Listener) context;
+        SurfaceHolder holder = getHolder();
+        holder.addCallback(this);
+        holder.setType(3);
+        holder.setKeepScreenOn(true);
+        this.mAutoFocusCallback = new C01731();
+        this.mPreviewCallback = new C01742();
+    }
+
+    @TargetApi(9)
+    public void surfaceCreated(SurfaceHolder holder) {
+        if (holder == null) {
+            throw new IllegalStateException("No SurfaceHolder provided");
+        } else if (this.mCamera == null) {
+            try {
+                this.mCamera = null;
+                try {
+                    CameraInfo cameraInfo = new CameraInfo();
+                    int cameraCount = Camera.getNumberOfCameras();
+                    for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
+                        Camera.getCameraInfo(camIdx, cameraInfo);
+                        if (cameraInfo.facing == 0) {
+                            this.mCamera = Camera.open(camIdx);
+                            setCameraDisplayOrientation(camIdx);
+                            break;
+                        }
+                    }
+                } catch (LinkageError e) {
+                }
+                if (this.mCamera == null) {
+                    try {
+                        this.mCamera = Camera.open(0);
+                        setCameraDisplayOrientation(0);
+                    } catch (LinkageError e2) {
+                    }
+                }
+                if (this.mCamera == null) {
+                    this.mCamera = Camera.open();
+                }
+                this.mCamera.setPreviewDisplay(holder);
+                this.mIsPreviewStarted = false;
+            } catch (IOException e3) {
+                this.mListener.onCameraIssue();
+            } catch (RuntimeException e4) {
+                this.mListener.onCameraIssue();
+            }
+        }
+    }
+
+    public void surfaceDestroyed(SurfaceHolder holder) {
+        if (this.mCamera != null) {
+            stopCamera();
+            this.mPreviewFrameSize = 0;
+        }
+    }
+
+    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
+        if (this.mCamera != null) {
+            stopCamera();
+            setCameraParameters(width, height);
+            if (isShown()) {
+                startCamera();
+            }
+        }
+    }
+
+    public void onPause() {
+        stopCamera();
+        if (this.mCamera != null) {
+            this.mCamera.release();
+            this.mCamera = null;
+        }
+        Message.obtain(this.mDecodingThread.getHandler(), R.id.quit).sendToTarget();
+        try {
+            this.mDecodingThread.join();
+        } catch (InterruptedException e) {
+        }
+        this.mScannerHandler.removeMessages(R.id.auto_focus);
+        this.mScannerHandler.removeMessages(R.id.msg_barcode_found);
+        this.mScannerHandler.removeMessages(R.id.msg_qr_code_found);
+        this.mDecodingThread = null;
+    }
+
+    public void onResume() {
+        this.mScannerOverlay = (ScannerOverlay) ((Activity) getContext()).findViewById(R.id.scanner_overlay);
+        this.mScannerOverlay.setNoBarcodeLocation();
+        this.mDecodingThread = new DecodingThread();
+        this.mDecodingThread.start();
+        startCamera();
+    }
+
+    @TargetApi(8)
+    public void startCamera() {
+        if (this.mCamera != null && !this.mIsPreviewStarted) {
+            this.mIsAutoFocusInProgress = false;
+            this.mFrameData = null;
+            if (this.mDecodingThread != null) {
+                this.mDecodingThread.initialize();
+            }
+            if (this.mScannerOverlay != null) {
+                this.mScannerOverlay.setNoBarcodeLocation();
+            }
+            if (this.mPreviewFrameSize > 0) {
+                try {
+                    this.mCallbackBuffer = new byte[this.mPreviewFrameSize];
+                } catch (OutOfMemoryError e) {
+                    this.mCallbackBuffer = null;
+                }
+            }
+            if (this.mCallbackBuffer != null) {
+                this.mCamera.setPreviewCallbackWithBuffer(this.mPreviewCallback);
+                this.mCamera.addCallbackBuffer(this.mCallbackBuffer);
+            } else {
+                this.mCamera.setPreviewCallback(this.mPreviewCallback);
+            }
+            try {
+                this.mCamera.startPreview();
+                this.mIsPreviewStarted = true;
+                requestAutoFocus();
+            } catch (RuntimeException e2) {
+                this.mCamera.setPreviewCallback(null);
+                this.mCallbackBuffer = null;
+                this.mListener.onCameraIssue();
+            }
+        }
+    }
+
+    public void stopCamera() {
+        if (this.mCamera != null && this.mIsPreviewStarted) {
+            synchronized (this.mPreviewCallback) {
+                this.mCamera.setPreviewCallback(null);
+                this.mCamera.stopPreview();
+                this.mIsPreviewStarted = false;
+                this.mCamera.cancelAutoFocus();
+                this.mFrameData = null;
+                this.mCallbackBuffer = null;
+            }
+            if (!(this.mDecodingThread == null || this.mDecodingThread.getHandler() == null)) {
+                this.mDecodingThread.getHandler().removeMessages(R.id.decode);
+            }
+            this.mScannerHandler.removeMessages(R.id.auto_focus);
+            this.mScannerHandler.removeMessages(R.id.msg_barcode_found);
+            this.mScannerHandler.removeMessages(R.id.msg_qr_code_found);
+        }
+    }
+
+    void requestAutoFocus() {
+        if (this.mCamera != null && this.mHasCameraAutoFocus && this.mIsPreviewStarted && !this.mIsAutoFocusInProgress) {
+            try {
+                this.mCamera.autoFocus(this.mAutoFocusCallback);
+                this.mIsAutoFocusInProgress = true;
+            } catch (RuntimeException e) {
+                Log.e(TAG, "Camera auto-focus failed: " + e.getLocalizedMessage());
+            }
+        }
+    }
+
+    @TargetApi(9)
+    public void setCameraDisplayOrientation(int cameraId) {
+        CameraInfo info = new CameraInfo();
+        Camera.getCameraInfo(cameraId, info);
+        int degrees = 0;
+        switch (((Activity) getContext()).getWindowManager().getDefaultDisplay().getRotation()) {
+            case 0 /*0*/:
+                degrees = 0;
+                break;
+            case 1 /*1*/:
+                degrees = 90;
+                break;
+            case 2 /*2*/:
+                degrees = 180;
+                break;
+            case 3 /*3*/:
+                degrees = 270;
+                break;
+        }
+        if (info.facing == 1) {
+            this.mCameraDisplayOrientation = (info.orientation + degrees) % 360;
+            this.mCameraDisplayOrientation = (360 - this.mCameraDisplayOrientation) % 360;
+        } else {
+            this.mCameraDisplayOrientation = ((info.orientation - degrees) + 360) % 360;
+        }
+        this.mCamera.setDisplayOrientation(this.mCameraDisplayOrientation);
+    }
+
+    @TargetApi(8)
+    private void setCameraParameters(int screenWidth, int screenHeight) {
+        Log.e(TAG,"screenWidth="+screenWidth+",screenHeight="+screenHeight);
+        Parameters parameters = this.mCamera.getParameters();
+        setPreviewSize(screenWidth, screenHeight, parameters);
+        setZoom(parameters);
+        String focusModeValues = parameters.get("focus-mode-values");
+        if (focusModeValues != null && focusModeValues.contains("macro")) {
+            parameters.set("focus-mode", "macro");
+            this.mHasCameraAutoFocus = true;
+        } else if (focusModeValues == null || !focusModeValues.contains("auto")) {
+            this.mHasCameraAutoFocus = false;
+        } else {
+            parameters.set("focus-mode", "auto");
+            this.mHasCameraAutoFocus = true;
+        }
+        try {
+            this.mCamera.setParameters(parameters);
+        } catch (RuntimeException e) {
+            this.mListener.onCameraIssue();
+        }
+        parameters = this.mCamera.getParameters();
+        this.mPreviewSize = parameters.getPreviewSize();
+        this.mPreviewFrameSize = ((this.mPreviewSize.width * this.mPreviewSize.height) * ImageFormat.getBitsPerPixel(parameters.getPreviewFormat())) / 8;
+    }
+
+    private void setPreviewSize(int screenWidth, int screenHeight, Parameters parameters) {
+        String previewSizeValuesString = parameters.get("preview-size-values");
+        if (previewSizeValuesString == null) {
+            previewSizeValuesString = parameters.get("preview-size-value");
+        }
+        Point bestPreviewSize = null;
+        if (previewSizeValuesString != null) {
+            bestPreviewSize = findBestPreviewSize(previewSizeValuesString, screenWidth, screenHeight);
+        }
+        if (bestPreviewSize != null) {
+            parameters.setPreviewSize(bestPreviewSize.x, bestPreviewSize.y);
+        } else {
+            parameters.setPreviewSize((screenWidth >> 4) << 4, (screenHeight >> 1) << 1);
+        }
+    }
+
+    private static Point findBestPreviewSize(CharSequence previewSizeValuesString, int screenWidth, int screenHeight) {
+        int bestPreviewWidth = 0;
+        int bestPreviewHeight = 0;
+        int minDifference = Integer.MAX_VALUE;
+        for (String previewSizeValueString : COMMA_PATTERN.split(previewSizeValuesString)) {
+            String previewSizeValueString2 = previewSizeValueString.trim();
+            int separatorPosition = previewSizeValueString2.indexOf(120);
+            if (separatorPosition >= 0) {
+                try {
+                    int previewSizeValueWidth = Integer.parseInt(previewSizeValueString2.substring(0, separatorPosition));
+                    int previewSizeValueHeight = Integer.parseInt(previewSizeValueString2.substring(separatorPosition + 1));
+                    int difference = Math.abs(previewSizeValueWidth - screenWidth) + Math.abs(previewSizeValueHeight - screenHeight);
+                    if (difference == 0) {
+                        bestPreviewWidth = previewSizeValueWidth;
+                        bestPreviewHeight = previewSizeValueHeight;
+                        break;
+                    } else if (difference < minDifference) {
+                        bestPreviewWidth = previewSizeValueWidth;
+                        bestPreviewHeight = previewSizeValueHeight;
+                        minDifference = difference;
+                    }
+                } catch (NumberFormatException e) {
+                }
+            }
+        }
+        if (bestPreviewWidth <= 0 || bestPreviewHeight <= 0) {
+            return null;
+        }
+        Log.e(TAG,"bestPreviewWidth="+bestPreviewWidth+",bestPreviewHeight="+bestPreviewHeight);
+        return new Point(bestPreviewWidth, bestPreviewHeight);
+    }
+
+    private void setZoom(Parameters parameters) {
+        String zoomSupportedString = parameters.get("zoom-supported");
+        if (zoomSupportedString == null || Boolean.parseBoolean(zoomSupportedString)) {
+            int maxZoomX10;
+            int desiredZoomX10 = DESIRED_ZOOM_X10;
+            String maxZoomString = parameters.get("max-zoom");
+            if (maxZoomString != null) {
+                try {
+                    maxZoomX10 = (int) (10.0d * Double.parseDouble(maxZoomString));
+                    if (DESIRED_ZOOM_X10 > maxZoomX10) {
+                        desiredZoomX10 = maxZoomX10;
+                    }
+                } catch (NumberFormatException e) {
+                }
+            }
+            String takingPictureZoomMaxString = parameters.get("taking-picture-zoom-max");
+            if (takingPictureZoomMaxString != null) {
+                try {
+                    maxZoomX10 = Integer.parseInt(takingPictureZoomMaxString);
+                    if (desiredZoomX10 > maxZoomX10) {
+                        desiredZoomX10 = maxZoomX10;
+                    }
+                } catch (NumberFormatException e2) {
+                }
+            }
+            String motZoomValuesString = parameters.get("mot-zoom-values");
+            if (motZoomValuesString != null) {
+                desiredZoomX10 = findBestMotZoomX10(motZoomValuesString, desiredZoomX10);
+            }
+            String motZoomStepString = parameters.get("mot-zoom-step");
+            if (motZoomStepString != null) {
+                try {
+                    int motZoomStepX10 = (int) (10.0d * Double.parseDouble(motZoomStepString.trim()));
+                    if (motZoomStepX10 > 1) {
+                        desiredZoomX10 -= desiredZoomX10 % motZoomStepX10;
+                    }
+                } catch (NumberFormatException e3) {
+                }
+            }
+            if (!(maxZoomString == null && motZoomValuesString == null)) {
+                parameters.set("zoom", String.valueOf(((double) desiredZoomX10) / 10.0d));
+            }
+            if (takingPictureZoomMaxString != null) {
+                parameters.set("taking-picture-zoom", desiredZoomX10);
+            }
+        }
+    }
+
+    private static int findBestMotZoomX10(CharSequence motZoomValuesString, int desiredZoomX10) {
+        int bestMotZoomX10 = 0;
+        String[] split = COMMA_PATTERN.split(motZoomValuesString);
+        int length = split.length;
+        int i = 0;
+        while (i < length) {
+            try {
+                int motZoomValueX10 = (int) (10.0d * Double.parseDouble(split[i].trim()));
+                if (Math.abs(desiredZoomX10 - motZoomValueX10) < Math.abs(desiredZoomX10 - bestMotZoomX10)) {
+                    bestMotZoomX10 = motZoomValueX10;
+                }
+                i++;
+            } catch (NumberFormatException e) {
+                return desiredZoomX10;
+            }
+        }
+        return bestMotZoomX10;
+    }
+
+    static {
+        TAG = ScannerLiveViewLiner.class.getSimpleName();
+        COMMA_PATTERN = Pattern.compile(",");
+    }
+}
diff --git a/app/src/main/java/com/visionsmarts/pic2shop/view/ScannerOverlay.java b/app/src/main/java/com/visionsmarts/pic2shop/view/ScannerOverlay.java
new file mode 100644
index 0000000..f4345ab
--- /dev/null
+++ b/app/src/main/java/com/visionsmarts/pic2shop/view/ScannerOverlay.java
@@ -0,0 +1,126 @@
+package com.visionsmarts.pic2shop.view;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Paint.Align;
+import android.graphics.Paint.Style;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.graphics.Typeface;
+import android.text.Layout.Alignment;
+import android.text.StaticLayout;
+import android.text.TextPaint;
+import android.util.AttributeSet;
+import android.view.Display;
+import android.view.View;
+import android.view.WindowManager;
+
+import com.supwisdom.conferencecheck.R;
+
+public class ScannerOverlay extends View {
+    private static final float LASER_LINE_WIDTH_160_DPI = 7.0f;
+    private static final float TEXT_FONT_SIZE = 20.0f;
+    private Paint mBarcodeLinePaint;
+    private Rect mBarcodeLineRect;
+    private Rect mCanvasClipRect;
+    private Paint mLaserLinePaint;
+    private int mLaserLinePosition;
+    private Rect mLaserLineRect;
+    private float mScreenDensity;
+    private Point mScreenResolution;
+    private Paint mTextBackgroundPaint;
+    private StaticLayout mTextLayout;
+
+    public ScannerOverlay(Context context) {
+        super(context);
+        this.mCanvasClipRect = new Rect();
+        this.mLaserLineRect = new Rect();
+        this.mBarcodeLineRect = new Rect(-1, -1, -1, -1);
+        initialize(context);
+    }
+
+    public ScannerOverlay(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        this.mCanvasClipRect = new Rect();
+        this.mLaserLineRect = new Rect();
+        this.mBarcodeLineRect = new Rect(-1, -1, -1, -1);
+        initialize(context);
+    }
+
+    public ScannerOverlay(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        this.mCanvasClipRect = new Rect();
+        this.mLaserLineRect = new Rect();
+        this.mBarcodeLineRect = new Rect(-1, -1, -1, -1);
+        initialize(context);
+    }
+
+    private void initialize(Context context) {
+        this.mTextBackgroundPaint = new Paint();
+        this.mTextBackgroundPaint.setStyle(Style.FILL);
+        this.mTextBackgroundPaint.setColor(Color.GREEN);
+        this.mTextBackgroundPaint.setAlpha(204);
+        TextPaint textPaint = new TextPaint();
+        textPaint.setStyle(Style.FILL);
+        textPaint.setStrokeWidth(1.0f);
+        textPaint.setColor(-1);
+        textPaint.setAlpha(204);
+        textPaint.setAntiAlias(true);
+        textPaint.setTypeface(Typeface.DEFAULT_BOLD);
+        textPaint.setTextSize(TEXT_FONT_SIZE * context.getResources().getDisplayMetrics().scaledDensity);
+        textPaint.setTextAlign(Align.CENTER);
+        this.mTextLayout = new StaticLayout(getContext().getString(R.string.scan_text), textPaint, context.getResources().getDisplayMetrics().heightPixels, Alignment.ALIGN_NORMAL, 1.0f, 0.0f, true);
+        this.mLaserLinePaint = new Paint();
+        this.mLaserLinePaint.setStyle(Style.FILL);
+        this.mLaserLinePaint.setColor(-65536);
+        this.mLaserLinePaint.setAlpha(255);
+        this.mBarcodeLinePaint = new Paint();
+        this.mBarcodeLinePaint.setStyle(Style.FILL);
+        this.mBarcodeLinePaint.setColor(-16711936);
+        this.mBarcodeLinePaint.setAlpha(255);
+        Display display = ((WindowManager) context.getSystemService("window")).getDefaultDisplay();
+        this.mScreenResolution = new Point(display.getWidth(), display.getHeight());
+        this.mScreenDensity = getContext().getResources().getDisplayMetrics().density;
+        this.mLaserLinePosition = Math.round((float) (this.mScreenResolution.x / 2));
+    }
+
+    protected void onDraw(Canvas canvas) {
+        float center = ((float) canvas.getHeight()) / 2.0f;
+        canvas.rotate(-90.0f, center, center);
+        if (canvas.getClipBounds(this.mCanvasClipRect)) {
+            if (this.mCanvasClipRect.height() == canvas.getWidth()) {
+                canvas.drawRect(0.0f, (float) (this.mCanvasClipRect.bottom - this.mTextLayout.getHeight()), (float) this.mCanvasClipRect.right, (float) this.mCanvasClipRect.bottom, this.mTextBackgroundPaint);
+                canvas.save();
+                canvas.translate(this.mCanvasClipRect.exactCenterX(), (float) (this.mCanvasClipRect.bottom - this.mTextLayout.getHeight()));
+                this.mTextLayout.draw(canvas);
+                canvas.restore();
+                int lineWidth = Math.round(LASER_LINE_WIDTH_160_DPI * this.mScreenDensity);
+                this.mLaserLineRect.set(this.mCanvasClipRect.width() / 8, this.mLaserLinePosition - (lineWidth / 2), (this.mCanvasClipRect.width() * 7) / 8, this.mLaserLinePosition + ((lineWidth - 1) / 2));
+                this.mBarcodeLineRect.top = this.mLaserLineRect.top;
+                this.mBarcodeLineRect.bottom = this.mLaserLineRect.bottom;
+            }
+            canvas.drawRect(this.mLaserLineRect, this.mLaserLinePaint);
+            if (this.mBarcodeLineRect.left >= 0 && this.mBarcodeLineRect.right >= 0) {
+                canvas.drawRect(this.mBarcodeLineRect, this.mBarcodeLinePaint);
+            }
+        }
+    }
+
+    public float getNormalizedLaserLinePosition() {
+        return ((float) this.mLaserLinePosition) / ((float) this.mScreenResolution.x);
+    }
+
+    public void setNormalizedBarcodeLocation(float left, float right) {
+        this.mBarcodeLineRect.left = Math.round(((float) this.mScreenResolution.y) * left);
+        this.mBarcodeLineRect.right = Math.round(((float) this.mScreenResolution.y) * right);
+        postInvalidate(this.mLaserLineRect.top, 0, this.mLaserLineRect.bottom, this.mScreenResolution.y - 1);
+    }
+
+    public void setNoBarcodeLocation() {
+        this.mBarcodeLineRect.left = -1;
+        this.mBarcodeLineRect.right = -1;
+        postInvalidate(this.mLaserLineRect.top, 0, this.mLaserLineRect.bottom, this.mScreenResolution.y - 1);
+    }
+}
diff --git a/app/src/main/jniLibs/armeabi-v7a/libVSBarcodeReader.so b/app/src/main/jniLibs/armeabi-v7a/libVSBarcodeReader.so
new file mode 100644
index 0000000..aa3d33b
--- /dev/null
+++ b/app/src/main/jniLibs/armeabi-v7a/libVSBarcodeReader.so
Binary files differ
diff --git a/app/src/main/jniLibs/armeabi-v7a/libVSReaderQR.so b/app/src/main/jniLibs/armeabi-v7a/libVSReaderQR.so
new file mode 100644
index 0000000..f6cd34d
--- /dev/null
+++ b/app/src/main/jniLibs/armeabi-v7a/libVSReaderQR.so
Binary files differ
diff --git a/app/src/main/res/drawable-v24/bg_corner_all_dark.xml b/app/src/main/res/drawable-v24/bg_corner_all_dark.xml
new file mode 100644
index 0000000..ab104a1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/bg_corner_all_dark.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/black_1"/>
+    <corners android:bottomLeftRadius="10dp"
+        android:bottomRightRadius="10dp"
+        android:topLeftRadius="10dip"
+        android:topRightRadius="10dip"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/bg_corner_top_blue.xml b/app/src/main/res/drawable-v24/bg_corner_top_blue.xml
new file mode 100644
index 0000000..d63927f
--- /dev/null
+++ b/app/src/main/res/drawable-v24/bg_corner_top_blue.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/main_blue2"/>
+    <corners
+        android:topLeftRadius="10dip"
+        android:topRightRadius="10dip"
+        android:bottomRightRadius="10dip"
+        android:bottomLeftRadius="10dip"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/corner_bg_red_normal.xml b/app/src/main/res/drawable-v24/corner_bg_red_normal.xml
new file mode 100644
index 0000000..353e167
--- /dev/null
+++ b/app/src/main/res/drawable-v24/corner_bg_red_normal.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/top_bar_theme_blue" />
+    <corners android:radius="8dip" />
+    <stroke
+        android:width="1.0dip"
+        android:color="@color/top_bar_theme_blue" />
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/app_logo.png b/app/src/main/res/drawable/app_logo.png
new file mode 100644
index 0000000..b03cd66
--- /dev/null
+++ b/app/src/main/res/drawable/app_logo.png
Binary files differ
diff --git a/app/src/main/res/drawable/bg_all_darkred.xml b/app/src/main/res/drawable/bg_all_darkred.xml
new file mode 100644
index 0000000..5272a72
--- /dev/null
+++ b/app/src/main/res/drawable/bg_all_darkred.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/dark_red"/>
+    <corners android:bottomLeftRadius="10dp"
+        android:bottomRightRadius="10dp"
+        android:topLeftRadius="10dip"
+        android:topRightRadius="10dip"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_all_lightblue.xml b/app/src/main/res/drawable/bg_all_lightblue.xml
new file mode 100644
index 0000000..d7e0f0c
--- /dev/null
+++ b/app/src/main/res/drawable/bg_all_lightblue.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/light_blue"/>
+    <corners android:bottomLeftRadius="10dp"
+        android:bottomRightRadius="10dp"
+        android:topLeftRadius="10dip"
+        android:topRightRadius="10dip"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_all_lightblue2.xml b/app/src/main/res/drawable/bg_all_lightblue2.xml
new file mode 100644
index 0000000..ccd08be
--- /dev/null
+++ b/app/src/main/res/drawable/bg_all_lightblue2.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/light_blue_2"/>
+    <corners android:bottomLeftRadius="10dp"
+        android:bottomRightRadius="10dp"
+        android:topLeftRadius="10dip"
+        android:topRightRadius="10dip"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_all_lightred.xml b/app/src/main/res/drawable/bg_all_lightred.xml
new file mode 100644
index 0000000..fe16983
--- /dev/null
+++ b/app/src/main/res/drawable/bg_all_lightred.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/light_red"/>
+    <corners android:bottomLeftRadius="10dp"
+        android:bottomRightRadius="10dp"
+        android:topLeftRadius="10dip"
+        android:topRightRadius="10dip"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_left_lightblue2.xml b/app/src/main/res/drawable/bg_left_lightblue2.xml
new file mode 100644
index 0000000..b93065f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_left_lightblue2.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/light_blue_2"/>
+    <corners android:bottomLeftRadius="10dp"
+        android:topLeftRadius="10dip"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_right_lightblue2.xml b/app/src/main/res/drawable/bg_right_lightblue2.xml
new file mode 100644
index 0000000..f6147f3
--- /dev/null
+++ b/app/src/main/res/drawable/bg_right_lightblue2.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/light_blue_2"/>
+    <corners android:bottomRightRadius="10dp"
+        android:topRightRadius="10dip"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/btn_red_click.png b/app/src/main/res/drawable/btn_red_click.png
new file mode 100644
index 0000000..580c410
--- /dev/null
+++ b/app/src/main/res/drawable/btn_red_click.png
Binary files differ
diff --git a/app/src/main/res/drawable/btn_red_normal.png b/app/src/main/res/drawable/btn_red_normal.png
new file mode 100644
index 0000000..f447037
--- /dev/null
+++ b/app/src/main/res/drawable/btn_red_normal.png
Binary files differ
diff --git a/app/src/main/res/drawable/capture.9.png b/app/src/main/res/drawable/capture.9.png
new file mode 100644
index 0000000..4cefb98
--- /dev/null
+++ b/app/src/main/res/drawable/capture.9.png
Binary files differ
diff --git a/app/src/main/res/drawable/corner_bg.xml b/app/src/main/res/drawable/corner_bg.xml
new file mode 100644
index 0000000..40c5b82
--- /dev/null
+++ b/app/src/main/res/drawable/corner_bg.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#80ffffff" />
+    <corners android:radius="8dip" />
+    <stroke
+        android:width="1.0dip"
+        android:color="#ffc5c5c5" />
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/corner_bg_gray_focus.xml b/app/src/main/res/drawable/corner_bg_gray_focus.xml
new file mode 100644
index 0000000..a6c45eb
--- /dev/null
+++ b/app/src/main/res/drawable/corner_bg_gray_focus.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/light_gray2" />
+    <corners android:radius="8dip" />
+    <stroke
+        android:width="1.0dip"
+        android:color="@color/light_gray2" />
+</shape>
diff --git a/app/src/main/res/drawable/corner_bg_keyboard_focus.xml b/app/src/main/res/drawable/corner_bg_keyboard_focus.xml
new file mode 100644
index 0000000..0f93672
--- /dev/null
+++ b/app/src/main/res/drawable/corner_bg_keyboard_focus.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#807c7c"/>
+    <corners android:radius="12dip"/>
+    <stroke
+        android:width="1.0dip"
+        android:color="#807c7c"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/corner_bg_keyboard_normal.xml b/app/src/main/res/drawable/corner_bg_keyboard_normal.xml
new file mode 100644
index 0000000..7732d4b
--- /dev/null
+++ b/app/src/main/res/drawable/corner_bg_keyboard_normal.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#ffffff"/>
+    <corners android:radius="12dip"/>
+    <stroke
+        android:width="1.0dip"
+        android:color="#ffffff"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/corner_bg_white.xml b/app/src/main/res/drawable/corner_bg_white.xml
new file mode 100644
index 0000000..48324a8
--- /dev/null
+++ b/app/src/main/res/drawable/corner_bg_white.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@android:color/white" />
+    <corners android:radius="8dip" />
+    <stroke
+        android:width="1.0dip"
+        android:color="@android:color/white" />
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/corner_blue_left.xml b/app/src/main/res/drawable/corner_blue_left.xml
new file mode 100644
index 0000000..7370890
--- /dev/null
+++ b/app/src/main/res/drawable/corner_blue_left.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/main_blue2"/>
+    <corners android:topLeftRadius="10dp"
+        android:bottomLeftRadius="10dp"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/corner_blue_right.xml b/app/src/main/res/drawable/corner_blue_right.xml
new file mode 100644
index 0000000..f3b4af9
--- /dev/null
+++ b/app/src/main/res/drawable/corner_blue_right.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/main_blue2"/>
+    <corners android:topRightRadius="10dp"
+        android:bottomRightRadius="10dp"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/face_smile.jpg b/app/src/main/res/drawable/face_smile.jpg
new file mode 100644
index 0000000..5ab9972
--- /dev/null
+++ b/app/src/main/res/drawable/face_smile.jpg
Binary files differ
diff --git a/app/src/main/res/drawable/iconfont_back.png b/app/src/main/res/drawable/iconfont_back.png
new file mode 100644
index 0000000..0ba4b36
--- /dev/null
+++ b/app/src/main/res/drawable/iconfont_back.png
Binary files differ
diff --git a/app/src/main/res/drawable/order_btn_purchase.png b/app/src/main/res/drawable/order_btn_purchase.png
new file mode 100644
index 0000000..416af7b
--- /dev/null
+++ b/app/src/main/res/drawable/order_btn_purchase.png
Binary files differ
diff --git a/app/src/main/res/drawable/pass_delete_click.png b/app/src/main/res/drawable/pass_delete_click.png
new file mode 100644
index 0000000..d05207d
--- /dev/null
+++ b/app/src/main/res/drawable/pass_delete_click.png
Binary files differ
diff --git a/app/src/main/res/drawable/pass_delete_normal.png b/app/src/main/res/drawable/pass_delete_normal.png
new file mode 100644
index 0000000..b77fc91
--- /dev/null
+++ b/app/src/main/res/drawable/pass_delete_normal.png
Binary files differ
diff --git a/app/src/main/res/drawable/pass_eight_click.png b/app/src/main/res/drawable/pass_eight_click.png
new file mode 100644
index 0000000..c26ffd8
--- /dev/null
+++ b/app/src/main/res/drawable/pass_eight_click.png
Binary files differ
diff --git a/app/src/main/res/drawable/pass_eight_normal.png b/app/src/main/res/drawable/pass_eight_normal.png
new file mode 100644
index 0000000..9b2ece0
--- /dev/null
+++ b/app/src/main/res/drawable/pass_eight_normal.png
Binary files differ
diff --git a/app/src/main/res/drawable/pass_five_click.png b/app/src/main/res/drawable/pass_five_click.png
new file mode 100644
index 0000000..c555169
--- /dev/null
+++ b/app/src/main/res/drawable/pass_five_click.png
Binary files differ
diff --git a/app/src/main/res/drawable/pass_five_normal.png b/app/src/main/res/drawable/pass_five_normal.png
new file mode 100644
index 0000000..3a6460b
--- /dev/null
+++ b/app/src/main/res/drawable/pass_five_normal.png
Binary files differ
diff --git a/app/src/main/res/drawable/pass_four_click.png b/app/src/main/res/drawable/pass_four_click.png
new file mode 100644
index 0000000..8b2325f
--- /dev/null
+++ b/app/src/main/res/drawable/pass_four_click.png
Binary files differ
diff --git a/app/src/main/res/drawable/pass_four_normal.png b/app/src/main/res/drawable/pass_four_normal.png
new file mode 100644
index 0000000..97bd59f
--- /dev/null
+++ b/app/src/main/res/drawable/pass_four_normal.png
Binary files differ
diff --git a/app/src/main/res/drawable/pass_nine_click.png b/app/src/main/res/drawable/pass_nine_click.png
new file mode 100644
index 0000000..0aec332
--- /dev/null
+++ b/app/src/main/res/drawable/pass_nine_click.png
Binary files differ
diff --git a/app/src/main/res/drawable/pass_nine_normal.png b/app/src/main/res/drawable/pass_nine_normal.png
new file mode 100644
index 0000000..76f2f37
--- /dev/null
+++ b/app/src/main/res/drawable/pass_nine_normal.png
Binary files differ
diff --git a/app/src/main/res/drawable/pass_one_click.png b/app/src/main/res/drawable/pass_one_click.png
new file mode 100644
index 0000000..6dd704f
--- /dev/null
+++ b/app/src/main/res/drawable/pass_one_click.png
Binary files differ
diff --git a/app/src/main/res/drawable/pass_one_normal.png b/app/src/main/res/drawable/pass_one_normal.png
new file mode 100644
index 0000000..ac0beaa
--- /dev/null
+++ b/app/src/main/res/drawable/pass_one_normal.png
Binary files differ
diff --git a/app/src/main/res/drawable/pass_seven_click.png b/app/src/main/res/drawable/pass_seven_click.png
new file mode 100644
index 0000000..b685327
--- /dev/null
+++ b/app/src/main/res/drawable/pass_seven_click.png
Binary files differ
diff --git a/app/src/main/res/drawable/pass_seven_normal.png b/app/src/main/res/drawable/pass_seven_normal.png
new file mode 100644
index 0000000..a1431b1
--- /dev/null
+++ b/app/src/main/res/drawable/pass_seven_normal.png
Binary files differ
diff --git a/app/src/main/res/drawable/pass_six_click.png b/app/src/main/res/drawable/pass_six_click.png
new file mode 100644
index 0000000..c8501e2
--- /dev/null
+++ b/app/src/main/res/drawable/pass_six_click.png
Binary files differ
diff --git a/app/src/main/res/drawable/pass_six_normal.png b/app/src/main/res/drawable/pass_six_normal.png
new file mode 100644
index 0000000..f4df1ff
--- /dev/null
+++ b/app/src/main/res/drawable/pass_six_normal.png
Binary files differ
diff --git a/app/src/main/res/drawable/pass_three_click.png b/app/src/main/res/drawable/pass_three_click.png
new file mode 100644
index 0000000..55959a7
--- /dev/null
+++ b/app/src/main/res/drawable/pass_three_click.png
Binary files differ
diff --git a/app/src/main/res/drawable/pass_three_normal.png b/app/src/main/res/drawable/pass_three_normal.png
new file mode 100644
index 0000000..5a76454
--- /dev/null
+++ b/app/src/main/res/drawable/pass_three_normal.png
Binary files differ
diff --git a/app/src/main/res/drawable/pass_two_click.png b/app/src/main/res/drawable/pass_two_click.png
new file mode 100644
index 0000000..ba99d1d
--- /dev/null
+++ b/app/src/main/res/drawable/pass_two_click.png
Binary files differ
diff --git a/app/src/main/res/drawable/pass_two_normal.png b/app/src/main/res/drawable/pass_two_normal.png
new file mode 100644
index 0000000..1a1e6e3
--- /dev/null
+++ b/app/src/main/res/drawable/pass_two_normal.png
Binary files differ
diff --git a/app/src/main/res/drawable/pass_zero_click.png b/app/src/main/res/drawable/pass_zero_click.png
new file mode 100644
index 0000000..2e72719
--- /dev/null
+++ b/app/src/main/res/drawable/pass_zero_click.png
Binary files differ
diff --git a/app/src/main/res/drawable/pass_zero_normal.png b/app/src/main/res/drawable/pass_zero_normal.png
new file mode 100644
index 0000000..7463c4a
--- /dev/null
+++ b/app/src/main/res/drawable/pass_zero_normal.png
Binary files differ
diff --git a/app/src/main/res/drawable/passwd_invisiable.png b/app/src/main/res/drawable/passwd_invisiable.png
new file mode 100644
index 0000000..4214985
--- /dev/null
+++ b/app/src/main/res/drawable/passwd_invisiable.png
Binary files differ
diff --git a/app/src/main/res/drawable/passwd_visiable.png b/app/src/main/res/drawable/passwd_visiable.png
new file mode 100644
index 0000000..ba78e03
--- /dev/null
+++ b/app/src/main/res/drawable/passwd_visiable.png
Binary files differ
diff --git a/app/src/main/res/drawable/password_pwd_frame.png b/app/src/main/res/drawable/password_pwd_frame.png
new file mode 100644
index 0000000..52bfc7b
--- /dev/null
+++ b/app/src/main/res/drawable/password_pwd_frame.png
Binary files differ
diff --git a/app/src/main/res/drawable/qr_none320.png b/app/src/main/res/drawable/qr_none320.png
new file mode 100644
index 0000000..99b9039
--- /dev/null
+++ b/app/src/main/res/drawable/qr_none320.png
Binary files differ
diff --git a/app/src/main/res/drawable/qrcode.jpg b/app/src/main/res/drawable/qrcode.jpg
new file mode 100644
index 0000000..a547462
--- /dev/null
+++ b/app/src/main/res/drawable/qrcode.jpg
Binary files differ
diff --git a/app/src/main/res/drawable/qrcode_bg.xml b/app/src/main/res/drawable/qrcode_bg.xml
new file mode 100644
index 0000000..bfb1ecf
--- /dev/null
+++ b/app/src/main/res/drawable/qrcode_bg.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/white"/>
+    <corners android:topLeftRadius="10dp"
+        android:bottomLeftRadius="10dp"
+        android:bottomRightRadius="10dp"
+        android:topRightRadius="10dp"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/select_bg_blue.xml b/app/src/main/res/drawable/select_bg_blue.xml
new file mode 100644
index 0000000..b0fa5bb
--- /dev/null
+++ b/app/src/main/res/drawable/select_bg_blue.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/corner_bg_gray_focus" android:state_selected="true"/>
+    <item android:drawable="@drawable/corner_bg_gray_focus" android:state_pressed="true"/>
+    <item android:drawable="@drawable/bg_all_lightblue2"/>
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/select_bg_keyboard.xml b/app/src/main/res/drawable/select_bg_keyboard.xml
new file mode 100644
index 0000000..83ae4c5
--- /dev/null
+++ b/app/src/main/res/drawable/select_bg_keyboard.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/corner_bg_keyboard_normal" android:state_selected="true"/>
+    <item android:drawable="@drawable/corner_bg_keyboard_normal" android:state_pressed="true"/>
+    <item android:drawable="@drawable/corner_bg_keyboard_focus"/>
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/select_bg_red.xml b/app/src/main/res/drawable/select_bg_red.xml
new file mode 100644
index 0000000..1544e07
--- /dev/null
+++ b/app/src/main/res/drawable/select_bg_red.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/corner_bg_gray_focus" android:state_selected="true"/>
+    <item android:drawable="@drawable/corner_bg_gray_focus" android:state_pressed="true"/>
+    <item android:drawable="@drawable/corner_bg_red_normal"/>
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/sw_toast.xml b/app/src/main/res/drawable/sw_toast.xml
new file mode 100644
index 0000000..bdc5081
--- /dev/null
+++ b/app/src/main/res/drawable/sw_toast.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:background="@drawable/corner_bg"
+              android:gravity="center"
+              android:orientation="horizontal"
+              android:padding="5dp">
+
+    <ImageView
+        android:id="@+id/pic_cry"
+        android:layout_width="60dp"
+        android:layout_height="60dp"
+        android:layout_gravity="center"
+        android:scaleType="fitXY"
+        android:src="@drawable/toast_cry"
+        android:visibility="gone"/>
+
+    <ImageView
+        android:id="@+id/pic_smile"
+        android:layout_width="60dp"
+        android:layout_height="60dp"
+        android:layout_gravity="center"
+        android:scaleType="fitXY"
+        android:src="@drawable/toast_smile"/>
+
+    <ImageView
+        android:id="@+id/pic_doubt"
+        android:layout_width="60dp"
+        android:layout_height="60dp"
+        android:layout_gravity="center"
+        android:scaleType="fitXY"
+        android:src="@drawable/toast_doubt"
+        android:visibility="gone"/>
+
+    <TextView
+        android:id="@+id/toasttext"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="链路检测失败"
+        android:textColor="@color/black"
+        android:textSize="45dp"
+        android:textStyle="bold"/>
+</LinearLayout>
diff --git a/app/src/main/res/drawable/toast_cry.jpg b/app/src/main/res/drawable/toast_cry.jpg
new file mode 100644
index 0000000..6c54f93
--- /dev/null
+++ b/app/src/main/res/drawable/toast_cry.jpg
Binary files differ
diff --git a/app/src/main/res/drawable/toast_doubt.jpg b/app/src/main/res/drawable/toast_doubt.jpg
new file mode 100644
index 0000000..1ed3097
--- /dev/null
+++ b/app/src/main/res/drawable/toast_doubt.jpg
Binary files differ
diff --git a/app/src/main/res/drawable/toast_smile.jpg b/app/src/main/res/drawable/toast_smile.jpg
new file mode 100644
index 0000000..b74ff81
--- /dev/null
+++ b/app/src/main/res/drawable/toast_smile.jpg
Binary files differ
diff --git a/app/src/main/res/drawable/top_bar_selector.xml b/app/src/main/res/drawable/top_bar_selector.xml
new file mode 100644
index 0000000..ddcf5f6
--- /dev/null
+++ b/app/src/main/res/drawable/top_bar_selector.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="@android:color/white" android:state_enabled="true" android:state_focused="true" android:state_pressed="false"></item>
+    <item android:color="@color/light_gray" android:state_enabled="true" android:state_selected="true"></item>
+    <item android:color="@color/light_gray" android:state_enabled="true" android:state_pressed="true"></item>
+    <item android:color="@android:color/white" android:state_enabled="true" android:state_pressed="false"></item>
+</selector>
diff --git a/app/src/main/res/drawable/wireless_off.png b/app/src/main/res/drawable/wireless_off.png
new file mode 100644
index 0000000..c9e117e
--- /dev/null
+++ b/app/src/main/res/drawable/wireless_off.png
Binary files differ
diff --git a/app/src/main/res/drawable/wireless_on.png b/app/src/main/res/drawable/wireless_on.png
new file mode 100644
index 0000000..61a9506
--- /dev/null
+++ b/app/src/main/res/drawable/wireless_on.png
Binary files differ
diff --git a/app/src/main/res/layout/activity_checkdetail.xml b/app/src/main/res/layout/activity_checkdetail.xml
new file mode 100644
index 0000000..697314e
--- /dev/null
+++ b/app/src/main/res/layout/activity_checkdetail.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:background="@color/black"
+    android:layout_width="match_parent"
+    android:padding="20dp"
+    android:layout_height="match_parent">
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:background="@drawable/bg_corner_all_dark">
+        <LinearLayout
+            android:id="@+id/tablehead"
+            android:layout_width="match_parent"
+            android:layout_height="48dp"
+            android:orientation="horizontal" >
+            <TextView
+                android:id="@+id/table_head1"
+                android:layout_width="@dimen/item1_width"
+                android:layout_height="match_parent"
+                android:textSize="@dimen/class_title_size"
+                android:textColor="@color/main_blue1"
+                android:text="姓名"
+                android:gravity="center"/>
+
+            <TextView
+                android:id="@+id/table_head2"
+                android:layout_width="@dimen/item2_width"
+                android:layout_height="match_parent"
+                android:textSize="@dimen/class_title_size"
+                android:text="人员类别"
+                android:textColor="@color/main_blue1"
+                android:gravity="center"/>
+
+            <TextView
+                android:id="@+id/table_head3"
+                android:layout_width="@dimen/item3_width"
+                android:layout_height="match_parent"
+                android:textSize="@dimen/class_title_size"
+                android:text="部门"
+                android:textColor="@color/main_blue1"
+                android:gravity="center"/>
+
+            <TextView
+                android:id="@+id/table_head4"
+                android:layout_width="@dimen/item4_width"
+                android:layout_height="match_parent"
+                android:textSize="@dimen/class_title_size"
+                android:text="签到日期"
+                android:textColor="@color/main_blue1"
+                android:gravity="center"/>
+
+            <TextView
+                android:id="@+id/table_head5"
+                android:layout_width="@dimen/item5_width"
+                android:layout_height="match_parent"
+                android:textSize="@dimen/class_title_size"
+                android:text="签到时间"
+                android:textColor="@color/main_blue1"
+                android:gravity="center"/>
+
+            <TextView
+                android:id="@+id/table_head6"
+                android:layout_width="@dimen/item6_width"
+                android:layout_height="match_parent"
+                android:textSize="@dimen/class_title_size"
+                android:text="签到状态"
+                android:textColor="@color/main_blue1"
+                android:gravity="center"/>
+        </LinearLayout>
+
+        <TextView
+            android:id="@+id/vmsg"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="正在查询，请稍等"
+            android:layout_marginTop="5dp"
+            android:textColor="@color/orignRed"
+            android:textSize="30sp"
+            android:layout_gravity="center"
+            android:visibility="gone"/>
+
+        <ListView
+            android:id="@+id/check_list"
+            android:layout_width="match_parent"
+            android:layout_height="510dp"
+            android:layout_marginTop="10dp"
+            android:divider="@color/main_divide_line"
+            android:dividerHeight="2dp" />
+
+        <TextView
+            android:id="@+id/back_btn"
+            android:layout_width="240dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"
+            android:background="@drawable/select_bg_red"
+            android:layout_gravity="center"
+            android:gravity="center"
+            android:padding="5dp"
+            android:textColor="@color/light_gray4"
+            android:text="返 回"
+            android:textSize="44sp" />
+
+    </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_conference.xml b/app/src/main/res/layout/activity_conference.xml
new file mode 100644
index 0000000..1d5d51c
--- /dev/null
+++ b/app/src/main/res/layout/activity_conference.xml
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:background="@color/black"
+    android:layout_width="match_parent"
+    android:padding="20dp"
+    android:layout_height="match_parent">
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:background="@drawable/bg_corner_all_dark">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:layout_marginLeft="80dp"
+                android:gravity="center"
+                android:textSize="50sp"
+                android:text="会议日期"/>
+            <DatePicker
+                android:id="@+id/date"
+                android:layout_marginLeft="15dp"
+                android:layout_width="300dp"
+                android:layout_height="160dp"
+                android:layout_gravity="center"/>
+            <TextView
+                android:id="@+id/query"
+                android:layout_width="240dp"
+                android:layout_height="wrap_content"
+                android:background="@drawable/select_bg_red"
+                android:layout_gravity="center"
+                android:gravity="center"
+                android:layout_marginLeft="15dp"
+                android:padding="9dp"
+                android:textColor="@color/light_gray4"
+                android:text="查  询"
+                android:textSize="45sp" />
+        </LinearLayout>
+
+
+        <LinearLayout
+            android:id="@+id/tablehead"
+            android:layout_width="match_parent"
+            android:layout_height="48dp"
+            android:orientation="horizontal" >
+            <TextView
+                android:id="@+id/table_head1"
+                android:layout_width="@dimen/c_item1_width"
+                android:layout_height="match_parent"
+                android:textSize="@dimen/conference_title_size"
+                android:textColor="@color/main_blue1"
+                android:text="会议名称"
+                android:gravity="center"/>
+
+            <TextView
+                android:id="@+id/table_head2"
+                android:layout_width="@dimen/c_item2_width"
+                android:layout_height="match_parent"
+                android:textSize="@dimen/conference_title_size"
+                android:text="会议日期"
+                android:textColor="@color/main_blue1"
+                android:gravity="center"/>
+
+            <TextView
+                android:id="@+id/table_head3"
+                android:layout_width="@dimen/c_item3_width"
+                android:layout_height="match_parent"
+                android:textSize="@dimen/conference_title_size"
+                android:text="会议时间"
+                android:textColor="@color/main_blue1"
+                android:gravity="center"/>
+
+            <TextView
+                android:id="@+id/table_head4"
+                android:layout_width="@dimen/c_item4_width"
+                android:layout_height="match_parent"
+                android:textSize="@dimen/conference_title_size"
+                android:text="签到时间"
+                android:textColor="@color/main_blue1"
+                android:gravity="center"/>
+
+            <TextView
+                android:id="@+id/table_head5"
+                android:layout_width="@dimen/c_item5_width"
+                android:layout_height="match_parent"
+                android:textSize="@dimen/conference_title_size"
+                android:text="会议地点"
+                android:textColor="@color/main_blue1"
+                android:gravity="center"/>
+
+            <TextView
+                android:id="@+id/table_head6"
+                android:layout_width="@dimen/c_item6_width"
+                android:layout_height="match_parent"
+                android:textSize="@dimen/conference_title_size"
+                android:text="会议类型"
+                android:textColor="@color/main_blue1"
+                android:gravity="center"/>
+        </LinearLayout>
+
+        <ListView
+            android:id="@+id/conference_list"
+            android:layout_width="match_parent"
+            android:layout_height="300dp"
+            android:layout_marginTop="10dp"
+            android:divider="@color/main_divide_line"
+            android:dividerHeight="2dp" />
+
+        <TextView
+            android:id="@+id/back_btn"
+            android:layout_width="240dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"
+            android:background="@drawable/select_bg_red"
+            android:layout_gravity="center"
+            android:gravity="center"
+            android:padding="5dp"
+            android:textColor="@color/light_gray4"
+            android:text="返 回"
+            android:textSize="44sp" />
+
+    </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_config.xml b/app/src/main/res/layout/activity_config.xml
new file mode 100644
index 0000000..a31146d
--- /dev/null
+++ b/app/src/main/res/layout/activity_config.xml
@@ -0,0 +1,119 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:background="@color/light_blue2"
+    tools:context="com.supwisdom.conferencecheck.activity.ConfigActivity">
+    <!--终端编号输入界面-->
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_margin="20dp"
+        android:background="@drawable/corner_bg_white"
+        android:gravity="center_horizontal"
+        android:orientation="vertical">
+        <!--标题-->
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"
+            android:gravity="center"
+            android:text="请填写以下信息"
+            android:textColor="@color/light_blue2"
+            android:textSize="35sp" />
+
+        <ScrollView
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:scrollbars="none">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical"
+                android:padding="10dp">
+
+                <TextView
+                    style="@style/init_param_name_style"
+                    android:text="终端物理ID" />
+
+                <EditText
+                    android:id="@+id/tv_devphyid"
+                    style="@style/init_param_name_style"
+                    android:inputType="text"
+                    android:maxLength="12"
+                    android:text="12345678ABCD" />
+
+                <TextView
+                    style="@style/init_param_name_style"
+                    android:text="服务器IP" />
+
+                <EditText
+                    android:id="@+id/tv_server_ip"
+                    style="@style/init_param_name_style"
+                    android:text="127.0.0.1" />
+
+                <TextView
+                    style="@style/init_param_name_style"
+                    android:text="服务器URI" />
+
+                <EditText
+                    android:id="@+id/tv_uri_root"
+                    style="@style/init_param_name_style"
+                    android:maxLines="1"
+                    android:text="door" />
+
+
+                <TextView
+                    style="@style/init_param_name_style"
+                    android:text="服务器PORT" />
+
+                <EditText
+                    android:id="@+id/tv_server_port"
+                    style="@style/init_param_name_style"
+                    android:inputType="numberDecimal"
+                    android:maxLength="5"
+                    android:maxLines="1"
+                    android:text="8080" />
+
+                <TextView
+                    android:id="@+id/tv_msg"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="5dp"
+                    android:textSize="35sp"
+                    android:gravity="center"
+                    android:textColor="@color/cl_red"/>
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="20dp"
+                    android:orientation="horizontal">
+                    <TextView
+                        android:id="@+id/btn_save"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:background="@drawable/select_bg_keyboard"
+                        android:layout_marginLeft="500dp"
+                        android:padding="10dp"
+                        android:text="保 存"
+                        android:textColor="@color/light_blue2"
+                        android:textSize="40sp" />
+
+                    <TextView
+                        android:id="@+id/btn_set"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="20dp"
+                        android:padding="10dp"
+                        android:background="@drawable/select_bg_keyboard"
+                        android:text="进入系统设置"
+                        android:textColor="@color/light_blue2"
+                        android:textSize="40sp" />
+                </LinearLayout>
+
+            </LinearLayout>
+        </ScrollView>
+    </LinearLayout>
+</LinearLayout>
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..c7d7335
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,418 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:background="@color/dark_blue"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:padding="10dp"
+        android:orientation="horizontal">
+
+        <LinearLayout
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="3"
+            android:orientation="vertical">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_weight="1"
+                android:background="@drawable/bg_all_lightblue2">
+                <LinearLayout
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:gravity="center"
+                    android:orientation="horizontal">
+                    <TextView
+                        android:id="@+id/tip"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="会 议 信 息"
+                        android:textColor="@color/white"
+                        android:textSize="60sp"
+                        android:layout_marginLeft="240dp"
+                        android:textStyle="bold"/>
+                    <ImageView
+                        android:id="@+id/linklogo"
+                        android:layout_width="40dp"
+                        android:layout_height="40dp"
+                        android:layout_marginLeft="130dp"
+                        android:src="@drawable/wireless_on" />
+
+                    <TextView
+                        android:id="@+id/linkstat"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:maxLines="1"
+                        android:text="已联网"
+                        android:layout_marginLeft="5dp"
+                        android:textColor="@color/main_blue1"
+                        android:textSize="28sp" />
+                </LinearLayout>
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_weight="3"
+                android:layout_marginTop="10dp"
+                android:orientation="vertical"
+                android:background="@drawable/bg_all_lightblue">
+                <TextView
+                    android:id="@+id/conference_name"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:gravity="center"
+                    android:textColor="@color/white"
+                    android:textSize="45sp"
+                    android:layout_marginTop="20dp"
+                    android:textStyle="bold"
+                    android:text=""/>
+                <TextView
+                    android:id="@+id/conference_time"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:gravity="center"
+                    android:textColor="@color/white"
+                    android:textSize="38sp"
+                    android:layout_marginTop="18dp"
+                    android:text=""/>
+                <TextView
+                    android:id="@+id/conference_addr"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:gravity="center"
+                    android:layout_marginTop="6dp"
+                    android:textColor="@color/white"
+                    android:textSize="38sp"
+                    android:text=""/>
+                <TextView
+                    android:id="@+id/conference_signtime"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:gravity="center"
+                    android:textColor="@color/white"
+                    android:textSize="38sp"
+                    android:layout_marginTop="6dp"
+                    android:text=""/>
+                <TextView
+                    android:id="@+id/conference_type"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:gravity="center"
+                    android:textColor="@color/white"
+                    android:textSize="38sp"
+                    android:layout_marginTop="6dp"
+                    android:text=""/>
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_weight="2"
+                android:layout_marginTop="10dp"
+                android:orientation="horizontal">
+
+                <LinearLayout
+                    android:layout_width="0dip"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:orientation="vertical">
+                    <RelativeLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent">
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="match_parent">
+                            <WebView
+                                android:id="@+id/webview_1"
+                                android:layout_width="match_parent"
+                                android:layout_height="match_parent">
+                            </WebView>
+                        </LinearLayout>
+                        <WebView
+                            android:id="@+id/webview_top_1"
+                            android:layout_width="match_parent"
+                            android:layout_height="75dp"
+                            android:layout_alignParentBottom="true"
+                            android:layout_centerInParent="true">
+                        </WebView>
+                    </RelativeLayout>
+                </LinearLayout>
+
+                <LinearLayout
+                    android:layout_width="0dip"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:layout_marginLeft="2dp"
+                    android:orientation="vertical">
+                    <RelativeLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent">
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="match_parent">
+                            <WebView
+                                android:id="@+id/webview_2"
+                                android:layout_width="match_parent"
+                                android:layout_height="match_parent">
+                            </WebView>
+                        </LinearLayout>
+                        <WebView
+                            android:id="@+id/webview_top_2"
+                            android:layout_width="match_parent"
+                            android:layout_height="75dp"
+                            android:layout_alignParentBottom="true"
+                            android:layout_centerInParent="true">
+                        </WebView>
+                    </RelativeLayout>
+                </LinearLayout>
+
+                <LinearLayout
+                    android:layout_width="0dip"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:layout_marginLeft="2dp"
+                    android:orientation="vertical">
+                    <RelativeLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent">
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="match_parent">
+                            <WebView
+                                android:id="@+id/webview_3"
+                                android:layout_width="match_parent"
+                                android:layout_height="match_parent">
+                            </WebView>
+                        </LinearLayout>
+                        <WebView
+                            android:id="@+id/webview_top_3"
+                            android:layout_width="match_parent"
+                            android:layout_height="75dp"
+                            android:layout_alignParentBottom="true"
+                            android:layout_centerInParent="true">
+                        </WebView>
+                    </RelativeLayout>
+                </LinearLayout>
+
+            </LinearLayout>
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="2"
+            android:layout_marginLeft="10dp"
+            android:orientation="vertical">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_weight="1"
+                android:orientation="horizontal">
+
+                <LinearLayout
+                    android:layout_width="0dip"
+                    android:layout_height="match_parent"
+                    android:layout_weight="2.5"
+                    android:background="@drawable/bg_left_lightblue2"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:id="@+id/week"
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:gravity="center"
+                        android:text=""
+                        android:textColor="@color/white"
+                        android:textSize="60sp" />
+
+                </LinearLayout>
+
+                <LinearLayout
+                    android:layout_width="0dip"
+                    android:layout_height="match_parent"
+                    android:layout_weight="3"
+                    android:layout_marginLeft="5dp"
+                    android:background="@drawable/bg_right_lightblue2"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:id="@+id/ymd"
+                        android:layout_width="match_parent"
+                        android:layout_height="0dip"
+                        android:layout_weight="1.5"
+                        android:gravity="center"
+                        android:textColor="@color/white"
+                        android:textSize="38sp"
+                        android:text=""/>
+
+                    <TextView
+                        android:id="@+id/hm"
+                        android:layout_width="match_parent"
+                        android:layout_height="0dip"
+                        android:layout_weight="2"
+                        android:gravity="center"
+                        android:textColor="@color/white"
+                        android:textSize="55sp"
+                        android:text=""/>
+
+                </LinearLayout>
+
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_weight="3"
+                android:layout_marginTop="10dp"
+                android:orientation="vertical"
+                android:background="@drawable/bg_all_darkred">
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="联网状态下每分钟更新一次"
+                    android:textColor="@color/gray_1"
+                    android:layout_marginLeft="10dp"
+                    android:layout_marginTop="5dp"
+                    android:textSize="25sp" />
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="10dp"
+                    android:layout_marginLeft="35dp"
+                    android:orientation="horizontal">
+
+                    <TextView
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1"
+                        android:text="应到人数："
+                        android:textColor="@color/light_gray4"
+                        android:textSize="45sp" />
+                    <TextView
+                        android:id="@+id/yd"
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1"
+                        android:textColor="@color/light_gray4"
+                        android:text=""
+                        android:textStyle="bold"
+                        android:textSize="45sp" />
+                </LinearLayout>
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="35dp"
+                    android:orientation="horizontal">
+                    <TextView
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1"
+                        android:text="实到人数："
+                        android:textColor="@color/light_gray4"
+                        android:textSize="45sp" />
+                    <TextView
+                        android:id="@+id/sd"
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1"
+                        android:textColor="@color/light_gray4"
+                        android:text=""
+                        android:textStyle="bold"
+                        android:textSize="45sp" />
+                </LinearLayout>
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="35dp"
+                    android:orientation="horizontal">
+                    <TextView
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1"
+                        android:text="到  会  率："
+                        android:textColor="@color/light_gray4"
+                        android:textSize="45sp" />
+                    <TextView
+                        android:id="@+id/rate"
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1"
+                        android:textColor="@color/light_gray4"
+                        android:text=""
+                        android:textStyle="bold"
+                        android:textSize="45sp" />
+                </LinearLayout>
+
+                <TextView
+                    android:id="@+id/detail"
+                    android:layout_width="233dp"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginTop="20dp"
+                    android:background="@drawable/select_bg_blue"
+                    android:gravity="center"
+                    android:padding="5dp"
+                    android:text="签到详情"
+                    android:textColor="@color/white"
+                    android:textSize="44sp" />
+
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_weight="2"
+                android:layout_marginTop="10dp"
+                android:background="@drawable/bg_all_lightred">
+
+                <LinearLayout
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginLeft="30dp"
+                    android:orientation="horizontal">
+
+                    <TextView
+                        android:id="@+id/qrcodehint"
+                        android:layout_width="250dp"
+                        android:layout_height="wrap_content"
+                        android:text="请扫描右侧会议码进行签到"
+                        android:textColor="@color/white"
+                        android:layout_gravity="center"
+                        android:textSize="40sp"/>
+
+                    <LinearLayout
+                        android:layout_width="220dp"
+                        android:layout_height="220dp"
+                        android:orientation="vertical"
+                        android:gravity="center"
+                        android:layout_marginLeft="8dp"
+                        android:background="@drawable/qrcode_bg">
+
+                        <ImageView
+                            android:id="@+id/vqrcode"
+                            android:layout_width="250dp"
+                            android:layout_height="250dp"
+                            android:scaleType="fitXY"
+                            android:src="@drawable/qr_none320" />
+
+                    </LinearLayout>
+
+                </LinearLayout>
+
+            </LinearLayout>
+
+        </LinearLayout>
+
+    </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main_old.xml b/app/src/main/res/layout/activity_main_old.xml
new file mode 100644
index 0000000..97c29b3
--- /dev/null
+++ b/app/src/main/res/layout/activity_main_old.xml
@@ -0,0 +1,409 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:background="@color/black"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:padding="10dp"
+        android:orientation="horizontal">
+
+        <LinearLayout
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="3"
+            android:orientation="vertical">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_weight="1"
+                android:background="@drawable/bg_corner_top_blue">
+                <LinearLayout
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:gravity="center"
+                    android:orientation="horizontal">
+                    <TextView
+                        android:id="@+id/tip"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="会 议 信 息"
+                        android:textColor="@color/gray_1"
+                        android:textSize="60sp"
+                        android:layout_marginLeft="240dp"
+                        android:textStyle="bold"/>
+                    <ImageView
+                        android:id="@+id/linklogo"
+                        android:layout_width="40dp"
+                        android:layout_height="40dp"
+                        android:layout_marginLeft="130dp"
+                        android:src="@drawable/wireless_on" />
+
+                    <TextView
+                        android:id="@+id/linkstat"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:maxLines="1"
+                        android:text="已联网"
+                        android:layout_marginLeft="5dp"
+                        android:textColor="@color/main_blue1"
+                        android:textSize="28sp" />
+                </LinearLayout>
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_weight="3"
+                android:layout_marginTop="10dp"
+                android:orientation="vertical"
+                android:background="@drawable/bg_corner_all_dark">
+                <TextView
+                    android:id="@+id/conference_name"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:gravity="center"
+                    android:textColor="@color/main_blue1"
+                    android:textSize="45sp"
+                    android:layout_marginTop="20dp"
+                    android:textStyle="bold"
+                    android:text=""/>
+                <TextView
+                    android:id="@+id/conference_time"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:gravity="center"
+                    android:textColor="@color/main_blue1"
+                    android:textSize="38sp"
+                    android:layout_marginTop="18dp"
+                    android:text=""/>
+                <TextView
+                    android:id="@+id/conference_addr"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:gravity="center"
+                    android:layout_marginTop="6dp"
+                    android:textColor="@color/main_blue1"
+                    android:textSize="38sp"
+                    android:text=""/>
+                <TextView
+                    android:id="@+id/conference_signtime"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:gravity="center"
+                    android:textColor="@color/main_blue1"
+                    android:textSize="38sp"
+                    android:layout_marginTop="6dp"
+                    android:text=""/>
+                <TextView
+                    android:id="@+id/conference_type"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:gravity="center"
+                    android:textColor="@color/main_blue1"
+                    android:textSize="38sp"
+                    android:layout_marginTop="6dp"
+                    android:text=""/>
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_weight="2"
+                android:layout_marginTop="10dp"
+                android:orientation="horizontal">
+
+                <LinearLayout
+                    android:layout_width="0dip"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:orientation="vertical">
+                    <RelativeLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent">
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="match_parent">
+                            <WebView
+                                android:id="@+id/webview_1"
+                                android:layout_width="match_parent"
+                                android:layout_height="match_parent">
+                            </WebView>
+                        </LinearLayout>
+                        <WebView
+                            android:id="@+id/webview_top_1"
+                            android:layout_width="match_parent"
+                            android:layout_height="75dp"
+                            android:layout_alignParentBottom="true"
+                            android:layout_centerInParent="true">
+                        </WebView>
+                    </RelativeLayout>
+                </LinearLayout>
+
+                <LinearLayout
+                    android:layout_width="0dip"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:layout_marginLeft="2dp"
+                    android:orientation="vertical">
+                    <RelativeLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent">
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="match_parent">
+                            <WebView
+                                android:id="@+id/webview_2"
+                                android:layout_width="match_parent"
+                                android:layout_height="match_parent">
+                            </WebView>
+                        </LinearLayout>
+                        <WebView
+                            android:id="@+id/webview_top_2"
+                            android:layout_width="match_parent"
+                            android:layout_height="75dp"
+                            android:layout_alignParentBottom="true"
+                            android:layout_centerInParent="true">
+                        </WebView>
+                    </RelativeLayout>
+                </LinearLayout>
+
+                <LinearLayout
+                    android:layout_width="0dip"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:layout_marginLeft="2dp"
+                    android:orientation="vertical">
+                    <RelativeLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent">
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="match_parent">
+                            <WebView
+                                android:id="@+id/webview_3"
+                                android:layout_width="match_parent"
+                                android:layout_height="match_parent">
+                            </WebView>
+                        </LinearLayout>
+                        <WebView
+                            android:id="@+id/webview_top_3"
+                            android:layout_width="match_parent"
+                            android:layout_height="75dp"
+                            android:layout_alignParentBottom="true"
+                            android:layout_centerInParent="true">
+                        </WebView>
+                    </RelativeLayout>
+                </LinearLayout>
+
+            </LinearLayout>
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="2"
+            android:layout_marginLeft="10dp"
+            android:orientation="vertical">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_weight="1"
+                android:orientation="horizontal">
+
+                <LinearLayout
+                    android:layout_width="0dip"
+                    android:layout_height="match_parent"
+                    android:layout_weight="2.5"
+                    android:background="@drawable/corner_blue_left"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:id="@+id/week"
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:gravity="center"
+                        android:textColor="@color/black"
+                        android:textSize="60sp"
+                        android:text=""/>
+
+                </LinearLayout>
+
+                <LinearLayout
+                    android:layout_width="0dip"
+                    android:layout_height="match_parent"
+                    android:layout_weight="3"
+                    android:layout_marginLeft="5dp"
+                    android:background="@drawable/corner_blue_right"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:id="@+id/ymd"
+                        android:layout_width="match_parent"
+                        android:layout_height="0dip"
+                        android:layout_weight="1.5"
+                        android:gravity="center"
+                        android:textColor="@color/black"
+                        android:textSize="38sp"
+                        android:text=""/>
+
+                    <TextView
+                        android:id="@+id/hm"
+                        android:layout_width="match_parent"
+                        android:layout_height="0dip"
+                        android:layout_weight="2"
+                        android:gravity="center"
+                        android:textColor="@color/black"
+                        android:textSize="55sp"
+                        android:text=""/>
+
+                </LinearLayout>
+
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_weight="3"
+                android:layout_marginTop="10dp"
+                android:orientation="vertical"
+                android:background="@drawable/bg_corner_all_dark">
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="联网状态下每分钟更新一次"
+                    android:textColor="@color/main_blue1"
+                    android:layout_marginLeft="10dp"
+                    android:textSize="30sp" />
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="10dp"
+                    android:layout_marginLeft="35dp"
+                    android:orientation="horizontal">
+
+                    <TextView
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1"
+                        android:text="应到人数："
+                        android:textColor="@color/gray_1"
+                        android:textSize="45sp" />
+                    <TextView
+                        android:id="@+id/yd"
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1"
+                        android:textColor="@color/yellow_1"
+                        android:text=""
+                        android:textStyle="bold"
+                        android:textSize="45sp" />
+                </LinearLayout>
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="35dp"
+                    android:orientation="horizontal">
+                    <TextView
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1"
+                        android:text="实到人数："
+                        android:textColor="@color/gray_1"
+                        android:textSize="45sp" />
+                    <TextView
+                        android:id="@+id/sd"
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1"
+                        android:textColor="@color/yellow_1"
+                        android:text=""
+                        android:textStyle="bold"
+                        android:textSize="45sp" />
+                </LinearLayout>
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="35dp"
+                    android:orientation="horizontal">
+                    <TextView
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1"
+                        android:text="到  会  率："
+                        android:textColor="@color/gray_1"
+                        android:textSize="45sp" />
+                    <TextView
+                        android:id="@+id/rate"
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1"
+                        android:textColor="@color/yellow_1"
+                        android:text=""
+                        android:textStyle="bold"
+                        android:textSize="45sp" />
+                </LinearLayout>
+
+                <TextView
+                    android:id="@+id/detail"
+                    android:layout_width="240dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="20dp"
+                    android:background="@drawable/select_bg_red"
+                    android:layout_gravity="center"
+                    android:gravity="center"
+                    android:padding="5dp"
+                    android:text="签到详情"
+                    android:textColor="@color/light_gray4"
+                    android:textSize="44sp" />
+
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_weight="2"
+                android:layout_marginTop="10dp"
+                android:background="@drawable/corner_bg_white">
+
+                <LinearLayout
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginLeft="30dp"
+                    android:orientation="horizontal">
+
+                    <TextView
+                        android:id="@+id/qrcodehint"
+                        android:layout_width="250dp"
+                        android:layout_height="wrap_content"
+                        android:text="请扫描右侧会议码进行签到"
+                        android:textColor="@color/gray_1"
+                        android:layout_gravity="center"
+                        android:textSize="40sp" />
+
+                    <ImageView
+                        android:id="@+id/vqrcode"
+                        android:layout_width="240dp"
+                        android:layout_height="240dp"
+                        android:layout_marginLeft="10dp"
+                        android:layout_gravity="center"
+                        android:scaleType="fitXY"
+                        android:src="@drawable/qr_none320" />
+
+                </LinearLayout>
+
+            </LinearLayout>
+
+        </LinearLayout>
+
+    </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_scanner_liner.xml b/app/src/main/res/layout/activity_scanner_liner.xml
new file mode 100644
index 0000000..3e41987
--- /dev/null
+++ b/app/src/main/res/layout/activity_scanner_liner.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<merge
+    android:id="@+id/scanner"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent">
+
+    <com.visionsmarts.pic2shop.view.ScannerLiveViewLiner
+        android:id="@+id/scanner_live_view"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"/>
+
+    <com.visionsmarts.pic2shop.view.ScannerOverlay
+        android:id="@+id/scanner_overlay"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"/>
+</merge>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_scanner_new.xml b/app/src/main/res/layout/activity_scanner_new.xml
new file mode 100644
index 0000000..3872b62
--- /dev/null
+++ b/app/src/main/res/layout/activity_scanner_new.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout android:id="@+id/capture_containter"
+                xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:background="@color/light_gray4">
+    <RelativeLayout
+        android:id="@+id/two_code_head"
+        android:layout_width="match_parent"
+        android:layout_height="55dp"
+        android:layout_alignParentTop="true"
+        android:background="@drawable/bg_corner_all_dark"
+        android:padding="4dp">
+
+        <TextView
+            android:id="@+id/back_btn"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerVertical="true"
+            android:layout_marginLeft="5dp"
+            android:drawableLeft="@drawable/iconfont_back"
+            android:gravity="center"
+            android:padding="6dp"
+            android:textColor="@drawable/top_bar_selector"
+            android:textSize="20sp"/>
+
+        <TextView
+            android:id="@+id/main_app_name"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerInParent="true"
+            android:text="请出示您的手机二维码进行签到"
+            android:textColor="@color/main_blue1"
+            android:textSize="35sp"/>
+
+        <TextView
+            android:id="@+id/timer"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentRight="true"
+            android:layout_centerVertical="true"
+            android:layout_marginRight="5dp"
+            android:gravity="center"
+            android:padding="6dp"
+            android:textColor="@drawable/top_bar_selector"
+            android:textSize="30sp"/>
+
+    </RelativeLayout>
+    <com.visionsmarts.pic2shop.view.ScannerLiveView
+        android:id="@+id/scanner_live_view"
+        android:layout_width="match_parent"
+        android:layout_height="595dp"
+        android:layout_below="@id/two_code_head"/>
+
+    <RelativeLayout
+        android:id="@+id/capture_crop_layout"
+        android:layout_width="400dp"
+        android:layout_height="400dp"
+        android:layout_centerInParent="true"
+        android:background="@drawable/capture"
+        android:contentDescription="@string/app_name"
+        >
+        <ImageView
+            android:id="@+id/capture_scan_line"
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:layout_margin="5dp"
+            android:background="@color/top_bar_theme_blue"
+            android:contentDescription="@string/app_name"/>
+    </RelativeLayout>
+
+    <TextView
+        android:id="@+id/conf_info"
+        android:layout_below="@id/scanner_live_view"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:gravity="center"
+        android:textSize="2sp"
+        android:text=""
+        android:textColor="@color/cl_red"/>
+
+    <TextView
+        android:id="@+id/exit"
+        android:layout_width="250dp"
+        android:layout_height="90dp"
+        android:layout_below="@id/conf_info"
+        android:background="@drawable/select_bg_red"
+        android:gravity="center"
+        android:layout_marginTop="5dp"
+        android:layout_centerInParent="true"
+        android:padding="2dp"
+        android:text="取  消"
+        android:textColor="@color/light_gray4"
+        android:textSize="45sp"
+        android:textStyle="bold" />
+</RelativeLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_set.xml b/app/src/main/res/layout/activity_set.xml
new file mode 100644
index 0000000..1796884
--- /dev/null
+++ b/app/src/main/res/layout/activity_set.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:background="@color/black"
+    tools:context="com.supwisdom.conferencecheck.activity.ManageActivity">
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:padding="20dp"
+            android:gravity="center_horizontal"
+            android:isScrollContainer="true"
+            android:orientation="vertical">
+
+            <TextView
+                android:id="@+id/set"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@drawable/bg_corner_all_dark"
+                android:gravity="center"
+                android:padding="5dp"
+                android:text="系统设置"
+                android:textColor="@color/main_blue1"
+                android:textSize="40sp"/>
+
+            <TextView
+                android:id="@+id/sync_msg"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="正在同步，请稍等..."
+                android:textSize="30sp"
+                android:textColor="@color/cl_red"
+                android:visibility="gone"/>
+
+            <TextView
+                android:id="@+id/syncconf"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@drawable/bg_corner_all_dark"
+                android:gravity="center"
+                android:layout_marginTop="20dp"
+                android:padding="5dp"
+                android:text="手工同步会议"
+                android:textColor="@color/main_blue1"
+                android:textSize="40sp"/>
+
+            <TextView
+                android:id="@+id/link_msg"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="正在签到，请稍等..."
+                android:textSize="30sp"
+                android:textColor="@color/cl_red"
+                android:visibility="gone"/>
+
+            <TextView
+                android:id="@+id/link"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@drawable/bg_corner_all_dark"
+                android:gravity="center"
+                android:layout_marginTop="20dp"
+                android:padding="5dp"
+                android:text="手工签到"
+                android:textColor="@color/main_blue1"
+                android:textSize="40sp"/>
+
+            <TextView
+                android:id="@+id/conference"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@drawable/bg_corner_all_dark"
+                android:gravity="center"
+                android:layout_marginTop="20dp"
+                android:padding="5dp"
+                android:text="本地会议查询"
+                android:textColor="@color/main_blue1"
+                android:textSize="40sp"/>
+
+            <TextView
+                android:id="@+id/exit"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@drawable/bg_corner_all_dark"
+                android:gravity="center"
+                android:layout_marginTop="20dp"
+                android:padding="5dp"
+                android:text="返         回"
+                android:textColor="@color/red_1"
+                android:textSize="40sp"/>
+
+        </LinearLayout>
+    </ScrollView>
+</LinearLayout>
diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml
new file mode 100644
index 0000000..c89c3e3
--- /dev/null
+++ b/app/src/main/res/layout/activity_splash.xml
@@ -0,0 +1,48 @@
+<!--
+android:gravity是对元素本身说的，元素本身的文本显示在什么地方靠着换个属性设置，不过不设置默认是在左侧的。
+android:layout_gravity是相对与它的父元素说的，说明元素显示在父元素的什么位置
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/LinearLayout01"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:background="@color/light_blue2"
+    android:orientation="vertical">
+    <!--
+    android:scaleType是控制图片如何resized/moved来匹对ImageView的size
+    CENTER_INSIDE / centerInside  将图片的内容完整居中显示，通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
+    -->
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_margin="20dp"
+        android:background="@drawable/corner_bg_white"
+        android:gravity="center|center"
+        android:orientation="vertical">
+
+        <ImageView
+            android:id="@+id/wordpress_logo"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:scaleType="centerInside"
+            android:src="@drawable/app_logo"></ImageView>
+        <!--
+        android:typeface 字体风格
+        -->
+        <TextView
+            android:id="@+id/versionNumber"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="20dip"
+            android:gravity="bottom"
+            android:shadowColor="#FFFFFF"
+            android:shadowDx="0"
+            android:shadowDy="2"
+            android:shadowRadius="1"
+            android:text="0.0.0"
+            android:textColor="@color/pos_theme_color"
+            android:textSize="@dimen/main_caption_size"
+            android:typeface="serif" />
+    </LinearLayout>
+</LinearLayout>
diff --git a/app/src/main/res/layout/dialog_passwd.xml b/app/src/main/res/layout/dialog_passwd.xml
new file mode 100644
index 0000000..e8967e0
--- /dev/null
+++ b/app/src/main/res/layout/dialog_passwd.xml
@@ -0,0 +1,272 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/ll_float_password"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@drawable/order_btn_purchase"
+        android:orientation="vertical">
+        <!--上半部分-->
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center_horizontal"
+            android:orientation="vertical">
+            <!--提示文字-->
+            <TextView
+                android:id="@+id/tv_float_password_title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="20dp"
+                android:text="请输入维护密码"
+                android:textColor="@color/light_gray3"
+                android:textSize="@dimen/dialog_passwd_hint_size"
+                android:textStyle="bold" />
+            <!--密码输入框-->
+            <LinearLayout
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/dialog_passwd_margintop_size"
+                android:orientation="horizontal">
+                <!--密码1-->
+                <RelativeLayout
+                    android:layout_width="@dimen/dialog_passwd_text_size"
+                    android:layout_height="@dimen/dialog_passwd_text_size">
+
+                    <ImageView
+                        android:layout_width="fill_parent"
+                        android:layout_height="fill_parent"
+                        android:background="@drawable/password_pwd_frame" />
+
+                    <ImageView
+                        android:id="@+id/float_password_img1"
+                        android:layout_width="@dimen/dialog_passwd_btn_size"
+                        android:layout_height="@dimen/dialog_passwd_btn_size"
+                        android:layout_margin="@dimen/dialog_passwd_btn_margin"
+                        android:scaleType="fitXY"
+                        android:src="@drawable/face_smile" />
+                </RelativeLayout>
+                <!--密码2-->
+                <RelativeLayout
+                    android:layout_width="@dimen/dialog_passwd_text_size"
+                    android:layout_height="@dimen/dialog_passwd_text_size"
+                    android:layout_marginLeft="@dimen/dialog_passwd_key_marginleft">
+
+                    <ImageView
+                        android:layout_width="fill_parent"
+                        android:layout_height="fill_parent"
+                        android:background="@drawable/password_pwd_frame" />
+
+                    <ImageView
+                        android:id="@+id/float_password_img2"
+                        android:layout_width="@dimen/dialog_passwd_btn_size"
+                        android:layout_height="@dimen/dialog_passwd_btn_size"
+                        android:layout_margin="@dimen/dialog_passwd_btn_margin"
+                        android:scaleType="fitXY"
+                        android:src="@drawable/face_smile" />
+                </RelativeLayout>
+                <!--密码3-->
+                <RelativeLayout
+                    android:layout_width="@dimen/dialog_passwd_text_size"
+                    android:layout_height="@dimen/dialog_passwd_text_size"
+                    android:layout_marginLeft="@dimen/dialog_passwd_key_marginleft">
+
+                    <ImageView
+                        android:layout_width="fill_parent"
+                        android:layout_height="fill_parent"
+                        android:background="@drawable/password_pwd_frame" />
+
+                    <ImageView
+                        android:id="@+id/float_password_img3"
+                        android:layout_width="@dimen/dialog_passwd_btn_size"
+                        android:layout_height="@dimen/dialog_passwd_btn_size"
+                        android:layout_margin="@dimen/dialog_passwd_btn_margin"
+                        android:scaleType="fitXY"
+                        android:src="@drawable/face_smile" />
+                </RelativeLayout>
+                <!--密码4-->
+                <RelativeLayout
+                    android:layout_width="@dimen/dialog_passwd_text_size"
+                    android:layout_height="@dimen/dialog_passwd_text_size"
+                    android:layout_marginLeft="@dimen/dialog_passwd_key_marginleft">
+
+                    <ImageView
+                        android:layout_width="fill_parent"
+                        android:layout_height="fill_parent"
+                        android:background="@drawable/password_pwd_frame" />
+
+                    <ImageView
+                        android:id="@+id/float_password_img4"
+                        android:layout_width="@dimen/dialog_passwd_btn_size"
+                        android:layout_height="@dimen/dialog_passwd_btn_size"
+                        android:layout_margin="@dimen/dialog_passwd_btn_margin"
+                        android:scaleType="fitXY"
+                        android:src="@drawable/face_smile" />
+                </RelativeLayout>
+                <!--密码5-->
+                <RelativeLayout
+                    android:layout_width="@dimen/dialog_passwd_text_size"
+                    android:layout_height="@dimen/dialog_passwd_text_size"
+                    android:layout_marginLeft="@dimen/dialog_passwd_key_marginleft">
+
+                    <ImageView
+                        android:layout_width="fill_parent"
+                        android:layout_height="fill_parent"
+                        android:background="@drawable/password_pwd_frame" />
+
+                    <ImageView
+                        android:id="@+id/float_password_img5"
+                        android:layout_width="@dimen/dialog_passwd_btn_size"
+                        android:layout_height="@dimen/dialog_passwd_btn_size"
+                        android:layout_margin="@dimen/dialog_passwd_btn_margin"
+                        android:scaleType="fitXY"
+                        android:src="@drawable/face_smile" />
+                </RelativeLayout>
+                <!--密码6-->
+                <RelativeLayout
+                    android:layout_width="@dimen/dialog_passwd_text_size"
+                    android:layout_height="@dimen/dialog_passwd_text_size"
+                    android:layout_marginLeft="@dimen/dialog_passwd_key_marginleft">
+
+                    <ImageView
+                        android:layout_width="fill_parent"
+                        android:layout_height="fill_parent"
+                        android:background="@drawable/password_pwd_frame" />
+
+                    <ImageView
+                        android:id="@+id/float_password_img6"
+                        android:layout_width="@dimen/dialog_passwd_btn_size"
+                        android:layout_height="@dimen/dialog_passwd_btn_size"
+                        android:layout_margin="@dimen/dialog_passwd_btn_margin"
+                        android:scaleType="fitXY"
+                        android:src="@drawable/face_smile" />
+                </RelativeLayout>
+            </LinearLayout>
+        </LinearLayout>
+
+        <!--下半部分-->
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="10dp"
+            android:layout_marginTop="@dimen/dialog_passwd_key_margintop"
+            android:gravity="center_horizontal"
+            android:orientation="vertical">
+            <!--第一行按键-->
+            <LinearLayout
+                android:layout_width="wrap_content"
+                android:layout_height="@dimen/dialog_passwd_key_size"
+                android:orientation="horizontal">
+
+                <ImageView
+                    android:id="@+id/float_password_btn1"
+                    android:layout_width="@dimen/dialog_passwd_key_size"
+                    android:layout_height="@dimen/dialog_passwd_key_size"
+                    android:src="@drawable/pass_one_normal" />
+
+                <ImageView
+                    android:id="@+id/float_password_btn2"
+                    android:layout_width="@dimen/dialog_passwd_key_size"
+                    android:layout_height="@dimen/dialog_passwd_key_size"
+                    android:layout_marginLeft="@dimen/dialog_passwd_key_margin"
+                    android:src="@drawable/pass_two_normal" />
+
+                <ImageView
+                    android:id="@+id/float_password_btn3"
+                    android:layout_width="@dimen/dialog_passwd_key_size"
+                    android:layout_height="@dimen/dialog_passwd_key_size"
+                    android:layout_marginLeft="@dimen/dialog_passwd_key_margin"
+                    android:src="@drawable/pass_three_normal" />
+            </LinearLayout>
+            <!--第二行按钮-->
+            <LinearLayout
+                android:layout_width="wrap_content"
+                android:layout_height="@dimen/dialog_passwd_key_size"
+                android:layout_marginTop="@dimen/dialog_passwd_key_margin"
+                android:orientation="horizontal">
+
+                <ImageView
+                    android:id="@+id/float_password_btn4"
+                    android:layout_width="@dimen/dialog_passwd_key_size"
+                    android:layout_height="@dimen/dialog_passwd_key_size"
+                    android:src="@drawable/pass_four_normal" />
+
+                <ImageView
+                    android:id="@+id/float_password_btn5"
+                    android:layout_width="@dimen/dialog_passwd_key_size"
+                    android:layout_height="@dimen/dialog_passwd_key_size"
+                    android:layout_marginLeft="@dimen/dialog_passwd_key_margin"
+                    android:src="@drawable/pass_five_normal" />
+
+                <ImageView
+                    android:id="@+id/float_password_btn6"
+                    android:layout_width="@dimen/dialog_passwd_key_size"
+                    android:layout_height="@dimen/dialog_passwd_key_size"
+                    android:layout_marginLeft="@dimen/dialog_passwd_key_margin"
+                    android:src="@drawable/pass_six_normal" />
+            </LinearLayout>
+            <!--第三行按钮-->
+            <LinearLayout
+                android:layout_width="wrap_content"
+                android:layout_height="@dimen/dialog_passwd_key_size"
+                android:layout_marginTop="@dimen/dialog_passwd_key_margin"
+                android:orientation="horizontal">
+
+                <ImageView
+                    android:id="@+id/float_password_btn7"
+                    android:layout_width="@dimen/dialog_passwd_key_size"
+                    android:layout_height="@dimen/dialog_passwd_key_size"
+                    android:src="@drawable/pass_seven_normal" />
+
+                <ImageView
+                    android:id="@+id/float_password_btn8"
+                    android:layout_width="@dimen/dialog_passwd_key_size"
+                    android:layout_height="@dimen/dialog_passwd_key_size"
+                    android:layout_marginLeft="@dimen/dialog_passwd_key_margin"
+                    android:src="@drawable/pass_eight_normal" />
+
+                <ImageView
+                    android:id="@+id/float_password_btn9"
+                    android:layout_width="@dimen/dialog_passwd_key_size"
+                    android:layout_height="@dimen/dialog_passwd_key_size"
+                    android:layout_marginLeft="@dimen/dialog_passwd_key_margin"
+                    android:src="@drawable/pass_nine_normal" />
+            </LinearLayout>
+            <!--第四行按钮-->
+            <LinearLayout
+                android:layout_width="wrap_content"
+                android:layout_height="@dimen/dialog_passwd_key_size"
+                android:layout_marginBottom="10dp"
+                android:layout_marginTop="@dimen/dialog_passwd_key_margin"
+                android:orientation="horizontal">
+
+                <TextView
+                    android:id="@+id/float_password_cancel"
+                    android:layout_width="@dimen/dialog_passwd_key_size"
+                    android:layout_height="@dimen/dialog_passwd_key_size"
+                    android:background="@drawable/btn_red_normal"
+                    android:gravity="center"
+                    android:text="取消"
+                    android:textColor="@color/white"
+                    android:textSize="30sp" />
+
+                <ImageView
+                    android:id="@+id/float_password_btn0"
+                    android:layout_width="@dimen/dialog_passwd_key_size"
+                    android:layout_height="@dimen/dialog_passwd_key_size"
+                    android:layout_marginLeft="@dimen/dialog_passwd_key_margin"
+                    android:src="@drawable/pass_zero_normal" />
+
+                <ImageView
+                    android:id="@+id/float_password_btn_delete"
+                    android:layout_width="@dimen/dialog_passwd_key_size"
+                    android:layout_height="@dimen/dialog_passwd_key_size"
+                    android:layout_marginLeft="@dimen/dialog_passwd_key_margin"
+                    android:src="@drawable/pass_delete_normal" />
+            </LinearLayout>
+        </LinearLayout>
+    </LinearLayout>
+</RelativeLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/list_item.xml b/app/src/main/res/layout/list_item.xml
new file mode 100644
index 0000000..78b5f0d
--- /dev/null
+++ b/app/src/main/res/layout/list_item.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:background="@drawable/bg_corner_all_dark"
+    android:orientation="horizontal">
+
+    <TextView
+        android:id="@+id/classitem1"
+        android:layout_width="@dimen/item1_width"
+        android:layout_height="wrap_content"
+        android:textSize="@dimen/class_size"
+        android:textColor="@color/gray_1"
+        android:layout_gravity="center_vertical"
+        android:gravity="center" />
+
+    <TextView
+        android:id="@+id/classitem2"
+        android:layout_width="@dimen/item2_width"
+        android:layout_height="wrap_content"
+        android:textSize="@dimen/class_size"
+        android:layout_gravity="center_vertical"
+        android:textColor="@color/gray_1"
+        android:gravity="center"/>
+
+    <TextView
+        android:id="@+id/classitem3"
+        android:layout_width="@dimen/item3_width"
+        android:layout_height="wrap_content"
+        android:textSize="@dimen/class_size"
+        android:layout_gravity="center_vertical"
+        android:textColor="@color/gray_1"
+        android:gravity="center"/>
+
+    <TextView
+        android:id="@+id/classitem4"
+        android:layout_width="@dimen/item4_width"
+        android:layout_height="wrap_content"
+        android:textSize="@dimen/class_size"
+        android:layout_gravity="center_vertical"
+        android:textColor="@color/gray_1"
+        android:gravity="center"/>
+
+    <TextView
+        android:id="@+id/classitem5"
+        android:layout_width="@dimen/item5_width"
+        android:layout_height="wrap_content"
+        android:textSize="@dimen/class_size"
+        android:layout_gravity="center_vertical"
+        android:textColor="@color/gray_1"
+        android:gravity="center"/>
+
+    <TextView
+        android:id="@+id/classitem6"
+        android:layout_width="@dimen/item6_width"
+        android:layout_height="wrap_content"
+        android:textColor="@color/gray_1"
+        android:layout_gravity="center_vertical"
+        android:textSize="@dimen/class_size"
+        android:gravity="center"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/list_item_2.xml b/app/src/main/res/layout/list_item_2.xml
new file mode 100644
index 0000000..62bcad4
--- /dev/null
+++ b/app/src/main/res/layout/list_item_2.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:background="@drawable/bg_corner_all_dark"
+    android:orientation="horizontal">
+
+    <TextView
+        android:id="@+id/classitem1"
+        android:layout_width="@dimen/c_item1_width"
+        android:layout_height="wrap_content"
+        android:textSize="@dimen/conference_size"
+        android:textColor="@color/gray_1"
+        android:layout_gravity="center_vertical"
+        android:gravity="center" />
+
+    <TextView
+        android:id="@+id/classitem2"
+        android:layout_width="@dimen/c_item2_width"
+        android:layout_height="wrap_content"
+        android:textSize="@dimen/conference_size"
+        android:layout_gravity="center_vertical"
+        android:textColor="@color/gray_1"
+        android:gravity="center"/>
+
+    <TextView
+        android:id="@+id/classitem3"
+        android:layout_width="@dimen/c_item3_width"
+        android:layout_height="wrap_content"
+        android:textSize="@dimen/conference_size"
+        android:layout_gravity="center_vertical"
+        android:textColor="@color/gray_1"
+        android:gravity="center"/>
+
+    <TextView
+        android:id="@+id/classitem4"
+        android:layout_width="@dimen/c_item4_width"
+        android:layout_height="wrap_content"
+        android:textSize="@dimen/conference_size"
+        android:layout_gravity="center_vertical"
+        android:textColor="@color/gray_1"
+        android:gravity="center"/>
+
+    <TextView
+        android:id="@+id/classitem5"
+        android:layout_width="@dimen/c_item5_width"
+        android:layout_height="wrap_content"
+        android:textSize="@dimen/conference_size"
+        android:layout_gravity="center_vertical"
+        android:textColor="@color/gray_1"
+        android:gravity="center"/>
+
+    <TextView
+        android:id="@+id/classitem6"
+        android:layout_width="@dimen/c_item6_width"
+        android:layout_height="wrap_content"
+        android:textColor="@color/gray_1"
+        android:layout_gravity="center_vertical"
+        android:textSize="@dimen/conference_size"
+        android:gravity="center"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/sw_toast.xml b/app/src/main/res/layout/sw_toast.xml
new file mode 100644
index 0000000..69df1ec
--- /dev/null
+++ b/app/src/main/res/layout/sw_toast.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:background="@drawable/corner_bg"
+              android:gravity="center"
+              android:orientation="horizontal"
+              android:padding="5dp">
+
+    <ImageView
+        android:id="@+id/pic_cry"
+        android:layout_width="60dp"
+        android:layout_height="60dp"
+        android:layout_gravity="center"
+        android:scaleType="fitXY"
+        android:src="@drawable/toast_cry"
+        android:visibility="gone"/>
+
+    <ImageView
+        android:id="@+id/pic_smile"
+        android:layout_width="60dp"
+        android:layout_height="60dp"
+        android:layout_gravity="center"
+        android:scaleType="fitXY"
+        android:src="@drawable/toast_smile"/>
+
+    <ImageView
+        android:id="@+id/pic_doubt"
+        android:layout_width="60dp"
+        android:layout_height="60dp"
+        android:layout_gravity="center"
+        android:scaleType="fitXY"
+        android:src="@drawable/toast_doubt"
+        android:visibility="gone"/>
+
+    <TextView
+        android:id="@+id/toasttext"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="链路检测失败"
+        android:textColor="@color/orignRed"
+        android:textSize="45dp"
+        android:textStyle="bold"/>
+</LinearLayout>
diff --git a/app/src/main/res/raw/beep.ogg b/app/src/main/res/raw/beep.ogg
new file mode 100644
index 0000000..dc6e719
--- /dev/null
+++ b/app/src/main/res/raw/beep.ogg
Binary files differ
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..4f3dcc1
--- /dev/null
+++ b/app/src/main/res/values/colors.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="colorPrimary">#008577</color>
+    <color name="colorPrimaryDark">#00574B</color>
+    <color name="colorAccent">#D81B60</color>
+    <color name="light_blue2">#2D95E0</color>
+    <color name="pos_theme_color">#08ae9e</color>
+    <color name="black">#ADADAD</color>
+    <color name="white">#FFFFFF</color>
+
+    <color name="black_1">#3C3F41</color>
+    <color name="main_blue2">#434E5F</color>
+    <color name="gray_1">#BBBBBB</color>
+    <color name="main_blue1">#0DA7E7</color>
+    <color name="yellow_1">#BE9117</color>
+    <color name="red_1">#F15D5D</color>
+    <color name="light_gray2">#717171</color>
+    <color name="orignRed">#FF4500</color>
+    <color name="light_gray4">#e0e0e0e0</color>
+    <color name="light_gray">#ffa2a2a2</color>
+    <color name="top_bar_theme_blue">#50c3ee</color>
+    <color name="cl_red">#FF0000</color>
+    <color name="light_purple_13">#7C4CC5</color>
+    <color name="light_gray3">#666666</color>
+    <color name="main_divide_line">#ADADAD</color>
+    <color name="class_status1">#FF399E40</color>
+
+    <color name="dark_blue">#0F2645</color>
+    <color name="light_blue">#347AB6</color>
+    <color name="dark_red">#8D4A3A</color>
+    <color name="light_red">#AD5138</color>
+    <color name="light_blue_2">#047D86</color>
+</resources>
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..27aa0c5
--- /dev/null
+++ b/app/src/main/res/values/dimens.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <dimen name="main_caption_size">26sp</dimen>
+
+    <dimen name="dialog_passwd_hint_size">30sp</dimen>
+    <dimen name="dialog_passwd_margintop_size">10dp</dimen>
+    <dimen name="dialog_passwd_text_size">36dp</dimen>
+    <dimen name="dialog_passwd_key_size">85dp</dimen>
+    <dimen name="dialog_passwd_key_marginleft">15dp</dimen>
+    <dimen name="dialog_passwd_key_margintop">10dp</dimen>
+    <dimen name="dialog_passwd_key_margin">10dp</dimen>
+    <dimen name="dialog_passwd_btn_size">30dp</dimen>
+    <dimen name="dialog_passwd_btn_margin">10dp</dimen>
+
+    <dimen name="item1_width">170dp</dimen>
+    <dimen name="item2_width">180dp</dimen>
+    <dimen name="item3_width">350dp</dimen>
+    <dimen name="item4_width">200dp</dimen>
+    <dimen name="item5_width">200dp</dimen>
+    <dimen name="item6_width">180dp</dimen>
+
+    <dimen name="class_title_size">40sp</dimen>
+    <dimen name="class_size">35sp</dimen>
+
+    <dimen name="c_item1_width">300dp</dimen>
+    <dimen name="c_item2_width">150dp</dimen>
+    <dimen name="c_item3_width">210dp</dimen>
+    <dimen name="c_item4_width">150dp</dimen>
+    <dimen name="c_item5_width">300dp</dimen>
+    <dimen name="c_item6_width">150dp</dimen>
+
+    <dimen name="conference_title_size">30sp</dimen>
+    <dimen name="conference_size">25sp</dimen>
+</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml
new file mode 100644
index 0000000..d8a7693
--- /dev/null
+++ b/app/src/main/res/values/ids.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?><!--
+ Copyright (C) 2008 ZXing authors
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+<resources>
+    <!-- Messages IDs -->
+    <item name="auto_focus" type="id" />
+    <item name="decode" type="id" />
+    <item name="decode_failed" type="id" />
+    <item name="decode_succeeded" type="id" />
+    <item name="encode_failed" type="id" />
+    <item name="encode_succeeded" type="id" />
+    <item name="launch_product_query" type="id" />
+    <item name="quit" type="id" />
+    <item name="restart_preview" type="id" />
+    <item name="return_scan_result" type="id" />
+    <item name="search_book_contents_failed" type="id" />
+    <item name="search_book_contents_succeeded" type="id" />
+    <item name="msg_barcode_found" type="id" />
+    <item name="msg_qr_code_found" type="id" />
+
+    <item name="gridview" type="id" />
+    <item name="webview" type="id" />
+
+    <item name="about_version_code" type="id"></item>
+    <item name="split" type="id"></item>
+</resources>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..31bcbd2
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,4 @@
+<resources>
+    <string name="app_name">会议签到</string>
+    <string name="scan_text">将二维码放入框内, 即可自动扫描</string>
+</resources>
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..64660fe
--- /dev/null
+++ b/app/src/main/res/values/styles.xml
@@ -0,0 +1,42 @@
+<resources>
+
+    <!-- Base application theme. -->
+    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+        <!-- Customize your theme here. -->
+        <item name="colorPrimary">@color/colorPrimary</item>
+        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+        <item name="colorAccent">@color/colorAccent</item>
+    </style>
+
+    <style name="FloatingDialog" parent="@android:style/Theme.Dialog">
+        <item name="android:windowFrame">@null</item>
+        <item name="android:windowIsFloating">true</item>
+        <item name="android:windowContentOverlay">@null</item>
+        <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
+        <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
+        <item name="android:windowBackground">@android:color/transparent</item>
+        <item name="android:background">@android:color/transparent</item>
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowCloseOnTouchOutside">false</item>
+        <item name="android:windowIsTranslucent">true</item>
+    </style>
+
+    <style name="init_param_name_style">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_marginTop">10dp</item>
+        <item name="android:gravity">start|center</item>
+        <item name="android:textColor">@color/light_blue2</item>
+        <item name="android:textSize">28sp</item>
+    </style>
+
+    <style name="load_info_text_style">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:gravity">start</item>
+        <item name="android:padding">10dp</item>
+        <item name="android:textColor">@color/light_blue2</item>
+        <item name="android:textSize">30sp</item>
+    </style>
+
+</resources>
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..02199bb
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,27 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+    repositories {
+        google()
+        jcenter()
+        
+    }
+    dependencies {
+        classpath 'com.android.tools.build:gradle:3.4.1'
+        
+        // NOTE: Do not place your application dependencies here; they belong
+        // in the individual module build.gradle files
+    }
+}
+
+allprojects {
+    repositories {
+        google()
+        jcenter()
+        
+    }
+}
+
+task clean(type: Delete) {
+    delete rootProject.buildDir
+}
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..82618ce
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,15 @@
+# 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.
+org.gradle.jvmargs=-Xmx1536m
+# 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
+
+
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..f6b961f
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..f688934
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Mon Mar 30 17:13:37 CST 2020
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
diff --git a/gradlew b/gradlew
new file mode 100644
index 0000000..cccdd3d
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+    echo "$*"
+}
+
+die () {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Escape application args
+save () {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+  cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..f955316
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,84 @@
+@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
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@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=
+
+@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 Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_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=%*
+
+: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
diff --git a/keys-app.jks b/keys-app.jks
new file mode 100644
index 0000000..3331a8b
--- /dev/null
+++ b/keys-app.jks
Binary files differ
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..e7b4def
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1 @@
+include ':app'
