init
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..3881173
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,72 @@
+plugins {
+ id 'com.gladed.androidgitversion' version '0.4.9'
+}
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 28
+ defaultConfig {
+ applicationId "com.supwisdom.posa711dali"
+ minSdkVersion 22
+ targetSdkVersion 28
+ versionCode 1
+ versionName "1.0"
+ ndk {
+ abiFilters "arm64-v8a"
+ }
+ multiDexEnabled true
+ }
+ signingConfigs {
+ release {
+ storeFile file("$rootDir/keys-app.jks")
+ storePassword "123456"
+ keyAlias "sup"
+ keyPassword "123456"
+ }
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility 1.8
+ targetCompatibility 1.8
+ }
+ packagingOptions {
+ exclude 'META-INF/DEPENDENCIES'
+ exclude 'META-INF/LICENSE'
+ exclude 'META-INF/LICENSE.txt'
+ exclude 'META-INF/license.txt'
+ exclude 'META-INF/NOTICE'
+ exclude 'META-INF/NOTICE.txt'
+ exclude 'META-INF/notice.txt'
+ exclude 'META-INF/ASL2.0'
+ }
+}
+
+dependencies {
+// implementation fileTree(dir: 'libs', include: ['*.jar'])
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+ 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.alibaba:fastjson:1.1.70.android'
+ compile 'com.nineoldandroids:parent:2.4.0'
+ compile 'com.squareup.okhttp3:okhttp:3.10.0'
+ compile 'net.java.dev.jna:jna:4.5.0@aar'
+ compile 'com.koushikdutta.async:androidasync:2.2.1'
+ compile group: 'com.android.support', name: 'recyclerview-v7', version: '28.0.0'
+ compile 'org.apache.commons:commons-lang3:3.7'
+ compile 'com.android.support:multidex:1.0.3'
+ compile 'org.jetbrains.kotlin:kotlin-reflect:1.3.41'
+ compile 'org.springframework.android:spring-android-core:1.0.1.RELEASE'
+ compile files('libs/apache-httpcomponents-httpcore.jar')
+ compile files('libs/zxinglibsl.jar')
+}
diff --git a/app/libs/apache-httpcomponents-httpcore.jar b/app/libs/apache-httpcomponents-httpcore.jar
new file mode 100644
index 0000000..a357c07
--- /dev/null
+++ b/app/libs/apache-httpcomponents-httpcore.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/src/androidTest/java/com/supwisdom/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/supwisdom/ExampleInstrumentedTest.kt
new file mode 100644
index 0000000..2aff141
--- /dev/null
+++ b/app/src/androidTest/java/com/supwisdom/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package com.supwisdom
+
+import android.support.test.InstrumentationRegistry
+import android.support.test.runner.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getTargetContext()
+ assertEquals("com.supwisdom", appContext.packageName)
+ }
+}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..6830380
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,93 @@
+<?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"
+ android:sharedUserId="android.uid.system">
+
+ <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_SETTINGS"
+ serviceandroid:ignore="ProtectedPermissions"/>
+ <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=".activities.SPApplication"
+ android:allowBackup="true"
+ android:icon="@drawable/app_logo"
+ android:label="@string/app_name"
+ android:persistent="false"
+ android:supportsRtl="true"
+ android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
+ <activity
+ android:name=".activities.splash.SplashActivity"
+ android:launchMode="singleTask"
+ android:screenOrientation="portrait">
+ <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>
+ <intent-filter>
+ <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED"/>
+ </intent-filter>
+
+ <meta-data
+ android:name="android.hardware.usb.action.USB_DEVICE_DETACHED"
+ android:resource="@xml/device_filter"/>
+ </activity>
+
+ <service android:name=".activities.ServiceDemo">
+ <intent-filter>
+ <category android:name="android.intent.category.default"/>
+ </intent-filter>
+ </service>
+
+ <!--<activity-->
+ <!--android:name=".activities.consume.WaitActivity"-->
+ <!--android:label="@string/title_activity_consume"-->
+ <!--android:launchMode="singleInstance"/>-->
+
+ </application>
+
+</manifest>
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/CrashHandler.kt b/app/src/main/java/com/supwisdom/activities/CrashHandler.kt
new file mode 100644
index 0000000..c400b57
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/CrashHandler.kt
@@ -0,0 +1,136 @@
+package com.supwisdom.activities
+
+import android.content.Context
+import android.content.pm.PackageManager
+import android.os.Build
+import android.os.Looper
+import com.supwisdom.dcpos.utils.CommonUtil
+import com.supwisdom.dcpos.view.ToastUtil
+import com.supwisdom.utils.AppExitUtil
+import com.supwisdom.utils.DateUtil
+import com.supwisdom.utils.FileUtil
+import com.supwisdom.utils.ThreadPool
+import java.io.PrintWriter
+import java.io.StringWriter
+import java.util.HashMap
+
+/**
+ ** create by zzq on 2019/7/23
+ ** @desc
+ **/
+class CrashHandler : Thread.UncaughtExceptionHandler {
+ private var context: Context? = null
+ private var mDefaultHandler: Thread.UncaughtExceptionHandler? = null
+ private val info = HashMap<String, String>()
+
+ companion object {
+ private var INSTANCE: CrashHandler? = null
+
+ fun getInstance(): CrashHandler {
+ if (INSTANCE == null) {
+ synchronized(CrashHandler::class) {
+ if (INSTANCE == null) {
+ INSTANCE = CrashHandler()
+ }
+ }
+ }
+ return INSTANCE!!
+ }
+ }
+
+ fun init(context: Context) {
+ this.context = context
+ // 获取系统默认的 UncaughtException 处理器
+ mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler()
+ // 设置该 CrashHandler 为程序的默认处理器
+ Thread.setDefaultUncaughtExceptionHandler(this)
+ }
+
+ override fun uncaughtException(thread: Thread, ex: Throwable) {
+ if (!handleException(ex) && mDefaultHandler != null) {
+ // 如果自定义的没有处理则让系统默认的异常处理器来处理
+ mDefaultHandler!!.uncaughtException(thread, ex)
+ } else {
+ AppExitUtil.exit()
+ }
+ }
+
+ /**
+ * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
+ *
+ * @param ex 异常信息
+ * @return true 如果处理了该异常信息;否则返回false.
+ */
+ private fun handleException(ex: Throwable?): Boolean {
+// CommonUtil.showBar(context!!)
+ ThreadPool.getShortPool().execute(Runnable {
+ CommonUtil.doSleep(500)
+ Looper.prepare()
+ ToastUtil.show(context!!, "很抱歉,程序运行异常")
+ Looper.loop()
+ })
+ if (ex == null) {
+ return false
+ }
+ // 收集设备参数信息
+ collectDeviceInfo()
+ // 保存日志文件
+ saveCrashInfo2File(ex)
+ return true
+ }
+
+ /**
+ * 收集设备参数信息
+ */
+
+ private fun collectDeviceInfo() {
+ try {
+ val pm = context!!.packageManager// 获得包管理器
+ val pi = pm.getPackageInfo(
+ context!!.packageName,
+ PackageManager.GET_ACTIVITIES
+ )// 得到该应用的信息,即主Activity
+ if (pi != null) {
+ info["versionName"] = pi.versionName ?: "null"
+ info["versionCode"] = pi.versionCode.toString()
+ }
+ } catch (e: PackageManager.NameNotFoundException) {
+ e.printStackTrace()
+ }
+
+ val fields = Build::class.java.declaredFields// 反射机制
+ for (field in fields) {
+ try {
+ field.isAccessible = true
+ info[field.name] = field.get("").toString()
+ } catch (e: IllegalArgumentException) {
+ e.printStackTrace()
+ } catch (e: IllegalAccessException) {
+ e.printStackTrace()
+ }
+ }
+ }
+
+ private fun saveCrashInfo2File(ex: Throwable): Boolean {
+ val sb = StringBuffer()
+ sb.append("\r\n crash time :").append(DateUtil.getNowTime()).append("\r\n")
+ for ((key, value) in info) {
+ sb.append("$key=$value\r\n")
+ }
+ val writer = StringWriter()
+ val pw = PrintWriter(writer)
+ ex.printStackTrace(pw)
+ var cause: Throwable? = ex.cause
+ // 循环着把所有的异常信息写入writer中
+ while (cause != null) {
+ cause.printStackTrace(pw)
+ cause = cause.cause
+ }
+ pw.close()// 记得关闭
+ val result = writer.toString()
+ sb.append(result)
+ // 保存文件
+ FileUtil.writeCrashFile(sb.toString())
+ return true
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/SPApplication.kt b/app/src/main/java/com/supwisdom/activities/SPApplication.kt
new file mode 100644
index 0000000..06040ca
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/SPApplication.kt
@@ -0,0 +1,13 @@
+package com.supwisdom.activities
+
+import android.support.multidex.MultiDexApplication
+
+/**
+ ** create by zzq on 2019/7/23
+ ** @desc
+ **/
+class SPApplication: MultiDexApplication() {
+ override fun onCreate() {
+ super.onCreate()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/ServiceDemo.kt b/app/src/main/java/com/supwisdom/activities/ServiceDemo.kt
new file mode 100644
index 0000000..c0bc6b1
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/ServiceDemo.kt
@@ -0,0 +1,15 @@
+package com.supwisdom.activities
+
+import android.app.Service
+import android.content.Intent
+import android.os.IBinder
+
+/**
+ ** create by zzq on 2019/7/23
+ ** @desc
+ **/
+class ServiceDemo : Service() {
+ override fun onBind(intent: Intent): IBinder? {
+ return null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/utils/AppExitUtil.kt b/app/src/main/java/com/supwisdom/utils/AppExitUtil.kt
new file mode 100644
index 0000000..d9f3f3a
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/utils/AppExitUtil.kt
@@ -0,0 +1,53 @@
+package com.supwisdom.utils
+
+import android.app.Activity
+import java.util.*
+
+/**
+ * @author zzq
+ * @date 2018/3/20.
+ * @version 1.0.1
+ * @desc : activity管理
+ */
+object AppExitUtil {
+ private val acys = HashSet<Activity>()
+
+ fun add(acy: Activity) {
+ acys.add(acy)
+ }
+
+ fun remove(acy: Activity) {
+ acys.remove(acy)
+ if (!acy.isFinishing) {
+ acy.finish()
+ }
+ if (acys.size == 0) {
+ killprocess()
+ }
+ }
+
+ fun exit() {
+ val iter = acys.iterator()
+ val arrs = arrayOfNulls<Activity>(acys.size)
+ var i = 0
+ while (iter.hasNext()) {
+ arrs[i] = iter.next()
+ i += 1
+ }
+ acys.clear()
+ for (j in arrs.indices) {
+ if (arrs[j] != null && !arrs[j]!!.isFinishing) {
+ arrs[j]!!.finish()
+ arrs[j] = null
+ }
+ }
+ killprocess()
+ }
+
+ private fun killprocess() {
+ ThreadPool.getShortPool().execute(Runnable {
+ CommonUtil.doSleep(2000)
+ android.os.Process.killProcess(android.os.Process.myPid())
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/utils/CommonUtil.kt b/app/src/main/java/com/supwisdom/utils/CommonUtil.kt
new file mode 100644
index 0000000..2f3e62b
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/utils/CommonUtil.kt
@@ -0,0 +1,117 @@
+@file:Suppress("DEPRECATION")
+
+package com.supwisdom.utils
+
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.content.Context
+import android.content.Intent
+import android.content.pm.PackageManager
+import android.net.Uri
+import android.os.Build
+import android.os.PowerManager
+import android.provider.Settings
+import java.io.File
+import java.io.FileOutputStream
+
+/**
+ * @author zzq
+ * @date 2018/5/9.
+ * @version 1.0.1
+ * @desc 公共类
+ */
+object CommonUtil {
+ fun doSleep(ms: Long) {
+ try {
+ Thread.sleep(ms)
+ } catch (e: InterruptedException) {
+ e.printStackTrace()
+ }
+ }
+
+ fun YuanToFen(yuan: Double): Int {
+ return Math.round(yuan * 100).toInt()
+ }
+
+ fun upgrade(context: Context, filename: String) {
+ val intent = Intent(Intent.ACTION_VIEW)
+ val uri = Uri.fromFile(File(filename))
+ intent.setDataAndType(uri, "application/vnd.android.package-archive")
+ (context as Activity).startActivityForResult(intent, 0)
+ }
+
+ /*优化a811扫码*/
+ fun writeLinnuuxParams() {
+ try {
+ val fos = FileOutputStream("/sys/module/gc0308/parameters/exposure")
+ fos.write("20".toByteArray())
+ fos.close()
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ }
+
+ /**
+ * get App versionName
+ *
+ * @param context
+ * @return
+ */
+ fun getVersionName(context: Context): String {
+ try {
+ val packageManager = context.packageManager
+ val packageInfo = packageManager.getPackageInfo(context.packageName, 0)
+ return packageInfo.versionName
+ } catch (e: PackageManager.NameNotFoundException) {
+ e.printStackTrace()
+ return "error:" + e.message
+ }
+
+ }
+
+ /**
+ * 跳转网络设置页;
+ */
+ fun startNetSetting(context: Context) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ context.startActivity(Intent(Settings.ACTION_SETTINGS))
+ } else {
+ context.startActivity(Intent(Settings.ACTION_WIRELESS_SETTINGS))
+ }
+ }
+
+ /**
+ * 唤醒屏幕
+ */
+ fun acquireWakeLock(context: Context) {
+ /*FULL_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度
+ ACQUIRE_CAUSES_WAKEUP:强制使屏幕亮起,这种锁主要针对一些必须通知用户的操作.
+ ON_AFTER_RELEASE:当锁被释放时,保持屏幕亮起一段时间*/
+ try {
+ val pm = context.getSystemService(Context.POWER_SERVICE) as PowerManager
+ @SuppressLint("InvalidWakeLockTag") val wakeLock = pm.newWakeLock(
+ PowerManager.ON_AFTER_RELEASE
+ or PowerManager.ACQUIRE_CAUSES_WAKEUP
+ or PowerManager.FULL_WAKE_LOCK, "Tag"
+ )
+ wakeLock.acquire()
+ wakeLock.release()
+ } catch (ex: Exception) {
+ ex.printStackTrace()
+ }
+
+ }
+
+ fun getPasswordStar(len: Int): String {
+ return when (len) {
+ 0 -> " "
+ 1 -> "*"
+ 2 -> "**"
+ 3 -> "***"
+ 4 -> "****"
+ 5 -> "*****"
+ 6 -> "******"
+ else -> " "
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/utils/DateUtil.kt b/app/src/main/java/com/supwisdom/utils/DateUtil.kt
new file mode 100644
index 0000000..8354b4a
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/utils/DateUtil.kt
@@ -0,0 +1,481 @@
+package com.supwisdom.utils
+
+import java.text.ParseException
+import java.util.*
+
+/**
+ ** create by zzq on 2019/7/23
+ ** @desc
+ **/
+object DateUtil {
+ private val FORMAT_yyyyMMdd = org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyyMMdd")
+ private val FORMAT_yyMMddHHmmss = org.apache.commons.lang3.time.FastDateFormat.getInstance("yyMMddHHmmss")
+ private val FORMAT_yyMMddHHmmss2 = org.apache.commons.lang3.time.FastDateFormat.getInstance("yy-MM-dd HH:mm:ss")
+ private val FORMAT_HHmmss = org.apache.commons.lang3.time.FastDateFormat.getInstance("HHmmss")
+ private val FORMAT_MMdd = org.apache.commons.lang3.time.FastDateFormat.getInstance("MMdd")
+ private val FORMAT_MM_dd = org.apache.commons.lang3.time.FastDateFormat.getInstance("MM-dd")
+ private val FORMAT_yyyyMMddHHmmss = org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyyMMddHHmmss")
+ private val FORMAT_yyyyMMddHHmm = org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyyMMddHHmm")
+ private val FORMAT_MMddHHmmyy = org.apache.commons.lang3.time.FastDateFormat.getInstance("MMddHHmmyy")
+ private val FORMAT_yyyy_MM_dd_HH_mm_ss =
+ org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss")
+ private val FORMAT_yyyy_MM_dd_HH_mm_ss_SSS =
+ org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss.SSS")
+ private val FORMAT_HH_mm_ss_SSS = org.apache.commons.lang3.time.FastDateFormat.getInstance("HHmmssSSS")
+ private val FORMAT_yyyy_MM_dd_HH_mm = org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd HH:mm")
+ private val FORMAT_yyyy_MM_dd = org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd")
+ private val FORMAT_HH_mm_ss = org.apache.commons.lang3.time.FastDateFormat.getInstance("HH:mm:ss")
+ private val FORMAT_HH_mm = org.apache.commons.lang3.time.FastDateFormat.getInstance("HH:mm")
+
+ /**
+ * @return yyyy-MM-dd HH:mm:ss
+ */
+ fun getNow(): String {
+ return FORMAT_yyyy_MM_dd_HH_mm_ss.format(Date())
+ }
+
+ /**
+ * @return yyyy-MM-dd HH:mm:ss.SSS
+ */
+ fun getNow5(): String {
+ return FORMAT_yyyy_MM_dd_HH_mm_ss_SSS.format(Date())
+ }
+
+ /**
+ * @return yyyy-MM-dd HH:mm
+ */
+ fun getNow4(): String {
+ return FORMAT_yyyy_MM_dd_HH_mm.format(Date())
+ }
+
+ /**
+ * @return yyMMddHHmmss
+ */
+ fun getNow2(): String {
+ return FORMAT_yyMMddHHmmss.format(Date())
+ }
+
+ /**
+ * @param dateTime yyyyMMddHHmmss
+ * @return yyyyMMdd.HHmmss
+ */
+ fun getNow4(dateTime: String): String? {
+ try {
+ val str1 = dateTime.substring(0, 8)
+ val str2 = dateTime.substring(8)
+ return "$str1.$str2"
+ } catch (ex: Exception) {
+ ex.printStackTrace()
+ }
+ return null
+ }
+
+ /**
+ * @return yy-MM-dd HH:mm:ss
+ */
+ fun getNow3(): String {
+ return FORMAT_yyMMddHHmmss2.format(Date())
+ }
+
+ /**
+ * @return yyyy-MM-dd HH:mm:ss
+ */
+ fun getDateTimeFormat(date: Date): String {
+ return FORMAT_yyyy_MM_dd_HH_mm_ss.format(date)
+ }
+
+ /**
+ * @return yyyy-MM-dd HH:mm:ss
+ */
+ fun getDateTimeFormat(timeInMillis: Long?): String {
+ return FORMAT_yyyy_MM_dd_HH_mm_ss.format(timeInMillis)
+ }
+
+ /**
+ * @param datetime yyyyMMddHHmmss
+ * @return yyyy-MM-dd HH:mm:ss
+ */
+ fun getNowDatetimeFromNoFormat(datetime: String): String {
+ try {
+ return datetime.substring(0, 4) + "-" +
+ datetime.substring(4, 6) + "-" +
+ datetime.substring(6, 8) + " " +
+ datetime.substring(8, 10) + ":" +
+ datetime.substring(10, 12) + ":" +
+ datetime.substring(12)
+ } catch (ex: Exception) {
+ }
+ return ""
+ }
+
+ /**
+ * @param datetime yyyyMMddHHmm
+ * @return yyyy-MM-dd HH:mm
+ */
+ fun getNowDatetimeFromNoFormat3(datetime: String): String {
+ try {
+ return datetime.substring(0, 4) + "-" +
+ datetime.substring(4, 6) + "-" +
+ datetime.substring(6, 8) + " " +
+ datetime.substring(8, 10) + ":" +
+ datetime.substring(10)
+ } catch (ex: Exception) {
+ }
+ return ""
+ }
+
+ /**
+ * @param datetime yyyyMMddHHmmss
+ * @return yy-MM-dd HH:mm:ss
+ */
+ fun getNowDatetimeFromNoFormat2(datetime: String): String {
+ try {
+ return datetime.substring(2, 4) + "-" +
+ datetime.substring(4, 6) + "-" +
+ datetime.substring(6, 8) + " " +
+ datetime.substring(8, 10) + ":" +
+ datetime.substring(10, 12) + ":" +
+ datetime.substring(12)
+ } catch (ex: Exception) {
+ }
+ return ""
+ }
+
+ /**
+ * @param date yyyyMMdd
+ * @return yyyy-MM-dd
+ */
+ fun getNowDateFromNoFormat(date: String): String {
+ try {
+ return date.substring(0, 4) + "-" +
+ date.substring(4, 6) + "-" +
+ date.substring(6, 8)
+ } catch (ex: Exception) {
+ }
+ return ""
+ }
+
+ /**
+ * @param date yyyy-MM-dd HH:mm:ss
+ * @return yyyyMMddHHmmss
+ */
+ fun getNowDateFromNoFormat2(date: String): String {
+ return date.replace("-", "")
+ .replace(" ", "")
+ .replace(":", "")
+ }
+
+
+ /**
+ * @return HH:mm:ss
+ */
+ fun getNowTimeWithArg(date: Date): String? {
+ try {
+ return FORMAT_HH_mm_ss.format(date)
+ } catch (e: Exception) {
+ return null
+ }
+ }
+
+ /**
+ * @param time HHmm
+ * @return HH:mm
+ */
+ fun formatTime(time: String): String {
+ try {
+ val sb = StringBuilder()
+ sb.append(time.substring(0, 2)).append(":")
+ .append(time.substring(2, 4))
+ return sb.toString()
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ return ""
+ }
+
+ /**
+ * @return MMdd
+ */
+ fun getDateMMdd(): String? {
+ try {
+ return FORMAT_MMdd.format(Date())
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ return null
+ }
+
+ /**
+ * @return MM-dd
+ */
+ fun getDate_MMdd(): String? {
+ try {
+ return FORMAT_MM_dd.format(Date())
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ return null
+ }
+
+ /**
+ * @return yyyy-MM-dd
+ */
+ fun getNowDate(): String {
+ return FORMAT_yyyy_MM_dd.format(Date())
+ }
+
+ /**
+ * @return yyyy-MM-dd
+ */
+ fun getNowDate2(date: Date): String? {
+ try {
+ return FORMAT_yyyy_MM_dd.format(date)
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ return null
+ }
+
+ /**
+ * @param dateStr yyyy-MM-dd
+ * @return
+ */
+ fun getNowDate(dateStr: String): Date? {
+ try {
+ return FORMAT_yyyy_MM_dd.parse(dateStr)
+ } catch (e: ParseException) {
+ e.printStackTrace()
+ }
+ return null
+ }
+
+ /**
+ * @return HHmmssSSS
+ */
+ fun getNowTime1(): String {
+ return FORMAT_HH_mm_ss_SSS.format(Date())
+ }
+
+ /**
+ * @return HH:mm:ss
+ */
+ fun getNowTime(): String {
+ return FORMAT_HH_mm_ss.format(Date())
+ }
+
+ /**
+ * @return format
+ */
+ fun getDayofWeek(offsetWeek: Int, dayOfWeek: Int, format: String): String {
+ val cal = Calendar.getInstance()
+ // n为推迟的周数,1本周,-1向前推迟一周,2下周,依次类推
+ val retday: String
+ cal.add(Calendar.DATE, offsetWeek * 7)
+ cal.set(Calendar.DAY_OF_WEEK, dayOfWeek)
+ retday = org.apache.commons.lang3.time.FastDateFormat.getInstance(format).format(cal.time)
+ return retday
+ }
+
+ /**
+ * 计算超时时间,精确到毫秒
+ *
+ * @param milliSeconds
+ * @return L
+ */
+ fun getExpireTime(milliSeconds: Long): Long {
+ return Date().time + milliSeconds
+ }
+
+ /**
+ * @return yyyyMMddHHmmss
+ */
+ fun getNowDateTimeNoFormat(): String {
+ return FORMAT_yyyyMMddHHmmss.format(Date())
+ }
+
+ /**
+ * @return yyyyMMdd
+ */
+ fun getNowDateNoFormat(): String {
+ return FORMAT_yyyyMMdd.format(Date())
+ }
+
+ /**
+ * @param date
+ * @return yyyyMMdd
+ */
+ fun getNowDateNoFormat(date: Date): String? {
+ try {
+ return FORMAT_yyyyMMdd.format(date)
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ return null
+ }
+
+ /**
+ * @return HHmmss
+ */
+ fun getNowTimeNoFormat(): String {
+ return FORMAT_HHmmss.format(Date())
+ }
+
+ /**
+ * @param datetime yyyyMMddHHmmss
+ * @return ms
+ * @desc 将日期格式的字符串转换为长整型
+ */
+ fun dateFormatConvertToLong(datetime: String): Long {
+ try {
+ return FORMAT_yyyyMMddHHmmss.parse(datetime).time
+ } catch (ex: ParseException) {
+ return 0L
+ }
+ }
+
+ /**
+ * @param time ms
+ * @return yyyyMMddHHmmss
+ * @desc 将长整型数字转换为日期格式的字符串
+ */
+ fun dateLongConvertToFormat(time: Long): String {
+ return if (time > 0L) {
+ FORMAT_yyyyMMddHHmmss.format(Date(time))
+ } else ""
+ }
+
+ /**
+ * @param time ms
+ * @return MMddHHmmyy
+ * @desc 将长整型数字转换为日期格式的字符串
+ */
+ fun dateLongConvertToFormat2(time: Long): String {
+ return if (time > 0L) {
+ FORMAT_MMddHHmmyy.format(Date(time))
+ } else ""
+ }
+
+ /**
+ * @param datetime yyyy-MM-dd HH:mm:ss
+ * @return
+ * @desc 将日期格式的字符串转换为长整型
+ */
+ fun dateFormatConvertToDate(datetime: String): Date? {
+ try {
+ return FORMAT_yyyy_MM_dd_HH_mm_ss.parse(datetime)
+ } catch (ex: ParseException) {
+ return null
+ }
+ }
+
+ /**
+ * @param daynum 天数
+ * @return 返回当前日期的第 daynum 天前的日期 yyyyMMdd
+ */
+ fun getDayDateNoFormatBefore(daynum: Int): String {
+ val calendar = Calendar.getInstance()
+ calendar.add(Calendar.DATE, -daynum)
+ return FORMAT_yyyyMMdd.format(calendar.time)
+ }
+
+ /**
+ * 获得指定日期的前一天
+ *
+ * @param specifiedDay yyyyMMdd
+ * @return yyyyMMdd
+ */
+ fun getSpecifiedDayBefore(specifiedDay: String): String {
+ try {
+ val c = Calendar.getInstance()
+ val date = FORMAT_yyyyMMdd.parse(specifiedDay)
+ c.time = date
+ val day = c.get(Calendar.DATE)
+ c.set(Calendar.DATE, day - 1)
+ return FORMAT_yyyyMMdd.format(c.time)
+ } catch (e: ParseException) {
+ return ""
+ }
+ }
+
+ /**
+ * 获得指定日期的前一天
+ *
+ * @param dayBefore 往前推迟的天数
+ * @return Date
+ */
+ fun getSomeDayBefore(dayBefore: Int): Date {
+ val c = Calendar.getInstance()
+ c.add(Calendar.DAY_OF_MONTH, -dayBefore)
+ return c.time
+ }
+
+ /**
+ * 获得指定日期的后一天
+ *
+ * @param specifiedDay yyyyMMdd
+ * @return yyyyMMdd
+ */
+ fun getSpecifiedDayAfter(specifiedDay: String): String {
+ try {
+ val c = Calendar.getInstance()
+ val date = FORMAT_yyyyMMdd.parse(specifiedDay)
+ c.time = date
+ val day = c.get(Calendar.DATE)
+ c.set(Calendar.DATE, day + 1)
+ return FORMAT_yyyyMMdd.format(c.time)
+ } catch (e: ParseException) {
+ return ""
+ }
+ }
+
+ /**
+ * 获得指定日期的后一天
+ *
+ * @param specifiedDay yyyy-MM-dd
+ * @return yyyy-MM-dd
+ */
+ fun getSpecifiedDayAfter1(specifiedDay: String): String {
+ try {
+ val c = Calendar.getInstance()
+ val date = FORMAT_yyyy_MM_dd.parse(specifiedDay)
+ c.time = date
+ val day = c.get(Calendar.DATE)
+ c.set(Calendar.DATE, day + 1)
+ return FORMAT_yyyy_MM_dd.format(c.time)
+ } catch (e: ParseException) {
+ return ""
+ }
+ }
+
+ /**
+ * 分钟转化为未来时间yyyyMMddHHmm
+ *
+ * @param minute 分钟数
+ * @return yyyyMMddHHmm
+ */
+ fun format2FutureTime(minute: Int): String {
+ val calendar = Calendar.getInstance()
+ calendar.add(Calendar.MINUTE, minute)
+ return FORMAT_yyyyMMddHHmm.format(calendar.time)
+ }
+
+ /**
+ * @return yyyyMMddHHmm
+ */
+ fun getNowDateTimeFormat(): String {
+ return FORMAT_yyyyMMddHHmm.format(Date())
+ }
+
+ /**
+ * @param datetime yyyyMMddHHmm
+ * @return 毫秒数
+ */
+ fun formatDateTime(datetime: String): Long {
+ try {
+ return FORMAT_yyyyMMddHHmm.parse(datetime).time
+ } catch (ex: Exception) {
+ ex.printStackTrace()
+ }
+ return 0
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/utils/FileUtil.kt b/app/src/main/java/com/supwisdom/utils/FileUtil.kt
new file mode 100644
index 0000000..bf18ee0
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/utils/FileUtil.kt
@@ -0,0 +1,142 @@
+package com.supwisdom.utils
+
+import android.os.Environment
+import java.io.*
+
+/**
+ ** create by zzq on 2019/7/23
+ ** @desc
+ **/
+object FileUtil {
+ private val ROOT_DIR = "/YueXiao/pos/"
+ private val ROOT_PRIVATE_DIR = "/supwisdom/"
+ private val CACHE_FILE_DIR = ROOT_DIR + "cache/"
+ private val CRASH_FILE_DIR = ROOT_DIR + "crash/"
+ private val CRASH_FILE_PRE = "crash-"
+ private val LOG_FILE_DIR = ROOT_DIR + "log/"
+ private val LOG_FILE_PRE = "log-"
+ private val DTL_FILE_DIR = ROOT_DIR + "dtl/"
+ private val DTL_FILE_PRE = "dtl-"
+
+ fun getUpdateFile(fileName: String): File? {
+ return createFile(CACHE_FILE_DIR, fileName)
+ }
+
+ fun getCfgFile(fileName: String): File? {
+ return createFile(ROOT_PRIVATE_DIR, fileName)
+ }
+
+ fun getCfgFileStream(fileName: String): InputStream? {
+ if (android.os.Environment.MEDIA_MOUNTED == android.os.Environment.getExternalStorageState()) {
+ val rootFile = File(Environment.getExternalStorageDirectory().toString() + ROOT_PRIVATE_DIR)
+ if (!rootFile.exists()) {
+ return null
+ }
+ val retFile = File(rootFile, fileName)
+ if (retFile.exists()) {
+ try {
+ return FileInputStream(retFile)
+ } catch (e: FileNotFoundException) {
+ e.printStackTrace()
+ }
+
+ }
+ }
+ return null
+ }
+
+ fun removeDtlFile(beforeday: Int) {
+ removeFile(DTL_FILE_DIR, DTL_FILE_PRE, beforeday)
+ }
+
+ fun removeLogFile(beforeday: Int) {
+ removeFile(LOG_FILE_DIR, LOG_FILE_PRE, beforeday)
+ }
+
+ fun removeCrashFile(beforeday: Int) {
+ removeFile(CRASH_FILE_DIR, CRASH_FILE_PRE, beforeday)
+ }
+
+
+ fun writeDtlFile(msg: String) {
+ val pathfile = DTL_FILE_DIR + DTL_FILE_PRE + DateUtil.getNowDateNoFormat() + ".txt"
+ writeFile(pathfile, msg, true)
+ }
+
+ fun writeCrashFile(msg: String) {
+ val pathfile = CRASH_FILE_DIR + CRASH_FILE_PRE + DateUtil.getNowDateNoFormat() + ".txt"
+ writeFile(pathfile, msg, true)
+ }
+
+ fun writeLogFile(msg: String) {
+ val pathfile = LOG_FILE_DIR + LOG_FILE_PRE + DateUtil.getNowDateNoFormat() + ".txt"
+ writeFile(pathfile, msg, true)
+ }
+
+ private fun writeFile(targetPath: String, msg: String, append: Boolean) {
+ if (android.os.Environment.MEDIA_MOUNTED == android.os.Environment.getExternalStorageState()) {
+ val targetFile = File(Environment.getExternalStorageDirectory().toString() + targetPath)
+ if (!targetFile.parentFile.exists()) {
+ targetFile.parentFile.mkdirs()
+ }
+ try {
+ val osw = OutputStreamWriter(
+ FileOutputStream(targetFile, append), "utf-8"
+ )
+ try {
+ osw.write(msg)
+ osw.write("</br>\n")
+ osw.flush()
+ osw.close()
+ } catch (e: IOException) {
+ e.printStackTrace()
+ }
+
+ } catch (e1: UnsupportedEncodingException) {
+ e1.printStackTrace()
+ } catch (e1: FileNotFoundException) {
+ e1.printStackTrace()
+ }
+
+ }
+ }
+
+ private fun removeFile(targetPath: String, prefile: String, beforeday: Int) {
+ if (Environment.MEDIA_MOUNTED == Environment.getExternalStorageState()) {
+ val rootFile = File(Environment.getExternalStorageDirectory().toString() + targetPath)
+ if (!rootFile.exists()) {
+ return
+ }
+ val logname = prefile + DateUtil.getDayDateNoFormatBefore(beforeday) + ".txt"
+ val files = rootFile.listFiles()
+ for (file in files!!) {
+ val fullfilename = file.absolutePath
+ val filename = fullfilename.substring(fullfilename.lastIndexOf('/') + 1)
+ if (filename.startsWith(prefile) && filename.endsWith(".txt")) {
+ if (filename.compareTo(logname) < 0) {
+ file.delete()
+ }
+ }
+ }
+ }
+ }
+
+ private fun createFile(path: String, fileName: String): File? {
+ if (android.os.Environment.MEDIA_MOUNTED == android.os.Environment.getExternalStorageState()) {
+ val rootFile = File(Environment.getExternalStorageDirectory().toString() + path)
+ if (!rootFile.exists()) {
+ rootFile.mkdirs()
+ }
+ val retFile = File(rootFile, fileName)
+ if (!retFile.exists()) {
+ try {
+ retFile.createNewFile()
+ } catch (e: IOException) {
+ return null
+ }
+ }
+ return retFile
+ }
+ return null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/utils/PublicDef.kt b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
new file mode 100644
index 0000000..372f8a7
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
@@ -0,0 +1,159 @@
+package com.supwisdom.utils
+
+/**
+ * @author zzq
+ * @date 2018/4/26.
+ * @version 1.0.1
+ * @desc APP module常量定义
+ */
+object PublicDef {
+ /**
+ * 错误码
+ */
+ const val SUCCESS = 0
+ const val ERROR = 1
+ /**
+ * 商户默认密码 111111
+ * 维护默认密码 914387
+ */
+ const val PASSWD_SHOP_DEFAULT = "111111"
+ const val PASSWD_ADMIN_DEFAULT = "914387"
+
+ /**************************************************************/
+ /*************************handler 状态码***********************/
+ /*************************不能重复*****************************/
+ /**
+ * @desc 刷卡消费
+ */
+ const val MSG_CARD_USER_INFO_CLEAR = 10
+ const val MSG_CARD_USER_INFO_SHOW = 11
+ const val MSG_CARD_READ_AGAIN = 12
+ const val MSG_CARD_PASSWORD_CHECK = 13
+ const val MSG_CARD_PAY_SUCCESS = 14
+ const val MSG_CARD_PAY_FAIL = 15
+ const val MSG_CARD_PAYING_HINT = 16
+ const val MSG_CARD_REVERSE_SUCCESS = 17
+ const val MSG_CARD_REVERSE_FAIL = 18
+ const val MSG_HOME_CLEAR = 19
+
+ const val MSG_QRCODE_PASSWORD_CHECK = 20
+ const val MSG_QRCODE_PAY_SUCCESS = 21
+ const val MSG_QRCODE_PAY_FAIL = 22
+ const val MSG_QRCODE_REVERSE_SUCCESS = 23
+ const val MSG_QRCODE_REVERSE_FAIL = 24
+ const val MSG_QRCODE_PAYING_HINT = 25
+
+ const val MSG_GOODS_UPDATE = 26
+ const val MSG_LINK_STATUS_UPDATE = 27
+ const val MSG_PHONE_BILL_UPDATE = 28
+
+ const val MSG_ORDER_HISTORY_SHOW = 29
+ const val MSG_ORDER_PHONE_SHOW = 30
+ const val MSG_ORDER_WEIGH_WEIGHT = 31
+
+ const val MSG_ORDINARY_REFRESH_LASTORDER = 32
+ const val MSG_NO_CARD_PAY_SUCCESS = 33
+ const val MSG_PRINT_ERROR = 34
+ const val MSG_PRINT = 35
+
+ const val MSG_TAKE_NOTIFY_SUC = 45
+ const val MSG_TAKE_NOTIFY_FAIL = 46
+ /**
+ * dialog 创建类型
+ */
+ const val DIALOG_TYPE_PHONE_BILL_HINT = 3 //在线订单提醒弹窗
+ const val DIALOG_TYPE_ORDERX_HISTORY_BILL = 4 //服务器点餐模式历史订单
+ const val DIALOG_TYPE_NSD_CONFIG = 5 //NSD 参数配置列表
+ /**
+ * 点餐界面显示模式
+ */
+ const val ORDER_VIEW_SHOW_PIC4 = 1 //2列
+ const val ORDER_VIEW_SHOW_PIC9 = 2 //3列
+ const val ORDER_VIEW_SHOW_PIC16 = 3//4列
+ const val ORDER_VIEW_SHOW_PIC20 = 4//5列
+ const val ORDER_VIEW_SHOW_PIC25 = 5//5列
+ const val ORDER_VIEW_SHOW_PIC30 = 6//5列
+ const val ORDER_VIEW_SHOW_SIMPLE35 = 7//5列
+ const val ORDER_VIEW_SHOW_SIMPLE40 = 8//5列
+ const val ORDER_VIEW_SHOW_SIMPLE45 = 9//5列
+ const val ORDER_VIEW_SHOW_SIMPLE50 = 10//5列
+ const val ORDER_VIEW_SHOW_SIMPLE55 = 11//5列
+ const val ORDER_VIEW_SHOW_SIMPLE60 = 12//5列
+ /**
+ *点餐界面可点单份菜品最大数量
+ */
+ const val SHOW_FOOD_ONCE_SOLD_MAXNUM = 9
+ /**
+ *点餐界面历史流水最大数量
+ */
+ const val SHOW_FOOD_CLIENT_HISTORY_MAXNUM = 15
+ const val SHOW_FOOD_WAITER_HISTORY_MAXNUM = 50
+ /**
+ * 点餐菜品对应菜品ID
+ */
+ const val Food_Zhcn_MiFan = "米饭"
+ const val Food_MiFan = "110200000014"
+ /**
+ * 菜品启用状态
+ */
+ const val FOOD_ENABLE = "A"
+ const val FOOD_DISABLE = "C"
+ /**
+ * 点餐背景图配色
+ */
+ const val COLOR_BG_0 = 0
+ const val COLOR_BG_1 = 1
+ const val COLOR_BG_2 = 2
+ const val COLOR_BG_3 = 3
+ const val COLOR_BG_4 = 4
+ const val COLOR_BG_5 = 5
+ const val COLOR_BG_6 = 6
+ const val COLOR_BG_7 = 7
+ const val COLOR_BG_8 = 8
+ const val COLOR_BG_9 = 9
+
+ /**
+ * 寻卡间隔
+ */
+ const val FIND_CARD_GAP = 200L
+
+
+ /**
+ * 包间点餐(ms)
+ */
+ const val ROOM_ANIMATION_BUTTON_GAP: Long = 600
+ /**
+ *反扫二维码间隔(ms)
+ */
+ const val ORDER_QRCODE_GAP: Long = 5000
+ /**
+ * 点餐模式
+ */
+ const val ORDER_MODE_CLIENT_POPULAR = "clientPopular" //用户大众模式
+ const val ORDER_MODE_WAITER_POPULAR = "waiterPopular" //服务员大众模式
+ const val ORDER_MODE_CALL_POPULAR = "callPopular" //叫号模式
+ const val ORDER_MODE_PRIVATE_ROOM = "privateRoom" //包间模式
+
+
+ /**
+ * 包间模式参数key
+ */
+ const val ARG_ROOM_ID = "roomId"
+ const val ARG_ROOM_NAME = "roomName"
+ const val ARG_ROOM_BILLNO = "roomBillno"
+
+ const val SYSPROP_NAVIBAR = "persist.sys.hidenavibar"
+
+ const val PRINT_FOOD_ALL = 0
+ const val PRINT_FOOD_HUN = 1
+ const val PRINT_FOOD_SU = 2
+ const val BG_SERVICE_NAME = "com.supwisdom.dcpos.service.BackgroundTaskService"
+
+
+ /**
+ * 人脸识别常量
+ */
+ const val KEY_EXTRA_BUNDLE = "key_extra_bundle"
+ const val KEY_EXTRA_AMT = "key_extra_amt"
+ const val KEY_BUNDLE_FACEDATA = "key_bundle_facedata"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/utils/ThreadPool.kt b/app/src/main/java/com/supwisdom/utils/ThreadPool.kt
new file mode 100644
index 0000000..eab9150
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/utils/ThreadPool.kt
@@ -0,0 +1,170 @@
+package com.supwisdom.utils
+
+import java.util.concurrent.Executors
+import java.util.concurrent.LinkedBlockingQueue
+import java.util.concurrent.ThreadPoolExecutor
+import java.util.concurrent.TimeUnit
+
+/**
+ ** create by zzq on 2019/7/23
+ ** @desc
+ **/
+object ThreadPool {
+ private val DEFAULT_SINGLE_POOL_NAME = "DEFAULT_SINGLE_POOL_NAME"
+
+ private var mLongPool: ThreadPoolProxy? = null
+ private var mShortPool: ThreadPoolProxy? = null
+ private var mDownloadPool: ThreadPoolProxy? = null
+ private val mMap = hashMapOf<String, ThreadPoolProxy>()
+
+ /**
+ * 获取下载线程
+ */
+ fun getDownloadPool(): ThreadPoolProxy {
+ if (mDownloadPool == null) {
+ synchronized(ThreadPool::class.java) {
+ if (mDownloadPool == null) {
+ //获取CPU核数
+ val num = Runtime.getRuntime().availableProcessors()
+ val corePoolSize = num + 1
+ val maximumPoolSize = 2 * num + 1
+ mDownloadPool = ThreadPoolProxy(corePoolSize, maximumPoolSize, 1L)
+ }
+ }
+ }
+ return mDownloadPool!!
+ }
+
+ /**
+ * 获取一个用于执行长耗时任务的线程池,避免和短耗时任务处在同一个队列而阻塞了重要的短耗时任务,通常用来联网操作
+ */
+
+ fun getLongPool(): ThreadPoolProxy {
+ if (mLongPool == null) {
+ synchronized(ThreadPool::class.java) {
+ if (mLongPool == null) {
+ //获取CPU核数
+ val num = Runtime.getRuntime().availableProcessors()
+ val corePoolSize = num + 1
+ val maximumPoolSize = 2 * num + 1
+ mLongPool = ThreadPoolProxy(corePoolSize, maximumPoolSize, 1L)
+ }
+ }
+ }
+ return mLongPool!!
+ }
+
+ /**
+ * 获取一个用于执行短耗时任务的线程池,避免因为和耗时长的任务处在同一个队列而长时间得不到执行,通常用来执行本地的IO/SQL
+ */
+ fun getShortPool(): ThreadPoolProxy {
+ if (mShortPool == null) {
+ synchronized(ThreadPool::class.java) {
+ if (mShortPool == null) {
+ //获取CPU核数
+ val num = Runtime.getRuntime().availableProcessors()
+ val corePoolSize = num + 1
+ val maximumPoolSize = 2 * num + 1
+ mShortPool = ThreadPoolProxy(corePoolSize, maximumPoolSize, 1L)
+ }
+ }
+ }
+ return mShortPool!!
+ }
+
+ /**
+ * 获取一个单线程池,所有任务将会被按照加入的顺序执行,免除了同步开销的问题
+ */
+ fun getSinglePool(): ThreadPoolProxy {
+ return getSinglePool(DEFAULT_SINGLE_POOL_NAME)
+ }
+
+ /**
+ * 获取一个单线程池,所有任务将会被按照加入的顺序执行,免除了同步开销的问题
+ */
+ fun getSinglePool(name: String): ThreadPoolProxy {
+ synchronized(ThreadPool::class.java) {
+ var singlePool: ThreadPoolProxy? = mMap[name]
+ if (singlePool == null) {
+ singlePool = ThreadPoolProxy(1, 1, 1L)
+ mMap[name] = singlePool
+ }
+ return singlePool
+ }
+ }
+
+ class ThreadPoolProxy constructor(
+ private val mCorePoolSize: Int,
+ private val mMaximumPoolSize: Int,
+ private val mKeepAliveTime: Long
+ ) {
+ private var mPool: ThreadPoolExecutor? = null
+
+ /**
+ * 执行任务,当线程池处于关闭,将会重新创建新的线程池
+ */
+ @Synchronized
+ fun execute(run: Runnable) {
+ if (mPool == null || mPool!!.isShutdown) {
+ //参数说明
+ //当线程池中的线程小于mCorePoolSize,直接创建新的线程加入线程池执行任务
+ //当线程池中的线程数目等于mCorePoolSize,将会把任务放入任务队列BlockingQueue中
+ //当BlockingQueue中的任务放满了,将会创建新的线程去执行,
+ //但是当总线程数大于mMaximumPoolSize时,将会抛出异常,交给RejectedExecutionHandler处理
+ //mKeepAliveTime是线程执行完任务后,且队列中没有可以执行的任务,存活的时间,后面的参数是时间单位
+ //ThreadFactory是每次创建新的线程工厂
+ mPool = ThreadPoolExecutor(
+ mCorePoolSize,
+ mMaximumPoolSize,
+ mKeepAliveTime,
+ TimeUnit.MILLISECONDS,
+ LinkedBlockingQueue(),
+ Executors.defaultThreadFactory(),
+ ThreadPoolExecutor.AbortPolicy()
+ )
+ }
+ mPool!!.execute(run)
+ }
+
+ /**
+ * 取消线程池中某个还未执行的任务
+ */
+ @Synchronized
+ fun cancel(run: Runnable) {
+ if (mPool != null && (!mPool!!.isShutdown || mPool!!.isTerminating)) {
+ mPool!!.queue.remove(run)
+ }
+ }
+
+ /**
+ * 取消线程池中某个还未执行的任务
+ */
+ @Synchronized
+ operator fun contains(run: Runnable): Boolean {
+ return if (mPool != null && (!mPool!!.isShutdown || mPool!!.isTerminating)) {
+ mPool!!.queue.contains(run)
+ } else {
+ false
+ }
+ }
+
+ /**
+ * 立刻关闭线程池,并且正在执行的任务也将会被中断
+ */
+ fun stop() {
+ if (mPool != null && (!mPool!!.isShutdown || mPool!!.isTerminating)) {
+ mPool!!.shutdownNow()
+ }
+ }
+
+ /**
+ * 平缓关闭单任务线程池,但是会确保所有已经加入的任务都将会被执行完毕才关闭
+ */
+ @Synchronized
+ fun shutdown() {
+ if (mPool != null && (!mPool!!.isShutdown || mPool!!.isTerminating)) {
+ mPool!!.shutdownNow()
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/utils/Util.kt b/app/src/main/java/com/supwisdom/utils/Util.kt
new file mode 100644
index 0000000..e9fb0df
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/utils/Util.kt
@@ -0,0 +1,167 @@
+package com.supwisdom.utils
+
+import java.lang.Exception
+import java.util.regex.Pattern
+
+/**
+ * @author zzq
+ * @date 2018/3/20.
+ * @version 1.0.1
+ * @desc TODO
+ */
+fun ByteArray.encodeHex(): String {
+ val res = StringBuilder()
+ forEach {
+ res.append("%02X".format(it.toInt() and 0xFF))
+ }
+ return res.toString()
+}
+
+fun String.decodeHex(): ByteArray {
+ if (this.isEmpty() || this.length % 2 != 0) {
+ throw Exception("不合法的数据")
+ }
+ return (0 until this.length step 2).map {
+ val v = this.substring(it, it + 2).toInt(16)
+ (v and 0xFF).toByte()
+ }.toByteArray()
+}
+
+fun String.encodeBCD(): ByteArray {
+ if (this.isEmpty() || this.length % 2 != 0) {
+ throw Exception("不合法的数据")
+ }
+ return (0 until this.length step 2).map {
+ val d = this.substring(it, it + 2)
+ val b1 = d[0].toInt() - 0x30
+ val b2 = d[1].toInt() - 0x30
+ if (b1 !in 0..9 || b2 !in 0..9) {
+ throw Exception("不合法的BCD格式数据<$this>")
+ }
+ ((b1.shl(4) or b2) and 0xFF).toByte()
+ }.toByteArray()
+}
+
+fun ByteArray.decodeBCD(): String {
+ return joinToString(separator = "") {
+ val b1 = it.unsignedToInt().shr(4)
+ val b2 = it.unsignedToInt() and 0x0F
+ if (b1 !in 0..9 || b2 !in 0..9) {
+ throw Exception("不合法的数据")
+ }
+ "%01d%01d".format(b1, b2)
+ }
+}
+
+fun byteArrayTohex(data: ByteArray, startPos: Int, byteLength: Int): String {
+ val res = StringBuilder()
+ data.forEachIndexed { index, s ->
+ if (index >= startPos && index < startPos + byteLength) {
+ res.append("%02X".format(s.unsignedToInt() and 0xFF))
+ }
+ }
+ return res.toString()
+}
+
+fun Byte.unsignedToInt(): Int {
+ return this.toInt() and 0xFF
+}
+
+fun Byte.unsignedToLong(): Long {
+ return this.toLong() and 0xFF
+}
+
+fun byteArrayToIntLe(data: ByteArray, startPos: Int, byteLength: Int): Int {
+ var res = 0
+ data.forEachIndexed { index, s ->
+ if (index >= startPos && index < startPos + byteLength) {
+ res = res or (s.unsignedToInt() shl ((index - startPos) shl 3))
+ }
+ }
+ return res
+}
+
+fun byteArrayToIntBe(data: ByteArray, startPos: Int, byteLength: Int): Int {
+ var res = 0
+ data.forEachIndexed { index, s ->
+ if (index >= startPos && index < startPos + byteLength) {
+ res = (res shl 8) or s.unsignedToInt()
+ }
+ }
+ return res
+}
+
+fun byteArrayToLongBe(data: ByteArray, startPos: Int, byteLength: Int): Long {
+ var res: Long = 0
+ data.forEachIndexed { index, s ->
+ if (index >= startPos && index < startPos + byteLength) {
+ res = (res shl 8) or s.toLong()
+ }
+ }
+ return res
+}
+
+fun byteArrayToLongLe(data: ByteArray): Long {
+ var res: Long = 0
+ data.forEachIndexed { index, s ->
+ res = res or ((s.toLong() and 0xFF) shl (index shl 3))
+ }
+ return res
+}
+
+
+fun intBeToByteArray(value: Int, byteLen: Int = 4): ByteArray {
+ if (byteLen !in 1..4) {
+ throw Exception("数据长度错误")
+ }
+ val res = "%08X".format(value).decodeHex()
+ return res.copyOfRange(4 - byteLen, 4)
+}
+
+fun intBeToByteArray(value: Int, data: ByteArray, startPos: Int, byteLen: Int) {
+ if (byteLen !in 1..4) {
+ throw Exception("数据长度错误")
+ }
+ val res = "%08X".format(value).decodeHex()
+ (startPos until startPos + byteLen).forEach {
+ data[it] = res[4 - byteLen + it - startPos]
+ }
+
+}
+
+fun longBeToByteArray(value: Long, byteLen: Int = 4): ByteArray {
+ if (byteLen !in 1..8) {
+ throw Exception("数据长度错误")
+ }
+ val res = ByteArray(8) { 0x00 }
+ (0..7).forEach {
+ res[it] = ((value shr ((7 - it) shl 3)) and 0xFF).toByte()
+ }
+ return res.copyOfRange(8 - byteLen, 8)
+}
+
+fun intLeToByteArray(value: Int, byteLen: Int = 4): ByteArray {
+ if (byteLen !in 1..4) {
+ throw Exception("数据长度错误")
+ }
+ val res = ByteArray(4) { 0x00 }
+ (0..3).forEach {
+ res[it] = ((value shr (it shl 3)) and 0xFF).toByte()
+ }
+ return res.copyOfRange(0, byteLen)
+}
+
+fun intLeToByteArray(value: Int, data: ByteArray, startPos: Int, byteLen: Int) {
+ if (byteLen !in 1..4) {
+ throw Exception("数据长度错误")
+ }
+ (0..3).forEach {
+ data[it + startPos] = ((value shr (it shl 3)) and 0xFF).toByte()
+ }
+}
+
+/**验证IP格式*/
+fun verifyIpFormat(ip: String): Boolean {
+ val pattern = Pattern.compile("")
+ return pattern.matcher(ip).matches()
+}
diff --git a/app/src/main/java/com/supwisdom/view/DialogBase.kt b/app/src/main/java/com/supwisdom/view/DialogBase.kt
new file mode 100644
index 0000000..bb6d40b
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/view/DialogBase.kt
@@ -0,0 +1,47 @@
+package com.supwisdom.view
+
+import android.app.Activity
+import android.app.Dialog
+import android.content.Context
+import com.supwisdom.R
+
+/**
+ * @author zzq
+ * @date 2018/6/7
+ * @desc 基类dialog
+ */
+open class DialogBase constructor(context: Context) : Dialog(context, R.style.FloatingDialog) {
+ private val ctx = context
+
+ override fun show() {
+ if (ctx is Activity) {
+ if (!ctx.isFinishing) {
+ //防止activity处于销毁状态
+ //android.view.WindowManager$BadTokenException: Unable to add window
+ // -- token android.os.BinderProxy@41b43ec0 is not valid; is your activity running
+ super.show()
+ }
+ } else {
+// val activity = (ctx as ContextWrapper).baseContext as Activity
+// if (!activity.isFinishing) {
+ //防止activity处于销毁状态
+ //android.view.WindowManager$BadTokenException: Unable to add window
+ // -- token android.os.BinderProxy@41b43ec0 is not valid; is your activity running
+ super.show()
+// }
+ }
+ }
+
+ override fun dismiss() {
+ if (ctx is Activity) {
+ if (!ctx.isFinishing) {
+ super.dismiss()
+ }
+ } else {
+// val activity = (ctx as ContextWrapper).baseContext as Activity
+// if (!activity.isFinishing) {
+ super.dismiss()
+// }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/view/ListViewUtil.kt b/app/src/main/java/com/supwisdom/view/ListViewUtil.kt
new file mode 100644
index 0000000..cef2581
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/view/ListViewUtil.kt
@@ -0,0 +1,43 @@
+package com.supwisdom.view
+
+import android.widget.ListView
+
+/**
+ * @author zzq
+ * @date 2018/5/9.
+ * @version 1.0.1
+ * @desc 动态测量adapter listview的高度
+ */
+object ListViewUtil {
+ fun setListViewHeightBasedOnChildren(listView: ListView) {
+ val listAdapter = listView.adapter ?: return
+
+ var totalHeight = 0
+ for (i in 0 until listAdapter.count) {
+ val listItem = listAdapter.getView(i, null, listView)
+ listItem.measure(0, 0)
+ totalHeight += listItem.measuredHeight
+ }
+
+ val params = listView.layoutParams
+ params.height = totalHeight + listView.dividerHeight * (listAdapter.count - 1)
+ listView.layoutParams = params
+ }
+
+ fun getListViewHeightBasedOnChildren(listView: ListView): Int {
+ val listAdapter = listView.adapter
+ var totalHeight = 0
+ for (i in 0 until listAdapter.count) {
+ val listItem = listAdapter.getView(i, null, listView)
+ listItem.measure(0, 0)
+ totalHeight += listItem.measuredHeight
+ }
+ return totalHeight + listView.dividerHeight * (listAdapter.count - 1)
+ }
+
+ fun setListViewHeight(listView: ListView, height: Int) {
+ val params = listView.layoutParams
+ params.height = height
+ listView.layoutParams = params
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/view/RecyclerViewUtil.kt b/app/src/main/java/com/supwisdom/view/RecyclerViewUtil.kt
new file mode 100644
index 0000000..58d4fa2
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/view/RecyclerViewUtil.kt
@@ -0,0 +1,26 @@
+package com.supwisdom.view
+
+import android.graphics.Rect
+import android.support.v7.widget.RecyclerView
+import android.view.View
+
+/**
+ * @author zzq
+ * @date 2018/6/21
+ * @desc TODO
+ */
+class RecyclerViewUtil {
+ class ItemDecoration constructor(top: Int, bottom: Int, left: Int, right: Int) : RecyclerView.ItemDecoration() {
+ private val top = top
+ private val bottom = bottom
+ private val left = left
+ private val right = right
+ override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
+ super.getItemOffsets(outRect, view, parent, state)
+ outRect!!.top = top
+ outRect.left = left
+ outRect.bottom = bottom
+ outRect.right = right
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/view/ToastUtil.kt b/app/src/main/java/com/supwisdom/view/ToastUtil.kt
new file mode 100644
index 0000000..7d82257
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/view/ToastUtil.kt
@@ -0,0 +1,86 @@
+package com.supwisdom.view
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.os.CountDownTimer
+import android.view.Gravity
+import android.view.LayoutInflater
+import android.widget.TextView
+import android.widget.Toast
+import com.supwisdom.R
+
+/**
+ * @author zzq
+ * @date 2018/3/20.
+ * @version 1.0.1
+ * @desc 界面操作提示
+ */
+@SuppressLint("StaticFieldLeak")
+object ToastUtil {
+ private var toast: Toast? = null
+ private var toastText: TextView? = null
+ private var counter: CountDownTimer? = null
+
+ private var toast1: Toast? = null
+ private var toastText1: TextView? = null
+
+ fun show(context: Context, msg: String) {
+ if (toast1 == null) {
+ toast1 = Toast(context)
+ val view = LayoutInflater.from(context).inflate(R.layout.toast_util, null)
+ toastText1 = view.findViewById(R.id.toasttext) as TextView
+ toast1!!.setGravity(Gravity.CENTER, 0, 0)
+ toast1!!.duration = Toast.LENGTH_SHORT
+ toast1!!.view = view
+ }
+ toastText1!!.text = msg
+ toast1!!.show()
+ }
+
+ fun show(context: Context, msg: String, listener: ShowListener?) {
+ if (toast == null) {
+ toast = Toast(context)
+ val view = LayoutInflater.from(context).inflate(R.layout.toast_util, null)
+
+ toastText = view.findViewById(R.id.toasttext) as TextView
+ toast!!.setGravity(Gravity.CENTER, 0, 0)
+ toast!!.duration = Toast.LENGTH_LONG
+ toast!!.view = view
+ }
+ toastText!!.text = msg
+ toast!!.show()
+ if (counter == null) {
+ counter = object : CountDownTimer(2000, 200) {
+ override fun onTick(millisUntilFinished: Long) {
+
+ }
+
+ override fun onFinish() {
+ listener?.callback()
+ toast!!.cancel()
+ }
+ }
+ } else {
+ counter!!.cancel()
+ counter = object : CountDownTimer(2000, 200) {
+ override fun onTick(millisUntilFinished: Long) {
+
+ }
+
+ override fun onFinish() {
+ listener?.callback()
+ toast!!.cancel()
+ }
+ }
+ }
+ counter!!.start()
+ }
+
+ fun cancel() {
+ toast!!.cancel()
+ }
+
+ interface ShowListener {
+ fun callback()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/jniLibs/arm64-v8a/libalipay_code_verify.so b/app/src/main/jniLibs/arm64-v8a/libalipay_code_verify.so
new file mode 100644
index 0000000..8437590
--- /dev/null
+++ b/app/src/main/jniLibs/arm64-v8a/libalipay_code_verify.so
Binary files differ
diff --git a/app/src/main/jniLibs/arm64-v8a/libauxScreen.so b/app/src/main/jniLibs/arm64-v8a/libauxScreen.so
new file mode 100644
index 0000000..01741bf
--- /dev/null
+++ b/app/src/main/jniLibs/arm64-v8a/libauxScreen.so
Binary files differ
diff --git a/app/src/main/jniLibs/arm64-v8a/libcrypto.so b/app/src/main/jniLibs/arm64-v8a/libcrypto.so
new file mode 100644
index 0000000..e4841ff
--- /dev/null
+++ b/app/src/main/jniLibs/arm64-v8a/libcrypto.so
Binary files differ
diff --git a/app/src/main/jniLibs/arm64-v8a/libiccV108.so b/app/src/main/jniLibs/arm64-v8a/libiccV108.so
new file mode 100644
index 0000000..608edea
--- /dev/null
+++ b/app/src/main/jniLibs/arm64-v8a/libiccV108.so
Binary files differ
diff --git a/app/src/main/jniLibs/arm64-v8a/libiccV110.so b/app/src/main/jniLibs/arm64-v8a/libiccV110.so
new file mode 100644
index 0000000..c2ef8cc
--- /dev/null
+++ b/app/src/main/jniLibs/arm64-v8a/libiccV110.so
Binary files differ
diff --git a/app/src/main/jniLibs/arm64-v8a/libiccV115.so b/app/src/main/jniLibs/arm64-v8a/libiccV115.so
new file mode 100644
index 0000000..61635a1
--- /dev/null
+++ b/app/src/main/jniLibs/arm64-v8a/libiccV115.so
Binary files differ
diff --git a/app/src/main/jniLibs/arm64-v8a/libiccV116.so b/app/src/main/jniLibs/arm64-v8a/libiccV116.so
new file mode 100644
index 0000000..c2ef8cc
--- /dev/null
+++ b/app/src/main/jniLibs/arm64-v8a/libiccV116.so
Binary files differ
diff --git a/app/src/main/jniLibs/arm64-v8a/libpiccV108.so b/app/src/main/jniLibs/arm64-v8a/libpiccV108.so
new file mode 100644
index 0000000..c62695a
--- /dev/null
+++ b/app/src/main/jniLibs/arm64-v8a/libpiccV108.so
Binary files differ
diff --git a/app/src/main/jniLibs/arm64-v8a/libpiccV115.so b/app/src/main/jniLibs/arm64-v8a/libpiccV115.so
new file mode 100644
index 0000000..df17f28
--- /dev/null
+++ b/app/src/main/jniLibs/arm64-v8a/libpiccV115.so
Binary files differ
diff --git a/app/src/main/jniLibs/arm64-v8a/libpiccV116.so b/app/src/main/jniLibs/arm64-v8a/libpiccV116.so
new file mode 100644
index 0000000..df17f28
--- /dev/null
+++ b/app/src/main/jniLibs/arm64-v8a/libpiccV116.so
Binary files differ
diff --git a/app/src/main/jniLibs/arm64-v8a/libserial_port.so b/app/src/main/jniLibs/arm64-v8a/libserial_port.so
new file mode 100644
index 0000000..7cd1a8a
--- /dev/null
+++ b/app/src/main/jniLibs/arm64-v8a/libserial_port.so
Binary files differ
diff --git a/app/src/main/jniLibs/arm64-v8a/libssl.so b/app/src/main/jniLibs/arm64-v8a/libssl.so
new file mode 100644
index 0000000..cea745d
--- /dev/null
+++ b/app/src/main/jniLibs/arm64-v8a/libssl.so
Binary files differ
diff --git a/app/src/main/jniLibs/arm64-v8a/libswbarcode.so b/app/src/main/jniLibs/arm64-v8a/libswbarcode.so
new file mode 100644
index 0000000..f7c2d94
--- /dev/null
+++ b/app/src/main/jniLibs/arm64-v8a/libswbarcode.so
Binary files differ
diff --git a/app/src/main/jniLibs/armeabi-v7a/libalipay_code_verify.so b/app/src/main/jniLibs/armeabi-v7a/libalipay_code_verify.so
new file mode 100644
index 0000000..2419998
--- /dev/null
+++ b/app/src/main/jniLibs/armeabi-v7a/libalipay_code_verify.so
Binary files differ
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..6348baa
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,34 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:aapt="http://schemas.android.com/aapt"
+ android:width="108dp"
+ android:height="108dp"
+ android:viewportHeight="108"
+ android:viewportWidth="108">
+ <path
+ android:fillType="evenOdd"
+ android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
+ android:strokeColor="#00000000"
+ android:strokeWidth="1">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:endX="78.5885"
+ android:endY="90.9159"
+ android:startX="48.7653"
+ android:startY="61.0927"
+ android:type="linear">
+ <item
+ android:color="#44000000"
+ android:offset="0.0"/>
+ <item
+ android:color="#00000000"
+ android:offset="1.0"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+ <path
+ android:fillColor="#FFFFFF"
+ android:fillType="nonZero"
+ android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
+ android:strokeColor="#00000000"
+ android:strokeWidth="1"/>
+</vector>
diff --git a/app/src/main/res/drawable/anonymous.jpg b/app/src/main/res/drawable/anonymous.jpg
new file mode 100644
index 0000000..9e4672e
--- /dev/null
+++ b/app/src/main/res/drawable/anonymous.jpg
Binary files differ
diff --git a/app/src/main/res/drawable/bcg.png b/app/src/main/res/drawable/bcg.png
new file mode 100644
index 0000000..1664e83
--- /dev/null
+++ b/app/src/main/res/drawable/bcg.png
Binary files differ
diff --git a/app/src/main/res/drawable/bg_dps_corner.xml b/app/src/main/res/drawable/bg_dps_corner.xml
new file mode 100644
index 0000000..9236194
--- /dev/null
+++ b/app/src/main/res/drawable/bg_dps_corner.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="#ee1"/>
+ <corners android:radius="8dip"/>
+ <stroke
+ android:width="1.0dip"
+ android:color="#e22221"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/big_progress_bg.xml b/app/src/main/res/drawable/big_progress_bg.xml
new file mode 100644
index 0000000..55134ec
--- /dev/null
+++ b/app/src/main/res/drawable/big_progress_bg.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<rotate xmlns:android="http://schemas.android.com/apk/res/android"
+ android:drawable="@drawable/loading_white"
+ android:fromDegrees="0"
+ android:interpolator="@android:anim/cycle_interpolator"
+ android:pivotX="50%"
+ android:pivotY="50%"
+ android:toDegrees="1440" />
diff --git a/app/src/main/res/drawable/btn_cancel_selector.xml b/app/src/main/res/drawable/btn_cancel_selector.xml
new file mode 100644
index 0000000..5543cba
--- /dev/null
+++ b/app/src/main/res/drawable/btn_cancel_selector.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:state_focused="true" android:state_pressed="false">
+ <shape>
+ <solid android:color="#cccccc" />
+ <corners android:radius="8.0dip" />
+ </shape>
+ </item>
+ <item android:state_selected="true">
+ <shape>
+ <solid android:color="#bfbfbf" />
+ <corners android:radius="8.0dip" />
+ </shape>
+ </item>
+ <item android:state_pressed="true">
+ <shape>
+ <solid android:color="#bfbfbf" />
+ <corners android:radius="8.0dip" />
+ </shape>
+ </item>
+ <item android:state_pressed="false">
+ <shape>
+ <solid android:color="#cccccc" />
+ <corners android:radius="8.0dip" />
+ </shape>
+ </item>
+
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/btn_num_selector.xml b/app/src/main/res/drawable/btn_num_selector.xml
new file mode 100644
index 0000000..498dc49
--- /dev/null
+++ b/app/src/main/res/drawable/btn_num_selector.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:state_focused="true" android:state_pressed="false">
+ <shape>
+ <solid android:color="#fff" />
+ <corners android:radius="8.0dip" />
+ <stroke android:width="1.0dip" android:color="#DEDBDE" />
+ </shape>
+ </item>
+ <item android:state_selected="true">
+ <shape>
+ <solid android:color="#bfbfbf" />
+ <corners android:radius="8.0dip" />
+ <stroke android:width="1.0dip" android:color="#DEDBDE" />
+ </shape>
+ </item>
+ <item android:state_pressed="true">
+ <shape>
+ <solid android:color="#bfbfbf" />
+ <corners android:radius="8.0dip" />
+ <stroke android:width="1.0dip" android:color="#DEDBDE" />
+ </shape>
+ </item>
+ <item android:state_pressed="false">
+ <shape>
+ <solid android:color="#fff" />
+ <corners android:radius="8.0dip" />
+ <stroke android:width="1.0dip" android:color="#DEDBDE" />
+ </shape>
+ </item>
+
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/btn_ok_selector.xml b/app/src/main/res/drawable/btn_ok_selector.xml
new file mode 100644
index 0000000..8ee6c40
--- /dev/null
+++ b/app/src/main/res/drawable/btn_ok_selector.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:state_focused="true" android:state_pressed="false">
+ <shape>
+ <solid android:color="#08ae9e" />
+ <corners android:radius="8.0dip" />
+ </shape>
+ </item>
+ <item android:state_selected="true">
+ <shape>
+ <solid android:color="#08a191" />
+ <corners android:radius="8.0dip" />
+ </shape>
+ </item>
+ <item android:state_pressed="true">
+ <shape>
+ <solid android:color="#08a191" />
+ <corners android:radius="8.0dip" />
+ </shape>
+ </item>
+ <item android:state_pressed="false">
+ <shape>
+ <solid android:color="#08ae9e" />
+ <corners android:radius="8.0dip" />
+ </shape>
+ </item>
+
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/btn_ok_selector_nocorner.xml b/app/src/main/res/drawable/btn_ok_selector_nocorner.xml
new file mode 100644
index 0000000..4cdb60c
--- /dev/null
+++ b/app/src/main/res/drawable/btn_ok_selector_nocorner.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:state_focused="true" android:state_pressed="false">
+ <shape>
+ <solid android:color="#08ae9e" />
+ </shape>
+ </item>
+ <item android:state_selected="true">
+ <shape>
+ <solid android:color="#08a191" />
+ </shape>
+ </item>
+ <item android:state_pressed="true">
+ <shape>
+ <solid android:color="#08a191" />
+ </shape>
+ </item>
+ <item android:state_pressed="false">
+ <shape>
+ <solid android:color="#08ae9e" />
+ </shape>
+ </item>
+
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/btn_ok_white_selector.xml b/app/src/main/res/drawable/btn_ok_white_selector.xml
new file mode 100644
index 0000000..1db82f7
--- /dev/null
+++ b/app/src/main/res/drawable/btn_ok_white_selector.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:state_focused="true" android:state_pressed="false">
+ <shape>
+ <solid android:color="#fff" />
+ </shape>
+ </item>
+ <item android:state_selected="true">
+ <shape>
+ <solid android:color="#fff4f4f4" />
+ </shape>
+ </item>
+ <item android:state_pressed="true">
+ <shape>
+ <solid android:color="#fff4f4f4" />
+ </shape>
+ </item>
+ <item android:state_pressed="false">
+ <shape>
+ <solid android:color="#fff" />
+ </shape>
+ </item>
+
+</selector>
\ No newline at end of file
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_1.xml b/app/src/main/res/drawable/corner_bg_1.xml
new file mode 100644
index 0000000..e6721a9
--- /dev/null
+++ b/app/src/main/res/drawable/corner_bg_1.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="#e0e0e0e0" />
+ <corners android:radius="8dip" />
+ <stroke
+ android:width="1.0dip"
+ android:color="#80ffffff" />
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/corner_bg_dialog.xml b/app/src/main/res/drawable/corner_bg_dialog.xml
new file mode 100644
index 0000000..2276ba2
--- /dev/null
+++ b/app/src/main/res/drawable/corner_bg_dialog.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="#e6e6e6"/>
+ <corners android:radius="12dip"/>
+ <stroke
+ android:width="1.0dip"
+ android:color="#e6e6e6"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/corner_bg_dps_crashbtn_focus.xml b/app/src/main/res/drawable/corner_bg_dps_crashbtn_focus.xml
new file mode 100644
index 0000000..1108b54
--- /dev/null
+++ b/app/src/main/res/drawable/corner_bg_dps_crashbtn_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="#7e1508"/>
+ <corners android:radius="12dip"/>
+ <stroke
+ android:width="1.0dip"
+ android:color="#721307"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/corner_bg_dps_crashbtn_normal.xml b/app/src/main/res/drawable/corner_bg_dps_crashbtn_normal.xml
new file mode 100644
index 0000000..7b7d04f
--- /dev/null
+++ b/app/src/main/res/drawable/corner_bg_dps_crashbtn_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="#e24c17"/>
+ <corners android:radius="12dip"/>
+ <stroke
+ android:width="1.0dip"
+ android:color="#cc4616"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/corner_bg_gray.xml b/app/src/main/res/drawable/corner_bg_gray.xml
new file mode 100644
index 0000000..a198688
--- /dev/null
+++ b/app/src/main/res/drawable/corner_bg_gray.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_gray" />
+ <corners android:radius="8dip" />
+ <stroke
+ android:width="1.0dip"
+ android:color="@color/light_gray" />
+</shape>
\ No newline at end of file
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_order_count_green.xml b/app/src/main/res/drawable/corner_bg_order_count_green.xml
new file mode 100644
index 0000000..fe44a58
--- /dev/null
+++ b/app/src/main/res/drawable/corner_bg_order_count_green.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="@color/light_green"/>
+ <corners android:radius="30dip"/>
+ <!--<stroke-->
+ <!--android:width="1.0dip"-->
+ <!--android:color="@color/light_green"/>-->
+ <gradient
+ android:angle="90"
+ android:endColor="@color/light_green2"
+ android:startColor="@color/light_green1"/>
+ <padding
+ android:bottom="1dp"
+ android:left="1dp"
+ android:right="1dp"
+ android:top="1dp"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/corner_bg_order_red.xml b/app/src/main/res/drawable/corner_bg_order_red.xml
new file mode 100644
index 0000000..5fa9c71
--- /dev/null
+++ b/app/src/main/res/drawable/corner_bg_order_red.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <corners android:radius="30dip"/>
+ <!--<stroke-->
+ <!--android:width="1.0dip"-->
+ <!--android:color="@color/cl_red"/>-->
+ <gradient
+ android:angle="90"
+ android:endColor="@color/cl_red"
+ android:startColor="@color/light_purple1"/>
+ <padding
+ android:bottom="1dp"
+ android:left="1dp"
+ android:right="1dp"
+ android:top="1dp"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/corner_bg_ordinary_consume_focus.xml b/app/src/main/res/drawable/corner_bg_ordinary_consume_focus.xml
new file mode 100644
index 0000000..0f93672
--- /dev/null
+++ b/app/src/main/res/drawable/corner_bg_ordinary_consume_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_ordinary_consume_green.xml b/app/src/main/res/drawable/corner_bg_ordinary_consume_green.xml
new file mode 100644
index 0000000..d644a75
--- /dev/null
+++ b/app/src/main/res/drawable/corner_bg_ordinary_consume_green.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="#E3EFFF"/>
+ <corners android:radius="12dip"/>
+ <stroke
+ android:width="1.0dip"
+ android:color="#E3EFFF"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/corner_bg_ordinary_consume_normal.xml b/app/src/main/res/drawable/corner_bg_ordinary_consume_normal.xml
new file mode 100644
index 0000000..19b5879
--- /dev/null
+++ b/app/src/main/res/drawable/corner_bg_ordinary_consume_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="#e0e0e0e0"/>
+ <corners android:radius="12dip"/>
+ <stroke
+ android:width="1.0dip"
+ android:color="#e0e0e0e0"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/corner_bg_qrcode_hint.xml b/app/src/main/res/drawable/corner_bg_qrcode_hint.xml
new file mode 100644
index 0000000..4f37389
--- /dev/null
+++ b/app/src/main/res/drawable/corner_bg_qrcode_hint.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/orange1" />
+ <corners android:radius="30dip" />
+ <!--<stroke-->
+ <!--android:width="1.0dip"-->
+ <!--android:color="@color/cl_red" />-->
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/corner_bg_simple_order.xml b/app/src/main/res/drawable/corner_bg_simple_order.xml
new file mode 100644
index 0000000..3fd3f7e
--- /dev/null
+++ b/app/src/main/res/drawable/corner_bg_simple_order.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_green"/>
+ <corners android:radius="30dip"/>
+ <stroke
+ android:width="0.5dip"
+ android:color="@color/cl_red"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/corner_bg_simple_order_1.xml b/app/src/main/res/drawable/corner_bg_simple_order_1.xml
new file mode 100644
index 0000000..a33bba1
--- /dev/null
+++ b/app/src/main/res/drawable/corner_bg_simple_order_1.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_yellow_3"/>
+ <corners android:radius="8dip"/>
+ <stroke
+ android:width="1.0dip"
+ android:color="@color/light_yellow_3"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/corner_bg_simple_order_2.xml b/app/src/main/res/drawable/corner_bg_simple_order_2.xml
new file mode 100644
index 0000000..10191d2
--- /dev/null
+++ b/app/src/main/res/drawable/corner_bg_simple_order_2.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/order_food_list_bak" />
+ <corners android:radius="8dip" />
+ <stroke
+ android:width="1.0dip"
+ android:color="@color/order_food_list_bak" />
+</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/dps_crash_selector.xml b/app/src/main/res/drawable/dps_crash_selector.xml
new file mode 100644
index 0000000..fa50427
--- /dev/null
+++ b/app/src/main/res/drawable/dps_crash_selector.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_dps_crashbtn_focus" android:state_selected="true"/>
+ <item android:drawable="@drawable/corner_bg_dps_crashbtn_focus" android:state_pressed="true"/>
+ <item android:drawable="@drawable/corner_bg_dps_crashbtn_normal"/>
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/food_corner_bg.xml b/app/src/main/res/drawable/food_corner_bg.xml
new file mode 100644
index 0000000..5c1aca5
--- /dev/null
+++ b/app/src/main/res/drawable/food_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="#999999" />
+ <corners android:radius="8dip" />
+ <stroke
+ android:width="1.0dip"
+ android:color="#999999" />
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/fudan_logo.png b/app/src/main/res/drawable/fudan_logo.png
new file mode 100644
index 0000000..1a53460
--- /dev/null
+++ b/app/src/main/res/drawable/fudan_logo.png
Binary files differ
diff --git a/app/src/main/res/drawable/fudan_logo2.png b/app/src/main/res/drawable/fudan_logo2.png
new file mode 100644
index 0000000..350562b
--- /dev/null
+++ b/app/src/main/res/drawable/fudan_logo2.png
Binary files differ
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..a0ad202
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:height="108dp"
+ android:width="108dp"
+ android:viewportHeight="108"
+ android:viewportWidth="108">
+ <path android:fillColor="#008577"
+ android:pathData="M0,0h108v108h-108z"/>
+ <path android:fillColor="#00000000" android:pathData="M9,0L9,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M19,0L19,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M29,0L29,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M39,0L39,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M49,0L49,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M59,0L59,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M69,0L69,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M79,0L79,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M89,0L89,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M99,0L99,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,9L108,9"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,19L108,19"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,29L108,29"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,39L108,39"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,49L108,49"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,59L108,59"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,69L108,69"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,79L108,79"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,89L108,89"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,99L108,99"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M19,29L89,29"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M19,39L89,39"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M19,49L89,49"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M19,59L89,59"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M19,69L89,69"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M19,79L89,79"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M29,19L29,89"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M39,19L39,89"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M49,19L49,89"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M59,19L59,89"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M69,19L69,89"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M79,19L79,89"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+</vector>
diff --git a/app/src/main/res/drawable/item_pressed_selector.xml b/app/src/main/res/drawable/item_pressed_selector.xml
new file mode 100644
index 0000000..d1e814b
--- /dev/null
+++ b/app/src/main/res/drawable/item_pressed_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:drawable="@android:color/darker_gray" android:state_pressed="true"/>
+ <item android:drawable="@android:color/darker_gray" android:state_focused="true"/>
+ <item android:drawable="@android:color/white" android:state_enabled="true"/>
+ <item android:drawable="@android:color/white"/>
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/minus_btn_selector.xml b/app/src/main/res/drawable/minus_btn_selector.xml
new file mode 100644
index 0000000..5f5ba45
--- /dev/null
+++ b/app/src/main/res/drawable/minus_btn_selector.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_selected="true" android:drawable="@drawable/minus_click" />
+ <item android:state_pressed="true" android:drawable="@drawable/minus_click" />
+ <item android:drawable="@drawable/corner_bg_order_red" />
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/order_clear_selector.xml b/app/src/main/res/drawable/order_clear_selector.xml
new file mode 100644
index 0000000..f10f556
--- /dev/null
+++ b/app/src/main/res/drawable/order_clear_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:state_focused="true" android:state_pressed="false" android:drawable="@drawable/order_clear_normal" />
+ <item android:state_selected="true" android:drawable="@drawable/order_clear_focus" />
+ <item android:state_pressed="true" android:drawable="@drawable/order_clear_focus" />
+ <item android:state_pressed="false" android:drawable="@drawable/order_clear_normal" />
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/order_pay_selector.xml b/app/src/main/res/drawable/order_pay_selector.xml
new file mode 100644
index 0000000..4c123ac
--- /dev/null
+++ b/app/src/main/res/drawable/order_pay_selector.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_selected="true" android:drawable="@drawable/order_purchase_focus" />
+ <item android:state_pressed="true" android:drawable="@drawable/order_purchase_focus" />
+ <item android:drawable="@drawable/order_purchase_normal" />
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/pay_ret_dialog_bg.xml b/app/src/main/res/drawable/pay_ret_dialog_bg.xml
new file mode 100644
index 0000000..705a8f3
--- /dev/null
+++ b/app/src/main/res/drawable/pay_ret_dialog_bg.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<shape android:shape="rectangle"
+ xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="@color/viewfinder_mask" />
+ <corners android:radius="6.0dip" />
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/progress_bg.xml b/app/src/main/res/drawable/progress_bg.xml
new file mode 100644
index 0000000..55134ec
--- /dev/null
+++ b/app/src/main/res/drawable/progress_bg.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<rotate xmlns:android="http://schemas.android.com/apk/res/android"
+ android:drawable="@drawable/loading_white"
+ android:fromDegrees="0"
+ android:interpolator="@android:anim/cycle_interpolator"
+ android:pivotX="50%"
+ android:pivotY="50%"
+ android:toDegrees="1440" />
diff --git a/app/src/main/res/drawable/progress_horizontal.xml b/app/src/main/res/drawable/progress_horizontal.xml
new file mode 100644
index 0000000..8014563
--- /dev/null
+++ b/app/src/main/res/drawable/progress_horizontal.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
+
+<item
+ android:id="@android:id/background"
+ android:drawable="@color/pos_theme_color">
+</item>
+<item android:id="@android:id/secondaryProgress">
+ <scale
+ android:drawable="@color/light_gray"
+ android:scaleWidth="100%" />
+</item>
+<item android:id="@android:id/progress">
+ <scale
+ android:drawable="@color/cl_red"
+ android:scaleWidth="100%" />
+</item>
+
+</layer-list>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/purchase_cardagain.jpg b/app/src/main/res/drawable/purchase_cardagain.jpg
new file mode 100644
index 0000000..ae09d7f
--- /dev/null
+++ b/app/src/main/res/drawable/purchase_cardagain.jpg
Binary files differ
diff --git a/app/src/main/res/drawable/purchase_cardread.jpg b/app/src/main/res/drawable/purchase_cardread.jpg
new file mode 100644
index 0000000..5ab9972
--- /dev/null
+++ b/app/src/main/res/drawable/purchase_cardread.jpg
Binary files differ
diff --git a/app/src/main/res/drawable/purchase_fail.jpg b/app/src/main/res/drawable/purchase_fail.jpg
new file mode 100644
index 0000000..68c4cb9
--- /dev/null
+++ b/app/src/main/res/drawable/purchase_fail.jpg
Binary files differ
diff --git a/app/src/main/res/drawable/purchase_suc.jpg b/app/src/main/res/drawable/purchase_suc.jpg
new file mode 100644
index 0000000..f39ebdb
--- /dev/null
+++ b/app/src/main/res/drawable/purchase_suc.jpg
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/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_ordinary_consume.xml b/app/src/main/res/drawable/select_ordinary_consume.xml
new file mode 100644
index 0000000..e44edf1
--- /dev/null
+++ b/app/src/main/res/drawable/select_ordinary_consume.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_ordinary_consume_focus" android:state_selected="true"/>
+ <item android:drawable="@drawable/corner_bg_ordinary_consume_focus" android:state_pressed="true"/>
+ <item android:drawable="@drawable/corner_bg_ordinary_consume_normal"/>
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shape_image_border.xml b/app/src/main/res/drawable/shape_image_border.xml
new file mode 100644
index 0000000..6d801b9
--- /dev/null
+++ b/app/src/main/res/drawable/shape_image_border.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+ <!-- Bottom 2dp Shadow -->
+ <item>
+
+ <shape android:shape="rectangle">
+
+ <solid android:color="#BBB"/>
+
+ <corners android:radius="7dp"/>
+ </shape>
+ </item>
+
+ <!-- White Top color -->
+ <item android:bottom="3px">
+
+ <shape android:shape="rectangle">
+
+ <solid android:color="#FFF"/>
+
+ <corners android:radius="7dp"/>
+
+ <padding
+ android:bottom="5dp"
+ android:left="5dp"
+ android:right="5dp"
+ android:top="5dp"/>
+ </shape>
+ </item>
+</layer-list>
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/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_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..980638c
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.constraint.ConstraintLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".MainActivity">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Hello World!"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintLeft_toLeftOf="parent"
+ app:layout_constraintRight_toRightOf="parent"
+ app:layout_constraintTop_toTopOf="parent"/>
+
+</android.support.constraint.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/toast_util.xml b/app/src/main/res/layout/toast_util.xml
new file mode 100644
index 0000000..0524e5b
--- /dev/null
+++ b/app/src/main/res/layout/toast_util.xml
@@ -0,0 +1,17 @@
+<?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:orientation="vertical">
+
+ <TextView
+ android:id="@+id/toasttext"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@drawable/corner_bg"
+ android:padding="30dp"
+ android:text="测试"
+ android:textColor="@color/black"
+ android:textSize="200dp"
+ android:textStyle="bold"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..bbd3e02
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@drawable/ic_launcher_background"/>
+ <foreground android:drawable="@drawable/ic_launcher_foreground"/>
+</adaptive-icon>
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..bbd3e02
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@drawable/ic_launcher_background"/>
+ <foreground android:drawable="@drawable/ic_launcher_foreground"/>
+</adaptive-icon>
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/bill_lastdtl.png b/app/src/main/res/mipmap-hdpi/bill_lastdtl.png
new file mode 100644
index 0000000..de03aa0
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/bill_lastdtl.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/default_photo.png b/app/src/main/res/mipmap-hdpi/default_photo.png
new file mode 100644
index 0000000..ca377a9
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/default_photo.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..898f3ed
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000..dffca36
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/pay_with_bar.png b/app/src/main/res/mipmap-hdpi/pay_with_bar.png
new file mode 100644
index 0000000..9c1f31a
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/pay_with_bar.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/pay_with_card.png b/app/src/main/res/mipmap-hdpi/pay_with_card.png
new file mode 100644
index 0000000..1b2d929
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/pay_with_card.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/pay_with_scan.png b/app/src/main/res/mipmap-hdpi/pay_with_scan.png
new file mode 100644
index 0000000..afc2bb1
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/pay_with_scan.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/pay_with_virtualcard.png b/app/src/main/res/mipmap-hdpi/pay_with_virtualcard.png
new file mode 100644
index 0000000..f8cf8a6
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/pay_with_virtualcard.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/scan_default_photo.jpg b/app/src/main/res/mipmap-hdpi/scan_default_photo.jpg
new file mode 100644
index 0000000..34adcad
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/scan_default_photo.jpg
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/shop_logo.png b/app/src/main/res/mipmap-hdpi/shop_logo.png
new file mode 100644
index 0000000..79ba1ec
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/shop_logo.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/show_card_info.png b/app/src/main/res/mipmap-hdpi/show_card_info.png
new file mode 100644
index 0000000..c622914
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/show_card_info.png
Binary files differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..64ba76f
--- /dev/null
+++ b/app/src/main/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000..dae5e08
--- /dev/null
+++ b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..e5ed465
--- /dev/null
+++ b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..14ed0af
--- /dev/null
+++ b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..b0907ca
--- /dev/null
+++ b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..d8ae031
--- /dev/null
+++ b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..2c18de9
--- /dev/null
+++ b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..beed3cd
--- /dev/null
+++ b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/app/src/main/res/raw/beep.ogg b/app/src/main/res/raw/beep.ogg
new file mode 100644
index 0000000..1419947
--- /dev/null
+++ b/app/src/main/res/raw/beep.ogg
Binary files differ
diff --git a/app/src/main/res/raw/card_passwd.wav b/app/src/main/res/raw/card_passwd.wav
new file mode 100644
index 0000000..f53ffb4
--- /dev/null
+++ b/app/src/main/res/raw/card_passwd.wav
Binary files differ
diff --git a/app/src/main/res/raw/consume_fail.wav b/app/src/main/res/raw/consume_fail.wav
new file mode 100644
index 0000000..37905b9
--- /dev/null
+++ b/app/src/main/res/raw/consume_fail.wav
Binary files differ
diff --git a/app/src/main/res/raw/consume_suc.wav b/app/src/main/res/raw/consume_suc.wav
new file mode 100644
index 0000000..29dba78
--- /dev/null
+++ b/app/src/main/res/raw/consume_suc.wav
Binary files differ
diff --git a/app/src/main/res/raw/dps_fail.wav b/app/src/main/res/raw/dps_fail.wav
new file mode 100644
index 0000000..3dd255e
--- /dev/null
+++ b/app/src/main/res/raw/dps_fail.wav
Binary files differ
diff --git a/app/src/main/res/raw/dps_feeamt_suc.wav b/app/src/main/res/raw/dps_feeamt_suc.wav
new file mode 100644
index 0000000..976f337
--- /dev/null
+++ b/app/src/main/res/raw/dps_feeamt_suc.wav
Binary files differ
diff --git a/app/src/main/res/raw/dps_login_fail.wav b/app/src/main/res/raw/dps_login_fail.wav
new file mode 100644
index 0000000..cc7f082
--- /dev/null
+++ b/app/src/main/res/raw/dps_login_fail.wav
Binary files differ
diff --git a/app/src/main/res/raw/dps_login_suc.wav b/app/src/main/res/raw/dps_login_suc.wav
new file mode 100644
index 0000000..f93d948
--- /dev/null
+++ b/app/src/main/res/raw/dps_login_suc.wav
Binary files differ
diff --git a/app/src/main/res/raw/dps_suc.wav b/app/src/main/res/raw/dps_suc.wav
new file mode 100644
index 0000000..7fc83cf
--- /dev/null
+++ b/app/src/main/res/raw/dps_suc.wav
Binary files differ
diff --git a/app/src/main/res/raw/eastcompeace_a711.json b/app/src/main/res/raw/eastcompeace_a711.json
new file mode 100644
index 0000000..c768ceb
--- /dev/null
+++ b/app/src/main/res/raw/eastcompeace_a711.json
@@ -0,0 +1,16 @@
+{
+ "desc": "东信和平(哈工程)",
+ "manufactory": "eastcompeace",
+ "fingerprint": [
+ {
+ "fingerprint": "127880B0024D540081",
+ "offset": 4,
+ "defaultRootKey": "00000000000000000000000000000000"
+ },
+ {
+ "fingerprint": "057880B002",
+ "offset": 4,
+ "defaultRootKey": "00000000000000000000000000000000"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/app/src/main/res/raw/epaycard.cfg b/app/src/main/res/raw/epaycard.cfg
new file mode 100644
index 0000000..c55ad32
--- /dev/null
+++ b/app/src/main/res/raw/epaycard.cfg
@@ -0,0 +1,122 @@
+{
+ "version": "1.0",
+ "custname": "supwisdom",
+ "id": "com.supwisdom.epaycard.cpucard.a711",
+ "desc": "新开普A711读卡器",
+ "issue_date": "20171221",
+ "custom_version": "v1.0",
+ "authcode": "08712016070002",
+ "atr_pretend": true,
+ "support_platform": [
+ "linux"
+ ],
+ "expire_date": "20300517",
+ "cardtype": [
+ {
+ "name": "SupCpuCardType",
+ "class": "com.supwisdom.epaycard.impl.SupCpuCardtype",
+ "psamcard": "sup_psamcard",
+ "keymachine": "SupKeyMachine",
+ "debug": false,
+ "fingerprint": [
+ {
+ "initializer": "com.supwisdom.epaycard.impl.FM201810Initializer",
+ "config": [
+ "classpath:res/raw/fmcos_a711.json"
+ ]
+ },
+ {
+ "config": [
+ "classpath:fingerprint/goldpac_e711.json"
+ ],
+ "initializer": "com.supwisdom.epaycard.impl.GoldPacCardInitializer"
+ }
+ ]
+ },
+ {
+ "name": "SupCpuCardTypeWithoutMac",
+ "class": "com.supwisdom.epaycard.impl.SupCardtypeRWOM",
+ "psamcard": "sup_psamcard",
+ "keymachine": "SupKeyMachine",
+ "debug": false,
+ "fingerprint": [
+ {
+ "config": [
+ "classpath:res/raw/eastcompeace_a711.json"
+ ],
+ "initializer": "com.supwisdom.epaycard.impl.GoldPacCardInitializer"
+ }
+ ]
+ },
+ {
+ "name": "SupM1Cardtype",
+ "class": "com.supwisdom.epaycard.impl.SupM1CardType",
+ "psamcard": "sup_psamcard",
+ "keymachine": "SupKeyMachine",
+ "keyalg": "normal2",
+ "version": 2008,
+ "water_packet": 6,
+ "minsect": 0,
+ "maxsect": 6,
+ "init_sections": [
+ 1,
+ 2,
+ 4,
+ 5,
+ 6
+ ],
+ "debug": false
+ }
+ ],
+ "reader": [
+ {
+ "name": "a711_reader",
+ "class": "com.supwisdom.epaycard.android.A711Reader",
+ "picc_req_times": 1,
+ "rf_interval": 100,
+ "rf_timeout": 300,
+ "debug": false
+ }
+ ],
+ "psamcard": [
+ {
+ "name": "sup_psamcard",
+ "reader": "a711_reader",
+ "keymachine": "SupKeyMachine",
+ "class": "com.supwisdom.epaycard.impl.SupPsamCard",
+ "debug": false,
+ "max_sect_len": 48,
+ "fingerprint": [
+ {
+ "manufactory": "einolda",
+ "fingerprint": "FFFF",
+ "max_block": 56,
+ "offset": 4,
+ "default": true
+ },
+ {
+ "manufactory": "broadstar",
+ "fingerprint": "4253",
+ "offset": 5,
+ "defaultRootKey": "57415443484441544154696D65434F53"
+ }
+ ]
+ }
+ ],
+ "keymachine": [
+ {
+ "name": "SupKeyMachine",
+ "reader": "a711_reader",
+ "debug": false,
+ "class": "com.supwisdom.epaycard.impl.SupKeyCard"
+ }
+ ],
+ "water_setting_card": [
+ {
+ "name": "sup_watercard",
+ "reader": "a711_reader",
+ "keymachine": "SupKeyMachine",
+ "class": "com.supwisdom.epaycard.impl.SupWaterSettingCard"
+ }
+ ]
+}
diff --git a/app/src/main/res/raw/epaycard_hit.cfg b/app/src/main/res/raw/epaycard_hit.cfg
new file mode 100644
index 0000000..7b99201
--- /dev/null
+++ b/app/src/main/res/raw/epaycard_hit.cfg
@@ -0,0 +1,101 @@
+{
+ "version": "1.0",
+ "custname": "supwisdom",
+ "id": "com.supwisdom.epaycard.cpucard.a711",
+ "desc": "新开普A711读卡器",
+ "issue_date": "20171221",
+ "custom_version": "v1.0",
+ "authcode": "08712016070002",
+ "atr_pretend": true,
+ "support_platform": [
+ "linux"
+ ],
+ "expire_date": "20300517",
+ "cardtype": [
+ {
+ "name": "SupCpuCardTypeWithoutMac",
+ "class": "com.supwisdom.epaycard.impl.SupCardtypeRWOM",
+ "psamcard": "sup_psamcard",
+ "keymachine": "SupKeyMachine",
+ "debug": false,
+ "fingerprint": [
+ {
+ "config": [
+ "classpath:res/raw/eastcompeace_a711.json"
+ ],
+ "initializer": "com.supwisdom.epaycard.impl.GoldPacCardInitializer"
+ }
+ ]
+ },
+ {
+ "name": "SupM1Cardtype",
+ "class": "com.supwisdom.epaycard.impl.SupM1CardType",
+ "psamcard": "sup_psamcard",
+ "keymachine": "SupKeyMachine",
+ "keyalg": "normal2",
+ "version": 2008,
+ "water_packet": 6,
+ "minsect": 0,
+ "maxsect": 6,
+ "init_sections": [
+ 1,
+ 2,
+ 4,
+ 5,
+ 6
+ ],
+ "debug": false
+ }
+ ],
+ "reader": [
+ {
+ "name": "a711_reader",
+ "class": "com.supwisdom.epaycard.android.A711Reader",
+ "picc_req_times": 1,
+ "rf_interval": 100,
+ "rf_timeout": 300,
+ "debug": false
+ }
+ ],
+ "psamcard": [
+ {
+ "name": "sup_psamcard",
+ "reader": "a711_reader",
+ "keymachine": "SupKeyMachine",
+ "class": "com.supwisdom.epaycard.impl.SupPsamCard",
+ "debug": false,
+ "max_sect_len": 48,
+ "fingerprint": [
+ {
+ "manufactory": "einolda",
+ "fingerprint": "FFFF",
+ "max_block": 56,
+ "offset": 4,
+ "default": true
+ },
+ {
+ "manufactory": "broadstar",
+ "fingerprint": "4253",
+ "offset": 5,
+ "defaultRootKey": "57415443484441544154696D65434F53"
+ }
+ ]
+ }
+ ],
+ "keymachine": [
+ {
+ "name": "SupKeyMachine",
+ "reader": "a711_reader",
+ "debug": false,
+ "class": "com.supwisdom.epaycard.impl.SupKeyCard"
+ }
+ ],
+ "water_setting_card": [
+ {
+ "name": "sup_watercard",
+ "reader": "a711_reader",
+ "keymachine": "SupKeyMachine",
+ "class": "com.supwisdom.epaycard.impl.SupWaterSettingCard"
+ }
+ ]
+}
diff --git a/app/src/main/res/raw/fmcos_a711.json b/app/src/main/res/raw/fmcos_a711.json
new file mode 100644
index 0000000..20035ee
--- /dev/null
+++ b/app/src/main/res/raw/fmcos_a711.json
@@ -0,0 +1,11 @@
+{
+ "desc" : "FM1208卡",
+ "manufactory" :"fmcos1208",
+ "fingerprint" : [
+ {
+ "fingerprint": "20900000000000",
+ "offset": 0,
+ "defaultRootKey": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/app/src/main/res/raw/gatein_fail.wav b/app/src/main/res/raw/gatein_fail.wav
new file mode 100644
index 0000000..0de1b71
--- /dev/null
+++ b/app/src/main/res/raw/gatein_fail.wav
Binary files differ
diff --git a/app/src/main/res/raw/gatein_suc.wav b/app/src/main/res/raw/gatein_suc.wav
new file mode 100644
index 0000000..56b106c
--- /dev/null
+++ b/app/src/main/res/raw/gatein_suc.wav
Binary files differ
diff --git a/app/src/main/res/raw/gateout_fail.wav b/app/src/main/res/raw/gateout_fail.wav
new file mode 100644
index 0000000..4b2c39c
--- /dev/null
+++ b/app/src/main/res/raw/gateout_fail.wav
Binary files differ
diff --git a/app/src/main/res/raw/gateout_suc.wav b/app/src/main/res/raw/gateout_suc.wav
new file mode 100644
index 0000000..e04a659
--- /dev/null
+++ b/app/src/main/res/raw/gateout_suc.wav
Binary files differ
diff --git a/app/src/main/res/raw/goldpac_a711.json b/app/src/main/res/raw/goldpac_a711.json
new file mode 100644
index 0000000..20a5f2d
--- /dev/null
+++ b/app/src/main/res/raw/goldpac_a711.json
@@ -0,0 +1,16 @@
+{
+ "desc" : "金邦达卡",
+ "manufactory" :"goldpac",
+ "fingerprint" : [
+ {
+ "fingerprint": "80318066",
+ "offset": 2,
+ "defaultRootKey": "00000000000000000000000000000000"
+ },
+ {
+ "fingerprint": "057880A002",
+ "offset": 4,
+ "defaultRootKey": "00000000000000000000000000000000"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/app/src/main/res/raw/key_add.wav b/app/src/main/res/raw/key_add.wav
new file mode 100644
index 0000000..8fe2703
--- /dev/null
+++ b/app/src/main/res/raw/key_add.wav
Binary files differ
diff --git a/app/src/main/res/raw/key_clear.wav b/app/src/main/res/raw/key_clear.wav
new file mode 100644
index 0000000..3c29559
--- /dev/null
+++ b/app/src/main/res/raw/key_clear.wav
Binary files differ
diff --git a/app/src/main/res/raw/key_dot.wav b/app/src/main/res/raw/key_dot.wav
new file mode 100644
index 0000000..69232dc
--- /dev/null
+++ b/app/src/main/res/raw/key_dot.wav
Binary files differ
diff --git a/app/src/main/res/raw/key_eight.wav b/app/src/main/res/raw/key_eight.wav
new file mode 100644
index 0000000..484f755
--- /dev/null
+++ b/app/src/main/res/raw/key_eight.wav
Binary files differ
diff --git a/app/src/main/res/raw/key_enter.wav b/app/src/main/res/raw/key_enter.wav
new file mode 100644
index 0000000..5386f86
--- /dev/null
+++ b/app/src/main/res/raw/key_enter.wav
Binary files differ
diff --git a/app/src/main/res/raw/key_ffour.wav b/app/src/main/res/raw/key_ffour.wav
new file mode 100644
index 0000000..6b94cb9
--- /dev/null
+++ b/app/src/main/res/raw/key_ffour.wav
Binary files differ
diff --git a/app/src/main/res/raw/key_five.wav b/app/src/main/res/raw/key_five.wav
new file mode 100644
index 0000000..830e234
--- /dev/null
+++ b/app/src/main/res/raw/key_five.wav
Binary files differ
diff --git a/app/src/main/res/raw/key_fone.wav b/app/src/main/res/raw/key_fone.wav
new file mode 100644
index 0000000..59adfde
--- /dev/null
+++ b/app/src/main/res/raw/key_fone.wav
Binary files differ
diff --git a/app/src/main/res/raw/key_four.wav b/app/src/main/res/raw/key_four.wav
new file mode 100644
index 0000000..5580975
--- /dev/null
+++ b/app/src/main/res/raw/key_four.wav
Binary files differ
diff --git a/app/src/main/res/raw/key_fthree.wav b/app/src/main/res/raw/key_fthree.wav
new file mode 100644
index 0000000..1291d25
--- /dev/null
+++ b/app/src/main/res/raw/key_fthree.wav
Binary files differ
diff --git a/app/src/main/res/raw/key_ftwo.wav b/app/src/main/res/raw/key_ftwo.wav
new file mode 100644
index 0000000..07fd91c
--- /dev/null
+++ b/app/src/main/res/raw/key_ftwo.wav
Binary files differ
diff --git a/app/src/main/res/raw/key_nine.wav b/app/src/main/res/raw/key_nine.wav
new file mode 100644
index 0000000..7013cb5
--- /dev/null
+++ b/app/src/main/res/raw/key_nine.wav
Binary files differ
diff --git a/app/src/main/res/raw/key_one.wav b/app/src/main/res/raw/key_one.wav
new file mode 100644
index 0000000..3b998f3
--- /dev/null
+++ b/app/src/main/res/raw/key_one.wav
Binary files differ
diff --git a/app/src/main/res/raw/key_seven.wav b/app/src/main/res/raw/key_seven.wav
new file mode 100644
index 0000000..e5226ce
--- /dev/null
+++ b/app/src/main/res/raw/key_seven.wav
Binary files differ
diff --git a/app/src/main/res/raw/key_six.wav b/app/src/main/res/raw/key_six.wav
new file mode 100644
index 0000000..2e25469
--- /dev/null
+++ b/app/src/main/res/raw/key_six.wav
Binary files differ
diff --git a/app/src/main/res/raw/key_three.wav b/app/src/main/res/raw/key_three.wav
new file mode 100644
index 0000000..ad00780
--- /dev/null
+++ b/app/src/main/res/raw/key_three.wav
Binary files differ
diff --git a/app/src/main/res/raw/key_two.wav b/app/src/main/res/raw/key_two.wav
new file mode 100644
index 0000000..56fc1de
--- /dev/null
+++ b/app/src/main/res/raw/key_two.wav
Binary files differ
diff --git a/app/src/main/res/raw/key_zero.wav b/app/src/main/res/raw/key_zero.wav
new file mode 100644
index 0000000..4fd1864
--- /dev/null
+++ b/app/src/main/res/raw/key_zero.wav
Binary files differ
diff --git a/app/src/main/res/raw/login_fail.wav b/app/src/main/res/raw/login_fail.wav
new file mode 100644
index 0000000..3e901c7
--- /dev/null
+++ b/app/src/main/res/raw/login_fail.wav
Binary files differ
diff --git a/app/src/main/res/raw/login_suc.wav b/app/src/main/res/raw/login_suc.wav
new file mode 100644
index 0000000..70a4ee2
--- /dev/null
+++ b/app/src/main/res/raw/login_suc.wav
Binary files differ
diff --git a/app/src/main/res/raw/pay_fail.wav b/app/src/main/res/raw/pay_fail.wav
new file mode 100644
index 0000000..85dbb67
--- /dev/null
+++ b/app/src/main/res/raw/pay_fail.wav
Binary files differ
diff --git a/app/src/main/res/raw/pay_suc.wav b/app/src/main/res/raw/pay_suc.wav
new file mode 100644
index 0000000..e0e8945
--- /dev/null
+++ b/app/src/main/res/raw/pay_suc.wav
Binary files differ
diff --git a/app/src/main/res/raw/query_fail.wav b/app/src/main/res/raw/query_fail.wav
new file mode 100644
index 0000000..4532286
--- /dev/null
+++ b/app/src/main/res/raw/query_fail.wav
Binary files differ
diff --git a/app/src/main/res/raw/query_suc.wav b/app/src/main/res/raw/query_suc.wav
new file mode 100644
index 0000000..d156756
--- /dev/null
+++ b/app/src/main/res/raw/query_suc.wav
Binary files differ
diff --git a/app/src/main/res/raw/reversal_done.wav b/app/src/main/res/raw/reversal_done.wav
new file mode 100644
index 0000000..72804bb
--- /dev/null
+++ b/app/src/main/res/raw/reversal_done.wav
Binary files differ
diff --git a/app/src/main/res/raw/reversal_fail.wav b/app/src/main/res/raw/reversal_fail.wav
new file mode 100644
index 0000000..2e314be
--- /dev/null
+++ b/app/src/main/res/raw/reversal_fail.wav
Binary files differ
diff --git a/app/src/main/res/raw/reversal_suc.wav b/app/src/main/res/raw/reversal_suc.wav
new file mode 100644
index 0000000..61f1c8a
--- /dev/null
+++ b/app/src/main/res/raw/reversal_suc.wav
Binary files differ
diff --git a/app/src/main/res/raw/scan_beep.ogg b/app/src/main/res/raw/scan_beep.ogg
new file mode 100644
index 0000000..1419947
--- /dev/null
+++ b/app/src/main/res/raw/scan_beep.ogg
Binary files differ
diff --git a/app/src/main/res/raw/sound_key_eight.wav b/app/src/main/res/raw/sound_key_eight.wav
new file mode 100644
index 0000000..82d8b26
--- /dev/null
+++ b/app/src/main/res/raw/sound_key_eight.wav
Binary files differ
diff --git a/app/src/main/res/raw/sound_key_five.wav b/app/src/main/res/raw/sound_key_five.wav
new file mode 100644
index 0000000..b35596c
--- /dev/null
+++ b/app/src/main/res/raw/sound_key_five.wav
Binary files differ
diff --git a/app/src/main/res/raw/sound_key_four.wav b/app/src/main/res/raw/sound_key_four.wav
new file mode 100644
index 0000000..f56c4ee
--- /dev/null
+++ b/app/src/main/res/raw/sound_key_four.wav
Binary files differ
diff --git a/app/src/main/res/raw/sound_key_nine.wav b/app/src/main/res/raw/sound_key_nine.wav
new file mode 100644
index 0000000..20722db
--- /dev/null
+++ b/app/src/main/res/raw/sound_key_nine.wav
Binary files differ
diff --git a/app/src/main/res/raw/sound_key_one.wav b/app/src/main/res/raw/sound_key_one.wav
new file mode 100644
index 0000000..faf8bdb
--- /dev/null
+++ b/app/src/main/res/raw/sound_key_one.wav
Binary files differ
diff --git a/app/src/main/res/raw/sound_key_seven.wav b/app/src/main/res/raw/sound_key_seven.wav
new file mode 100644
index 0000000..9baaafc
--- /dev/null
+++ b/app/src/main/res/raw/sound_key_seven.wav
Binary files differ
diff --git a/app/src/main/res/raw/sound_key_six.wav b/app/src/main/res/raw/sound_key_six.wav
new file mode 100644
index 0000000..cb4b14e
--- /dev/null
+++ b/app/src/main/res/raw/sound_key_six.wav
Binary files differ
diff --git a/app/src/main/res/raw/sound_key_three.wav b/app/src/main/res/raw/sound_key_three.wav
new file mode 100644
index 0000000..354a26d
--- /dev/null
+++ b/app/src/main/res/raw/sound_key_three.wav
Binary files differ
diff --git a/app/src/main/res/raw/sound_key_two.wav b/app/src/main/res/raw/sound_key_two.wav
new file mode 100644
index 0000000..87898f3
--- /dev/null
+++ b/app/src/main/res/raw/sound_key_two.wav
Binary files differ
diff --git a/app/src/main/res/raw/sound_key_zero.wav b/app/src/main/res/raw/sound_key_zero.wav
new file mode 100644
index 0000000..be4f0cb
--- /dev/null
+++ b/app/src/main/res/raw/sound_key_zero.wav
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..dae37ff
--- /dev/null
+++ b/app/src/main/res/values/colors.xml
@@ -0,0 +1,106 @@
+<resources>
+
+ <color name="black_overlay">#66000000</color>
+ <color name="btn_light_blue">#5bc0de</color>
+ <color name="light_gray">#ffa2a2a2</color>
+ <color name="light_gray1">#cdcdcd</color>
+ <color name="light_green">#46d608</color>
+ <color name="light_green1">#83f800</color>
+ <color name="light_green2">#05a910</color>
+ <color name="light_blue1">#00bb9c</color>
+ <color name="light_purple">#ed07d0</color>
+ <color name="light_purple1">#f57cc3</color>
+ <color name="light_purple2">#b20469</color>
+ <color name="light_blue">#7899c4</color>
+ <color name="light_yellow">#e1cb28</color>
+ <color name="light_yellow_2">#ffffe928</color>
+ <color name="light_yellow_3">#fffe9f</color>
+ <color name="light_black">#424652</color>
+ <color name="white_gray">#f9f9f9</color>
+ <color name="white">#FFFFFF</color>
+ <color name="pwdColor">#999999</color>
+ <color name="password_hint">#666666</color>
+ <color name="orange">#FD7201</color>
+ <color name="orange1">#FF6600</color>
+ <color name="black">#000</color>
+ <color name="blue">#0c0de1</color>
+ <color name="dark_blue1">#13227a</color>
+ <color name="light_blue2">#2D95E0</color>
+ <color name="dark_blue">#0E1C36</color>
+ <color name="lit_light_gray">#23292E</color>
+ <color name="light_gray_white">#EEEEEE</color>
+ <color name="result_view">#b0000000</color>
+ <color name="viewfinder_mask">#60000000</color>
+ <color name="possible_result_points">#c0ffff00</color>
+ <color name="key_btn_color">#EEEEEE</color>
+ <color name="cl_red">#FF0000</color>
+ <color name="pos_theme_color">#08ae9e</color>
+ <color name="consume_caption">#434343</color>
+ <color name="consume_font">#666666</color>
+ <color name="consume_background">#f3f3f3</color>
+ <color name="main_back_consume_normal">#F15D5D</color>
+ <color name="main_back_consume_click">#E55A5A</color>
+ <color name="main_back_online_deposit_normal">#7E62F8</color>
+ <color name="main_back_online_deposit_click">#785EEB</color>
+ <color name="main_back_device_manage_normal">#7E62F8</color>
+ <color name="main_back_device_manage_click">#785EEB</color>
+ <!--<color custname="main_back_cancel_consume_normal">#25A3B3</color>-->
+ <!--<color custname="main_back_cancel_consume_click">#2396A6</color>-->
+ <color name="main_back_query_revenue_normal">#999999</color>
+ <!--<color custname="main_back_query_revenue_click">#85A629</color>-->
+ <color name="main_back_library_normal">#8EB32C</color>
+ <color name="main_back_library_click">#85A629</color>
+ <color name="main_back_manual_auth_normal">#8EB32C</color>
+ <color name="main_back_manual_auth_click">#85A629</color>
+ <color name="bk_set_block">#F3F3F3</color>
+ <!--<color custname="main_back_update_blacklist_normal">#7E62F8</color>-->
+ <!--<color custname="main_back_update_blacklist_click">#785EEB</color>-->
+ <color name="main_back_update_blacklist_normal">#F28923</color>
+ <color name="main_back_update_blacklist_click">#F28923</color>
+ <color name="main_back_online_order_normal">#F28923</color>
+ <color name="main_back_online_order_click">#F28923</color>
+ <color name="main_back_transdtl_normal">#20A193</color>
+ <color name="main_back_transdtl_click">#1E9486</color>
+ <!--<color custname="main_back_test_net_normal">#F15D5D</color>-->
+ <!--<color custname="main_back_test_net_click">#E55A5A</color>-->
+ <color name="main_back_test_net_normal">#F15D5D</color>
+ <color name="main_back_test_net_click">#E55A5A</color>
+
+ <color name="main_back_query_para_normal">#20A193</color>
+ <color name="main_back_query_para_click">#1E9486</color>
+ <!--<color custname="main_back_device_manage_normal">#2f87d2</color>-->
+ <!--<color custname="main_back_device_manage_click">#2b7dc4</color>-->
+ <color name="main_online_bak">#f1f1f1</color>
+ <color name="main_offline_font">#888888</color>
+ <!--启用界面-->
+ <color name="enable_text_font_color">#333333</color>
+ <color name="enable_devphyid_edit_font_color">#666666</color>
+ <color name="enable_bak">#f1f1f1</color>
+ <color name="enable_step_doing">#333333</color>
+ <color name="enable_step_fail">#ff0000</color>
+ <color name="enable_step_success">#8fccc6</color>
+ <!--设置界面-->
+ <color name="main_divide_line">#e8e8e8</color>
+ <color name="set_menu_bak_normal">#f3f3f3</color>
+ <color name="set_menu_bak_focus">#e4e4e4</color>
+ <color name="set_menu_words">#333333</color>
+ <color name="rf_words_info">#666666</color>
+ <color name="pos_theme_font_color">#333333</color>
+ <!--查询界面下一页按钮的颜色-->
+ <color name="query_next_btn_focus">#08a191</color>
+ <color name="query_next_btn_normal">#08ae9e</color>
+ <!--点餐-->
+ <color name="order_food_list_bak">#fffece</color>
+ <color name="order_picture_food_price">#434343</color>
+ <color name="order_picture_dec">#333333</color>
+ <color name="order_left_count_one">#434343</color>
+ <color name="order_left_count_over_two">#ff0000</color>
+ <color name="order_count_price_col">#ff6a00</color>
+ <color name="order_picture_price_bak">#80161616</color>
+ <color name="order_dec_btn_normal">#333333</color>
+ <color name="order_dec_btn_focus">#FF9900</color>
+ <color name="order_picture_history">#999999</color>
+ <color name="bak_order">#eeeeee</color>
+ <color name="query_font_color">#ffffff</color>
+ <color name="query_background_color">#eeeeee</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..6b58d35
--- /dev/null
+++ b/app/src/main/res/values/dimens.xml
@@ -0,0 +1,309 @@
+<resources>
+ <!-- Example customization of dimensions originally defined in res/values/dimens.xml
+ (such as screen margins) for screens with more than 820dp of available width. This
+ would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
+ <dimen name="activity_horizontal_margin">64dp</dimen>
+ <!--dimen custname="activity_horizontal_margin">16dp</dimen-->
+ <dimen name="activity_vertical_margin">16dp</dimen>
+ <dimen name="key_text_size">100sp</dimen>
+ <!--密码界面-->
+ <dimen name="password_margin_horizontal">10dip</dimen>
+ <dimen name="password_margin_vertical">1dip</dimen>
+ <dimen name="password_left_width">320dip</dimen>
+ <dimen name="password_left_obj_gap">10dip</dimen>
+ <dimen name="password_left_word_margin_top">50dip</dimen>
+ <dimen name="password_hint_size">50sp</dimen>
+ <dimen name="password_char_size">80sp</dimen>
+ <dimen name="password_pwd_char_margin_top">-13dip</dimen>
+ <!--密码界面下-->
+ <dimen name="password_right_btn_margin">20dip</dimen>
+ <dimen name="password_right_margin_left">50dip</dimen>
+ <dimen name="password_pwd_size">110dip</dimen>
+ <dimen name="password_pwd_inner_size">102dip</dimen>
+ <dimen name="password_pwd_inner_length">4dip</dimen>
+ <dimen name="password_btn_size">150dip</dimen>
+ <dimen name="password_right_margin_top">30dip</dimen>
+
+ <!--消费界面左-->
+ <dimen name="consume_left_middle_height">241dip</dimen>
+ <dimen name="consume_waiting_margin_left">18dip</dimen>
+ <dimen name="consume_waiting_margin_top">104dip</dimen>
+ <dimen name="consume_waiting_size">19sp</dimen>
+ <dimen name="consume_left_middle_line_height">52dip</dimen>
+ <dimen name="consume_left_middle_line_margin_left">18dip</dimen>
+ <dimen name="consume_left_middle_line_margin_top">18dip</dimen>
+ <dimen name="consume_caption_width">78dip</dimen>
+ <dimen name="consume_caption_size">19sp</dimen>
+ <dimen name="consume_left_down_height">62dip</dimen>
+ <dimen name="consume_left_down_words_margin_left">18dip</dimen>
+ <dimen name="consume_left_down_words_margin_top">12dip</dimen>
+ <dimen name="consume_amount_margin_top">12dip</dimen>
+ <dimen name="consume_title_size">22sp</dimen>
+ <dimen name="consume_amount_size">21sp</dimen>
+ <dimen name="consume_left_width">250dip</dimen>
+ <!--消费界面右-->
+ <dimen name="consume_right_margin_left">12dip</dimen>
+ <dimen name="consume_right_line_height">67dip</dimen>
+ <dimen name="consume_key_button_width">128dip</dimen>
+ <dimen name="consume_right_down_btn_width">181dip</dimen>
+ <dimen name="main_words_size">20sp</dimen>
+ <dimen name="main_caption_size">26sp</dimen>
+ <dimen name="main_top_caption_indent">10dip</dimen>
+ <dimen name="main_icon_marginRight">27dip</dimen>
+ <dimen name="main_icon_marginBottom">45dip</dimen>
+ <!---普通消费界面-->
+ <dimen name="consume_ordinary_key_height">580dp</dimen>
+ <!--主界面-->
+ <dimen name="main_top_height">485dip</dimen>
+ <dimen name="main_top_line_height">241.5dip</dimen>
+ <dimen name="main_bottom_line_height">119.75dip</dimen>
+ <dimen name="main_bottom_icon_size">49dip</dimen>
+ <dimen name="main_transdtl_icon_size">41dip</dimen>
+ <dimen name="main_words_margin">26dip</dimen>
+ <dimen name="main_top_icon_size">100dip</dimen>
+ <dimen name="main_divide_horizontal">2dip</dimen>
+ <dimen name="main_divide_vertical">2dip</dimen>
+ <dimen name="main_online_height">69dip</dimen>
+ <dimen name="main_online_img_size">40dip</dimen>
+ <dimen name="main_online_font_size">22sp</dimen>
+ <dimen name="main_online_gap">39dip</dimen>
+ <!--主界面上-->
+ <dimen name="main_top_img_margin_top">38dip</dimen>
+ <dimen name="main_query_revenue_margin_big">29dip</dimen>
+ <dimen name="main_query_revenue_margin_title">248dip</dimen>
+ <dimen name="main_query_revenue_margin_giant">88dip</dimen>
+ <dimen name="main_query_revenue_words_gap_vertical">4dip</dimen>
+ <!--主界面上左-->
+ <dimen name="main_top_left_width">508.67dip</dimen>
+ <dimen name="main_transdtl_width">508.67dip</dimen>
+ <dimen name="main_button_width">253.33dip</dimen>
+ <dimen name="main_transdtl_hint_margin_left">156dip</dimen>
+ <dimen name="main_transdtl_hint_margin_top">98dip</dimen>
+ <dimen name="main_trussdtl_hint_margin_top">138dip</dimen>
+ <dimen name="main_transdtl_icon_marginBottom">10dip</dimen>
+ <dimen name="main_transdtl_icon_marginRight">142dip</dimen>
+ <dimen name="main_transdtl_words_marginBottom">10dip</dimen>
+ <dimen name="main_transdtl_words_marginRight">40dip</dimen>
+ <!--主界面底部-->
+ <dimen name="main_bottom_icon_margin_top">38dip</dimen>
+ <dimen name="main_bottom_icon_margin_left">8dip</dimen>
+ <dimen name="main_bottom_words_margin_left">23dip</dimen>
+ <dimen name="main_upd_blacklist_words_margin_left">15dip</dimen>
+ <dimen name="main_bottom_words_margin_top">48dip</dimen>
+ <!--查询界面-->
+ <dimen name="query_title_height">55dip</dimen>
+ <dimen name="query_thick_line_width">3dip</dimen>
+ <dimen name="query_thick_line_height">18dip</dimen>
+ <dimen name="query_content_height">55dip</dimen>
+ <dimen name="query_line_margin_top">3dip</dimen>
+ <dimen name="query_words_margin_left">144dip</dimen>
+ <dimen name="query_words_size">26sp</dimen>
+ <dimen name="query_icon_margin_left">12dip</dimen>
+ <dimen name="query_title_margin_left">6dip</dimen>
+ <dimen name="query_half_width">320dip</dimen>
+ <dimen name="query_right_block_margin_top">6dip</dimen>
+ <!--查询界面翻页按钮-->
+ <dimen name="query_turn_page_words_margin_left">6dip</dimen>
+ <dimen name="query_turn_page_btn_size">25dip</dimen>
+ <dimen name="query_turn_page_btn_margin_left">220dip</dimen>
+ <dimen name="query_prev_margin_top">230dip</dimen>
+ <!--消费流水界面-->
+ <dimen name="revenue_btn_size">35dp</dimen>
+ <dimen name="revenue_serch_text_size">30dp</dimen>
+ <dimen name="revenue_list_size">25dp</dimen>
+ <dimen name="revenue_item_size">22dp</dimen>
+ <!--设置界面通用-->
+ <dimen name="set_menu_height">100dip</dimen>
+ <dimen name="set_menu_text_size">30sp</dimen>
+ <dimen name="set_block_words_margin_left">12dip</dimen>
+ <dimen name="set_block_words_width">360dip</dimen>
+ <dimen name="set_arrow_size">19dip</dimen>
+ <dimen name="set_block_width">300dip</dimen>
+ <dimen name="set_block_margin_top">35dip</dimen>
+ <dimen name="set_block_margin_bottom">35dip</dimen>
+
+ <!--恢复出厂界面-->
+ <dimen name="rf_middle_btn_width">108dip</dimen>
+ <dimen name="rf_middle_btn_height">49dip</dimen>
+ <dimen name="rf_middle_words_height">117dip</dimen>
+ <dimen name="rf_words_size">25sp</dimen>
+ <dimen name="rf_middle_btn_margin_bottom">18dip</dimen>
+ <dimen name="rf_progress_bar_height">3dip</dimen>
+ <dimen name="rf_progress_bar_width">481dip</dimen>
+ <!--启用界面-->
+ <dimen name="enable_devphyid_line_inner_gap">15dip</dimen>
+ <dimen name="enable_title_text_size">32sp</dimen>
+ <dimen name="enable_devphyid_font_size">28sp</dimen>
+ <dimen name="enable_devphyid_line_gap">20dip</dimen>
+ <dimen name="enable_devphyid_btn_margin_top">50dip</dimen>
+ <dimen name="enable_devphyid_line_margin_top">80dip</dimen>
+ <dimen name="enable_devphyid_text_width">110dip</dimen>
+ <dimen name="enable_devphyid_edit_width">560dip</dimen>
+ <dimen name="enable_confirm_width">100dip</dimen>
+ <dimen name="enable_confirm_height">50dip</dimen>
+ <dimen name="enable_devphyid_middle_width">668dip</dimen>
+ <dimen name="enable_devphyid_middle_height">660dip</dimen>
+ <dimen name="enable_devphyid_margin_top">70dip</dimen>
+ <dimen name="enable_devphyid_middle_margin_top">20dip</dimen>
+ <dimen name="enable_btn_width">150dip</dimen>
+ <dimen name="enable_btn_height">80dip</dimen>
+ <dimen name="enable_devphyid_btn_gap">150dip</dimen>
+ <!--启用步骤页面-->
+ <dimen name="enable_step_text_size">26sp</dimen>
+ <dimen name="enable_step_line_margin_top">35dip</dimen>
+ <dimen name="enable_step_line_gap">32dip</dimen>
+ <dimen name="enable_step_words_margin_left">20dip</dimen>
+ <dimen name="enable_step_middle_width">668dip</dimen>
+ <dimen name="enable_step_middle_height">660dip</dimen>
+ <dimen name="enable_auth_btn_margin_top">520dip</dimen>
+ <dimen name="enable_auth_text_margin_top">360dip</dimen>
+ <!--设置通讯参数界面-->
+ <dimen name="set_server_line_height">120dip</dimen>
+ <dimen name="set_server_middle_width">600dip</dimen>
+ <dimen name="set_server_middle_height">570dip</dimen>
+ <dimen name="set_server_btn_width">150dip</dimen>
+ <dimen name="set_server_btn_height">60dip</dimen>
+ <dimen name="set_server_btns_text_size">22sp</dimen>
+ <dimen name="set_server_btn_margin_right">100dip</dimen>
+ <!--所有界面的返回按钮-->
+ <dimen name="all_back_line_height">72dip</dimen>
+ <dimen name="all_back_img_size">45dip</dimen>
+ <dimen name="all_back_word_width">115dip</dimen>
+ <dimen name="all_back_word_height">58dip</dimen>
+ <dimen name="all_back_word_margin_left">5dip</dimen>
+ <dimen name="all_back_words_size">30sp</dimen>
+ <dimen name="all_back_img_padtop">60dp</dimen>
+ <dimen name="all_back_img_padleft">20dp</dimen>
+ <!--本地控制参数-->
+ <dimen name="control_para_gap">20dp</dimen>
+ <dimen name="control_para_text_size">28dp</dimen>
+ <!--行间间隔-->
+ <dimen name="line_divide">20dp</dimen>
+ <!--点餐上-->
+ <dimen name="order_picture_section_line_height">252dip</dimen>
+ <dimen name="order_picture_out_width">184dip</dimen>
+ <dimen name="order_picture_inner_width">183dip</dimen>
+ <dimen name="order_picture_inner_height">196dip</dimen>
+ <dimen name="order_picture_simple_inner_width">252dip</dimen>
+ <dimen name="order_picture_simple_inner_height18">135dip</dimen>
+ <dimen name="order_picture_simple_inner_height21">115dip</dimen>
+ <dimen name="order_picture_simple_inner_height24">100dip</dimen>
+ <dimen name="order_picture_simple_inner_height27">90dip</dimen>
+ <dimen name="order_picture_simple_inner_height30">80dip</dimen>
+ <dimen name="order_picture_inner_margin">5dip</dimen>
+ <dimen name="order_picture_out_margin">2dip</dimen>
+ <dimen name="order_picture_price_margin_left">5dip</dimen>
+ <dimen name="order_picture_price_left_width">100dip</dimen>
+ <dimen name="order_picture_big_price_text_size">40sp</dimen>
+ <dimen name="order_picture_price_text_size">28sp</dimen>
+ <dimen name="order_picture_dec_text_size">20sp</dimen>
+ <dimen name="order_zoom_btn_width">57dip</dimen>
+ <dimen name="order_zoom_btn_height">67dip</dimen>
+ <dimen name="order_picture_count_text_size">28sp</dimen>
+ <dimen name="order_picture_section_height">830dip</dimen>
+ <dimen name="order_picture_food_name_height">57dip</dimen>
+ <dimen name="order_order_num_control_btn_size">55dip</dimen>
+ <dimen name="order_purchase_count_margin">10dip</dimen>
+ <dimen name="order_picture_text_si">10dip</dimen>
+ <!--点餐下-->
+ <dimen name="order_food_count_pack_margin_left">20dip</dimen>
+ <dimen name="order_food_name_margin_left">5dip</dimen>
+ <dimen name="order_down_height">200dip</dimen>
+ <dimen name="order_food_name_width">150dip</dimen>
+ <dimen name="order_food_count_width">50dip</dimen>
+ <dimen name="order_food_count_pack_width">170dip</dimen>
+ <dimen name="order_down_btn_text">45sp</dimen>
+ <dimen name="order_down_btn_margin_top">45dip</dimen>
+ <dimen name="order_down_gap">10dip</dimen>
+ <dimen name="order_down_left_width">324dip</dimen>
+ <dimen name="order_list_item_text_size">24sp</dimen>
+ <dimen name="order_total_price_text_size">48sp</dimen>
+ <dimen name="order_clear_btn_width">132dip</dimen>
+ <dimen name="order_clear_btn_height">100dip</dimen>
+ <dimen name="order_purchase_btn_width">216dip</dimen>
+ <dimen name="order_list_item_height">38dip</dimen>
+ <dimen name="order_purchase_btn_height">100dip</dimen>
+ <dimen name="order_total_price_margin_top">20dip</dimen>
+ <dimen name="order_picture_text_size1">30dip</dimen>
+ <dimen name="order_picture_text_size2">35dip</dimen>
+ <dimen name="order_picture_text_size3">40dip</dimen>
+ <!--点餐等待-->
+ <dimen name="order_purchase_star_gap">20dip</dimen>
+ <dimen name="order_purchase_title_height">100dip</dimen>
+ <dimen name="order_purchase_star_height">100dip</dimen>
+ <dimen name="order_wait_purchase_width">650dip</dimen>
+ <dimen name="order_wait_purchase_height">500dip</dimen>
+ <!--普通消费弹窗-->
+ <dimen name="ordinary_consume_home_width">600dip</dimen>
+ <dimen name="ordinary_consume_home_height">450dip</dimen>
+ <dimen name="ordinary_consume_text_size">40sp</dimen>
+ <dimen name="ordinary_consume_uint_size">30dp</dimen>
+ <!--点餐大图-->
+ <dimen name="order_big_picture_price_margin_left">25dip</dimen>
+ <dimen name="order_big_picture_margin_top">70dip</dimen>
+ <dimen name="order_add_food_btn_size">60dip</dimen>
+ <dimen name="order_big_picture_out_width">670dip</dimen>
+ <dimen name="order_big_picture_out_height">562dip</dimen>
+ <dimen name="order_big_picture_inner_width">654dip</dimen>
+ <dimen name="order_big_picture_inner_height">457dip</dimen>
+ <dimen name="order_big_picture_inner_margin">8dip</dimen>
+ <dimen name="order_big_picture_text">50sp</dimen>
+ <dimen name="order_big_picture_food_info_height">119dip</dimen>
+ <dimen name="order_big_picture_food_info_height_half">59dip</dimen>
+ <dimen name="order_big_picture_close_btn_size">75dip</dimen>
+ <dimen name="order_big_picture_confirm_btn_width">200dip</dimen>
+ <dimen name="order_big_picture_confirm_btn_height">75dip</dimen>
+ <dimen name="order_big_picture_confirm_btn_margin_left">170dip</dimen>
+ <dimen name="order_big_picture_count_width">140dip</dimen>
+ <dimen name="order_big_picture_count_height">70dip</dimen>
+ <dimen name="order_big_picture_price_width">200dip</dimen>
+ <dimen name="order_big_picture_dec_margin_left">150dip</dimen>
+ <dimen name="order_picture_history_text_size">12sp</dimen>
+ <dimen name="order_picture_minus_height">43dip</dimen>
+ <dimen name="order_picture_minus_width">80dip</dimen>
+ <dimen name="order_picture_minus_margin_right">6dip</dimen>
+ <dimen name="main_bottom_button_width">381dip</dimen>
+ <!--悬浮密码界面-->
+ <dimen name="float_password_margin_horizontal">5dip</dimen>
+ <dimen name="float_password_margin_vertical">1dip</dimen>
+ <dimen name="float_password_left_width">160dip</dimen>
+ <dimen name="float_password_left_obj_gap">5dip</dimen>
+ <dimen name="float_password_left_word_margin_top">25dip</dimen>
+ <dimen name="float_password_hint_size">35sp</dimen>
+ <dimen name="float_password_char_size">40sp</dimen>
+ <dimen name="float_password_pwd_char_margin_top">-7dip</dimen>
+ <!--悬浮密码界面下-->
+ <dimen name="float_password_right_btn_margin">20dip</dimen>
+ <dimen name="float_password_right_margin_left">25dip</dimen>
+ <dimen name="float_password_pwd_size">70dip</dimen>
+ <dimen name="float_password_pwd_inner_size">70dip</dimen>
+ <dimen name="float_password_pwd_inner_length">2dip</dimen>
+ <dimen name="float_password_btn_size">100dip</dimen>
+ <dimen name="float_password_right_margin_top">15dip</dimen>
+ <!--充值界面-->
+ <dimen name="deposit_userinfo_gap">20dp</dimen>
+ <dimen name="deposit_text_gap">15dp</dimen>
+ <dimen name="deposit_text_size">30sp</dimen>
+ <dimen name="deposit_item_size">20sp</dimen>
+ <dimen name="deposit_bg_crash_width">200dp</dimen>
+ <dimen name="deposit_bg_crash_height">80dp</dimen>
+ <dimen name="deposit_crash_size">50dp</dimen>
+ <dimen name="deposit_dialog_width">300dp</dimen>
+ <dimen name="deposit_dialog_size">40dp</dimen>
+ <dimen name="deposit_shopname_text_size_small">28sp</dimen>
+ <dimen name="deposit_shopname_text_size_normal">35sp</dimen>
+ <!--支付界面-->
+ <dimen name="pay_text_pad_size">10dp</dimen>
+ <dimen name="pay_text_marginleft">30dp</dimen>
+ <dimen name="pay_module_top_size">10dp</dimen>
+ <dimen name="pay_text_size">35sp</dimen>
+ <dimen name="pay_text_title_size">25sp</dimen>
+ <!--待机界面-->
+ <dimen name="consume_text_pad_size">10dp</dimen>
+ <dimen name="consume_text_size">25sp</dimen>
+ <dimen name="consume_text_size1">30sp</dimen>
+ <dimen name="consume_text_size2">30sp</dimen>
+ <dimen name="consume_text_pad_size1">5dp</dimen>
+ <dimen name="consume_shopname_text_size_middle">28sp</dimen>
+ <dimen name="consume_shopname_text_size_normal">35sp</dimen>
+</resources>
diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml
new file mode 100644
index 0000000..056a511
--- /dev/null
+++ b/app/src/main/res/values/ids.xml
@@ -0,0 +1,39 @@
+<?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="jump_to_read_card" 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="gridview" type="id" />
+ <item name="webview" type="id" />
+
+ <item name="about_version_code" type="id" />
+ <item name="split" type="id" />
+
+</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..44fc515
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <string name="app_name">消费POS机</string>
+ <string name="title_activity_base">基类</string>
+ <string name="action_settings">设置</string>
+ <string name="title_activity_main">主界面</string>
+ <string name="title_activity_psam">操作psam卡</string>
+ <string name="title_activity_readcard">读卡</string>
+ <string name="title_activity_mode">模式</string>
+ <string name="title_activity_init">初始化</string>
+ <string name="title_activity_load">加载</string>
+ <string name="title_activity_comm">通讯</string>
+ <string name="title_activity_control">控制参数</string>
+ <string name="title_activity_consumecancel">消费撤销</string>
+ <string name="title_activity_library">图书缴费</string>
+ <string name="title_activity_recharge">在线充值</string>
+ <string name="cardlib_name">supwisdom.kscpucard</string>
+ <string name="connfail">连接失败</string>
+ <string name="msg_read_card_error">读卡错误</string>
+ <string name="msg_notsupport_card_oper">不支持卡操作</string>
+ <string name="msg_card_data_error">卡数据错误</string>
+ <string name="nfc_not_support">不支持NFC</string>
+ <string name="nfc_disabled">NFC未启动</string>
+ <string name="confirm_open_nfc">是否打开NFC</string>
+ <string name="action_exit">退出</string>
+ <string name="wait_msg">请刷卡</string>
+ <string name="menu_name_set">设置</string>
+ <string name="menu_name_purchase">消费</string>
+ <string name="title_activity_set">设置</string>
+ <string name="hello_world">hello</string>
+ <string name="devtimefmt">yyyyMMddHHmmss</string>
+ <string name="title_activity_transdtl">交易流水查询</string>
+ <string name="no_mf_files">\"无MF文件\"</string>
+ <string name="creat_mf_files">创建MF文件</string>
+ <string name="creat_mf_success">创建MF文件成功</string>
+ <string name="creat_mf_fail">创建MF文件失败</string>
+ <string name="mf_exist">MF退出</string>
+ <string name="error">错误</string>
+ <string name="reset_psam1_success">重设PSAM1成功</string>
+ <string name="reset_psam1_failed">重设psam1失败</string>
+ <string name="reset_psam2_success">重设psam2成功</string>
+ <string name="reset_psam2_failed">重设psam2失败</string>
+ <string name="get_random_number_failed">获取随机数失败</string>
+ <string name="reset_import1">初始化1失败</string>
+ <string name="reset_failed_cannot_get_random_number1">不能获取随机数1</string>
+ <string name="reset_import2">重设2失败</string>
+ <string name="reset_failed_cannot_get_random_number2">获取随机数2失败</string>
+ <string name="title_activity_show_day_consume">营业额查询</string>
+ <string name="title_activity_password">密码设置</string>
+ <string name="isPasswordCancel">isPassWordCancel</string>
+ <string name="consume_img">消费</string>
+ <string name="title_activity_auth">签到</string>
+ <string name="action_saoma">扫码</string>
+ <string name="scan_text">将二维码或条码放入框内完成扫描</string>
+ <string name="home_back">返回</string>
+ <string name="title_activity_consume">普通消费</string>
+ <string name="title_activity_qrcamera">扫码</string>
+ <string name="title_activity_splash">树维pos</string>
+ <string name="waiting_msg">正在识别,请稍后…</string>
+ <string name="username">姓 名</string>
+ <string name="userStuEmpNo">学工号</string>
+ <string name="userExpireDate">有效期</string>
+ <string name="userBalance">余 额</string>
+ <string name="consumeAmount">消费额(元)</string>
+ <string name="title_activity_consume_cancel">消费撤销</string>
+ <string name="title_activity_update_blacklist">更新黑名单</string>
+ <string name="title_activity_recover_factory">恢复出厂</string>
+ <string name="dialogTitle">提示</string>
+ <string name="all_home_words">主页</string>
+ <string name="all_back_words">返回</string>
+ <string name="title_activity_order_online">在线点餐</string>
+ <string name="title_activity_query_parameter_second">查询第二页</string>
+ <string name="devphyid">终端机编号</string>
+ <string name="samNo">SAM卡号</string>
+ <string name="softVerNo">软件版本号</string>
+ <string name="feerateVerNo">收费参数版本号</string>
+ <string name="sysparaVerNo">主参数版本号</string>
+ <string name="cardverno">黑名单参数版本号</string>
+ <string name="devseqno">POS当前流水号</string>
+ <string name="opentime">开机时间</string>
+ <string name="nextPage">下一页</string>
+ <string name="queryParameters">终端参数查询</string>
+ <string name="title_activity_change_mode">更改模式</string>
+ <string name="title_activity_enable">设备启用</string>
+ <string name="offline_words">脱机状态</string>
+ <string name="online_words">联机状态</string>
+ <string name="title_activity_set_server_info">设置通讯参数</string>
+ <string name="title_activity_test_touch">TestTouchActivity</string>
+ <string name="wait_put_card_words"><![CDATA[请刷卡 >>]]></string>
+ <string name="title_activity_hotel">酒店消费</string>
+ <string name="title_activity_manage">设备管理</string>
+ <string name="title_activity_revenue">营业额</string>
+ <string name="title_activity_pay">支付</string>
+ <string name="title_activity_modifypwd">修改密码</string>
+ <string name="title_activity_syspara">系统参数</string>
+ <string name="title_activity_department">部门限制</string>
+ <string name="title_activity_sddtl">SD卡流水</string>
+ <string name="title_activity_cardlib">卡库</string>
+ <string name="title_activity_upgrade">本地升级</string>
+ <!--消费菜单-->
+ <string name="consume_menu_revenue">1-营业额</string>
+ <string name="consume_menu_transdtl_upload">2-上传流水</string>
+ <string name="consume_menu_link_check">3-链路检测</string>
+ <string name="consume_menu_auth">4-手工签到</string>
+ <string name="consume_menu_syspara_query">5-参数查询</string>
+ <string name="consume_menu_manage">6-管理功能</string>
+ <string name="consume_menu_shop_password_set">7-商户密码</string>
+ <string name="consume_menu_consume_mode">8-消费模式</string>
+ <string name="consume_menu_reverse">9-手工冲正</string>
+ <!--消费维护菜单-->
+ <string name="consume_menu_shop_passwd">1-查看商户密码</string>
+ <string name="consume_menu_comm_set">2-通讯参数设置</string>
+ <string name="consume_menu_unconfirm_transdtl">3-查询未上传流水</string>
+ <string name="consume_menu_out_dtl">4-导出本地流水</string>
+ <string name="consume_menu_upgrade">5-软件在线升级</string>
+ <string name="consume_menu_app_exit">6-退出应用程序</string>
+ <string name="consume_menu_setting">7-进入设置界面</string>
+ <string name="consume_menu_clear_blklist">8-清空黑名单</string>
+ <string name="consume_menu_control_set">9-本地参数设置</string>
+ <!--充值菜单-->
+ <string name="deposit_menu_revenue">1-营业额查询</string>
+ <string name="deposit_menu_login_out">2-退出登录</string>
+ <string name="deposit_menu_reverse">3-手工冲正</string>
+ <string name="deposit_menu_param_query">4-参数查询</string>
+ <string name="deposit_menu_param_manage">5-设备管理</string>
+ <string name="deposit_menu_param_link">6-链路检测</string>
+ <!--充值维护菜单-->
+ <string name="deposit_manage_transdtl_clear">1-清空流水</string>
+ <string name="deposit_manage_comm_set">2-参数设置</string>
+ <string name="deposit_manage_upgrade">3-在线升级</string>
+ <string name="deposit_manage_app_exit">4-退出应用</string>
+ <string name="deposit_manage_setting">5-网络设置</string>
+ <!--充值参数-->
+ <string name="deposit_param_opername">操作员</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..0e8c119
--- /dev/null
+++ b/app/src/main/res/values/styles.xml
@@ -0,0 +1,483 @@
+<resources>
+
+ <!-- Base application theme. -->
+ <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+ <!-- Customize your theme here. -->
+ </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="CustomDialog" 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:windowNoTitle">true</item>
+ <item name="android:windowCloseOnTouchOutside">false</item>
+ <item name="android:windowIsTranslucent">true</item>
+ </style>
+
+ <style name="CustomProgressDialog" parent="@style/CustomDialog">
+ <item name="android:windowBackground">@android:color/transparent</item>
+ <item name="android:windowNoTitle">true</item>
+ </style>
+
+ <style name="myProgressBarStyleSmal">
+ <item name="android:indeterminateDrawable">@drawable/progress_bg</item>
+ <item name="android:minWidth">100dip</item>
+ <item name="android:maxWidth">100dip</item>
+ <item name="android:minHeight">100dip</item>
+ <item name="android:maxHeight">100dip</item>
+ </style>
+
+ <style name="myProgressBarStyleLarge">
+ <item name="android:indeterminateDrawable">@drawable/big_progress_bg</item>
+ <item name="android:width">200dp</item>
+ <item name="android:height">200dp</item>
+ </style>
+
+ <style name="PayDialog" 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>
+ <item name="android:windowNoDisplay">true</item>
+ </style>
+
+ <style name="OtherDialog" 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">false</item>
+ </style>
+ <!--activity_deposit-->
+ <style name="deposit_user_info_layout_style">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:orientation">horizontal</item>
+ <item name="android:padding">5dp</item>
+ </style>
+
+ <style name="deposit_user_info_name_style">
+ <item name="android:textSize">@dimen/deposit_text_size</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:textColor">@color/black</item>
+ </style>
+
+ <style name="deposit_user_info_value_style">
+ <item name="android:textSize">@dimen/deposit_text_size</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:textColor">@color/blue</item>
+ <item name="android:textStyle">bold</item>
+ <item name="android:maxLines">1</item>
+ </style>
+
+ <style name="deposit_result_layout_style">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:orientation">horizontal</item>
+ <item name="android:paddingLeft">10dp</item>
+ <item name="android:paddingTop">5dp</item>
+ </style>
+
+ <style name="deposit_result_name_style">
+ <item name="android:textSize">@dimen/deposit_text_size</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">match_parent</item>
+ <item name="android:textColor">@color/black</item>
+ <item name="android:maxLines">1</item>
+ </style>
+
+ <style name="deposit_result_value_style">
+ <item name="android:textSize">@dimen/deposit_text_size</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:textColor">@color/blue</item>
+ <item name="android:textStyle">bold</item>
+ <item name="android:maxLines">1</item>
+ </style>
+ <!--deposit revenue-->
+ <style name="deposit_revenue_statics_layout_style">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_marginTop">20dp</item>
+ <item name="android:orientation">horizontal</item>
+ <item name="android:weightSum">4</item>
+ </style>
+
+ <style name="deposit_revenue_statics_name_style">
+ <item name="android:layout_width">0dp</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_weight">1</item>
+ <item name="android:gravity">center</item>
+ <item name="android:textColor">@color/black</item>
+ <item name="android:textSize">20sp</item>
+ </style>
+
+ <style name="deposit_revenue_statics_value_style">
+ <item name="android:layout_width">0dp</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_weight">1</item>
+ <item name="android:gravity">center</item>
+ <item name="android:textColor">@color/black</item>
+ <item name="android:textSize">20sp</item>
+ </style>
+
+ <style name="deposit_revenue_detail_style">
+ <item name="android:textSize">25sp</item>
+ <item name="android:layout_width">0dp</item>
+ <item name="android:layout_weight">1</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:textColor">@color/black</item>
+ <item name="android:maxLines">1</item>
+ </style>
+
+ <style name="deposit_revenue_date_style">
+ <item name="android:textSize">@dimen/revenue_serch_text_size</item>
+ <item name="android:layout_width">0dp</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:gravity">center</item>
+ <item name="android:layout_weight">1</item>
+ <item name="android:textColor">@color/light_blue2</item>
+ <item name="android:textStyle">bold</item>
+ <item name="android:maxLines">1</item>
+ <item name="android:padding">5dp</item>
+ </style>
+
+ <style name="deposit_revenue_dtl_style">
+ <item name="android:layout_width">0dp</item>
+ <item name="android:layout_weight">1</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:maxLines">1</item>
+ <item name="android:textColor">@color/black</item>
+ <item name="android:textSize">20sp</item>
+ </style>
+
+ <style name="init_param_title_btn_name_style">
+ <item name="android:layout_width">0dp</item>
+ <item name="android:layout_weight">1</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_marginTop">10dp</item>
+ <item name="android:gravity">center</item>
+ <item name="android:textColor">@color/light_blue2</item>
+ <item name="android:textSize">28sp</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="init_param_mode_style">
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">match_parent</item>
+ <item name="android:textColor">@color/light_blue2</item>
+ <item name="android:textSize">@dimen/enable_devphyid_font_size</item>
+ </style>
+
+ <style name="deposit_dialog_result_name_style">
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:textColor">@color/black</item>
+ <item name="android:textSize">40sp</item>
+ </style>
+
+ <style name="deposit_dialog_result_unit_style">
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:textColor">@color/black</item>
+ <item name="android:textSize">30sp</item>
+ <item name="android:text">" 元"</item>
+ </style>
+
+ <style name="deposit_menu_text_style">
+ <item name="android:textSize">30sp</item>
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:textColor">@color/light_blue2</item>
+ </style>
+
+ <style name="deposit_param_ll_style">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:weightSum">3</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_marginTop">10dp</item>
+ <item name="android:padding">10dp</item>
+ <item name="android:orientation">horizontal</item>
+ </style>
+
+ <style name="deposit_param_text_name_style">
+ <item name="android:layout_width">0dp</item>
+ <item name="android:layout_weight">1</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:textColor">@color/light_blue2</item>
+ <item name="android:textSize">30sp</item>
+ </style>
+
+ <style name="deposit_param_text_value_style">
+ <item name="android:layout_width">0dp</item>
+ <item name="android:layout_weight">1</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:textColor">@color/light_blue2</item>
+ <item name="android:textSize">30sp</item>
+ </style>
+
+ <style name="head_title_text_style">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:gravity">center</item>
+ <item name="android:padding">20dp</item>
+ <item name="android:textColor">@color/light_blue2</item>
+ <item name="android:textSize">50sp</item>
+ </style>
+
+ <style name="head_title_inner_style">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">match_parent</item>
+ <item name="android:layout_margin">20dp</item>
+ <item name="android:background">@drawable/corner_bg_white</item>
+ <item name="android:orientation">vertical</item>
+ </style>
+
+ <style name="head_title_out_style">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">match_parent</item>
+ <item name="android:background">@color/light_blue2</item>
+ <item name="android:orientation">vertical</item>
+ </style>
+ <!--菜单项-->
+ <style name="menu_item_text_style">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:textSize">30sp</item>
+ <item name="android:textColor">@color/light_blue2</item>
+ <item name="android:paddingLeft">5dp</item>
+ <item name="android:paddingTop">5dp</item>
+ </style>
+ <!--参数查询-->
+ <style name="syspara_item_text_ll_sytle">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:orientation">horizontal</item>
+ <item name="android:padding">10dp</item>
+ <item name="android:weightSum">2</item>
+ </style>
+
+ <style name="syspara_item_text_name_sytle">
+ <item name="android:layout_width">0dp</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_weight">1</item>
+ <item name="android:textColor">@color/light_blue2</item>
+ <item name="android:textSize">30sp</item>
+ </style>
+
+ <style name="param_set_item_radio_style">
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:textColor">@color/light_blue2</item>
+ <item name="android:textSize">30sp</item>
+ <item name="android:paddingTop">5dp</item>
+ <item name="android:paddingLeft">5dp</item>
+ </style>
+
+ <style name="param_item_text_btn_style">
+ <item name="android:layout_width">0dp</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_weight">1</item>
+ <item name="android:background">@drawable/select_bg_keyboard</item>
+ <item name="android:gravity">center</item>
+ <item name="android:padding">10dp</item>
+ <item name="android:textColor">@color/white</item>
+ <item name="android:textSize">@dimen/enable_devphyid_font_size</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">@dimen/enable_step_text_size</item>
+ </style>
+
+ <style name="control_item_ll_style">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_gravity">center_horizontal</item>
+ <item name="android:layout_marginTop">@dimen/control_para_gap</item>
+ <item name="android:orientation">vertical</item>
+ </style>
+
+ <style name="control_item_text_style">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:gravity">start|center</item>
+ <item name="android:textColor">@color/enable_text_font_color</item>
+ <item name="android:textSize">@dimen/control_para_text_size</item>
+ </style>
+
+ <style name="control_text_btn_style">
+ <item name="android:layout_width">0dp</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_weight">1</item>
+ <item name="android:layout_marginLeft">20dp</item>
+ <item name="android:layout_marginRight">20dp</item>
+ <item name="android:gravity">center</item>
+ <item name="android:padding">10dp</item>
+ <item name="android:background">@drawable/select_bg_keyboard</item>
+ <item name="android:textColor">@color/light_blue2</item>
+ <item name="android:textSize">35sp</item>
+ </style>
+
+ <style name="gate_content_text_style">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:gravity">center</item>
+ <item name="android:layout_height">0dp</item>
+ <item name="android:layout_weight">1</item>
+ <item name="android:padding">@dimen/consume_text_pad_size</item>
+ <item name="android:textSize">90sp</item>
+ <item name="android:textStyle">bold</item>
+ <item name="android:textColor">@color/orange1</item>
+ </style>
+
+ <style name="gate_dialog_result_text_style">
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_marginTop">10dp</item>
+ <item name="android:maxLines">1</item>
+ <item name="android:textSize">@dimen/ordinary_consume_text_size</item>
+ <item name="android:textStyle">bold</item>
+ <item name="android:textColor">@color/orange1</item>
+ </style>
+
+ <style name="consume_wait_account_ll_style">
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:orientation">horizontal</item>
+ <item name="android:padding">@dimen/consume_text_pad_size1</item>
+ </style>
+
+ <style name="consume_wait_account_paraname_style">
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:textColor">@color/black</item>
+ <item name="android:textSize">@dimen/consume_text_size2</item>
+ </style>
+
+ <style name="consume_wait_account_paraval_style">
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:textColor">@color/blue</item>
+ <item name="android:textSize">@dimen/consume_text_size2</item>
+ <item name="android:maxLines">1</item>
+ <item name="android:textStyle">bold</item>
+ </style>
+
+ <style name="consume_wait_account_spec_paraval_style">
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_width">0dp</item>
+ <item name="android:ellipsize">end</item>
+ <item name="android:layout_weight">1</item>
+ <item name="android:textColor">@color/blue</item>
+ <item name="android:textSize">@dimen/consume_text_size2</item>
+ <item name="android:maxLines">1</item>
+ <item name="android:textStyle">bold</item>
+ </style>
+
+ <style name="consume_pay_way_hint_style">
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_marginTop">50dp</item>
+ <item name="android:textSize">25sp</item>
+ <item name="android:textStyle">bold</item>
+ <item name="android:textColor">@color/black</item>
+ <item name="android:gravity">center</item>
+ </style>
+
+ <style name="consume_pay_way_text_style">
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_marginLeft">20dp</item>
+ <item name="android:layout_marginTop">60dp</item>
+ <item name="android:layout_marginRight">20dp</item>
+ <item name="android:background">@drawable/corner_bg_qrcode_hint</item>
+ <item name="android:gravity">center</item>
+ <item name="android:padding">5dp</item>
+ <item name="android:textColor">@color/white</item>
+ <item name="android:textSize">30sp</item>
+ <item name="android:textStyle">bold</item>
+ </style>
+
+ <style name="consume_pay_way_layout_style">
+ <item name="android:layout_height">380dp</item>
+ <item name="android:layout_marginLeft">20dp</item>
+ <item name="android:layout_marginRight">20dp</item>
+ <item name="android:layout_marginTop">20dp</item>
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:orientation">horizontal</item>
+ <item name="android:background">@drawable/corner_bg_white</item>
+ </style>
+
+ <style name="consume_pay_default_photo_style">
+ <item name="android:layout_width">300dp</item>
+ <item name="android:layout_height">300dp</item>
+ <item name="android:layout_gravity">center</item>
+ <item name="android:scaleType">fitXY</item>
+ </style>
+
+ <style name="activity_pay_out_ll_style">
+ <item name="android:layout_height">match_parent</item>
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:background">@color/light_blue2</item>
+ <item name="android:orientation">vertical</item>
+ </style>
+
+ <style name="upgrade_text_desc_style">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:padding">10dp</item>
+ <item name="android:textColor">@color/black</item>
+ <item name="android:textSize">30sp</item>
+ <item name="android:maxLines">1</item>
+ </style>
+
+ <style name="upgrade_text_value_style">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_marginLeft">10dp</item>
+ <item name="android:textColor">@color/light_blue2</item>
+ <item name="android:textSize">30sp</item>
+ <item name="android:maxLines">1</item>
+ </style>
+</resources>
diff --git a/app/src/test/java/com/supwisdom/ExampleUnitTest.kt b/app/src/test/java/com/supwisdom/ExampleUnitTest.kt
new file mode 100644
index 0000000..f32e492
--- /dev/null
+++ b/app/src/test/java/com/supwisdom/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package com.supwisdom
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..3b61f16
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,28 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+ ext.kotlin_version = '1.3.31'
+ repositories {
+ google()
+ jcenter()
+
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.4.0'
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ // 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..85be9ea
--- /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
+# Kotlin code style for this project: "official" or "obsolete":
+kotlin.code.style=official
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'
diff --git a/upgrade.py b/upgrade.py
new file mode 100644
index 0000000..8de756f
--- /dev/null
+++ b/upgrade.py
@@ -0,0 +1,48 @@
+#coding=utf-8
+#使用python做升级文件打包
+
+import hashlib
+import sys
+import zipfile
+from os import path
+import subprocess
+
+hashFileName = 'hash256.sign'
+
+
+def sha256_checknum(apk):
+ hash256 = hashlib.sha256()
+ srcFile = open(apk,'rb')
+ with srcFile as f:
+ for block in iter(lambda:f.read(4096),b''):
+ hash256.update(block);
+ srcFile.close()
+ hash256.update(b'nzoqPYMIu91VViA/mEIG5FtJXi8=')
+
+ hashFile = path.dirname(apk)+'/'+hashFileName
+ print('hashFile = '+hashFile)
+ destFile = open(hashFile,'w+')
+ destFile.write(hash256.hexdigest())
+ destFile.close()
+
+def zip_file(apk):
+ fileDir = path.dirname(apk)
+ version = subprocess.check_output(['git', 'describe', '--abbrev=4','--dirty','--always','--tags']).strip().decode('utf-8')
+ zipFile = fileDir+'/posa711'+'-'+version+'.zip'
+ print('zipFile = '+zipFile)
+
+ zf = zipfile.ZipFile(zipFile,'w',zipfile.ZIP_DEFLATED)
+ zf.write(fileDir+'/'+hashFileName,hashFileName)
+ zf.write(apk,'posa711.apk')
+ zf.close()
+
+if __name__ == '__main__':
+ appFile = './app/release/app-release.apk'
+ print('appFile = ' + appFile)
+
+ if not path.exists(appFile):
+ print(appFile +' is not exist')
+ exit()
+ sha256_checknum(appFile)
+ zip_file(appFile)
+ print('build upgrade zip success!')
\ No newline at end of file