Bladeren bron

添加模块sybotan-android-base。

庞利祥 5 jaren geleden
bovenliggende
commit
3082d8cf7d
22 gewijzigde bestanden met toevoegingen van 1735 en 0 verwijderingen
  1. 188 0
      sybotan-android-base/build.gradle
  2. 21 0
      sybotan-android-base/proguard-rules.pro
  3. 33 0
      sybotan-android-base/src/main/AndroidManifest.xml
  4. 64 0
      sybotan-android-base/src/main/java/com/sybotan/android/base/SApplication.kt
  5. 142 0
      sybotan-android-base/src/main/java/com/sybotan/android/base/SOptions.kt
  6. 100 0
      sybotan-android-base/src/main/java/com/sybotan/android/base/activities/SBaseActivity.kt
  7. 121 0
      sybotan-android-base/src/main/java/com/sybotan/android/base/comparators/SFileComparator.kt
  8. 43 0
      sybotan-android-base/src/main/java/com/sybotan/android/base/comparators/SSizesByAreaComparator.kt
  9. 48 0
      sybotan-android-base/src/main/java/com/sybotan/android/base/extensions/SActivityExtension.kt
  10. 42 0
      sybotan-android-base/src/main/java/com/sybotan/android/base/extensions/SMenuExtension.kt
  11. 87 0
      sybotan-android-base/src/main/java/com/sybotan/android/base/extensions/SPathExtension.kt
  12. 48 0
      sybotan-android-base/src/main/java/com/sybotan/android/base/extensions/SRectExtension.kt
  13. 48 0
      sybotan-android-base/src/main/java/com/sybotan/android/base/extensions/SRectFExtension.kt
  14. 43 0
      sybotan-android-base/src/main/java/com/sybotan/android/base/extensions/SWebResourceRequestExtension.kt
  15. 57 0
      sybotan-android-base/src/main/java/com/sybotan/android/base/services/SVibratorService.kt
  16. 56 0
      sybotan-android-base/src/main/java/com/sybotan/android/base/utils/SKeyboardUtil.kt
  17. 140 0
      sybotan-android-base/src/main/java/com/sybotan/android/base/utils/SQrCodeUtil.kt
  18. 32 0
      sybotan-android-base/src/main/res/animator/sybotan_anim.xml
  19. 53 0
      sybotan-android-base/src/main/res/drawable/sybotan_logo.xml
  20. 39 0
      sybotan-android-base/src/main/res/drawable/sybotan_logo_anim.xml
  21. 301 0
      sybotan-android-base/src/main/res/values/material_design_colors.xml
  22. 29 0
      sybotan-android-base/src/main/res/values/strings.xml

+ 188 - 0
sybotan-android-base/build.gradle

@@ -0,0 +1,188 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+group rootProject.group
+version rootProject.version
+
+apply plugin: 'com.android.library'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+apply plugin: 'org.jetbrains.dokka-android'
+apply plugin: 'maven'
+
+sourceCompatibility = JVM_TARGET
+
+//compileKotlin {
+//    kotlinOptions.jvmTarget = JVM_TARGET
+//}
+//compileTestKotlin {
+//    kotlinOptions.jvmTarget = JVM_TARGET
+//}
+
+android {
+    compileSdkVersion ANDROID_SDK_VERSION.toInteger()
+    buildToolsVersion ANDROID_BUILD_TOOLS_VERSION
+
+    defaultConfig {
+        minSdkVersion ANDROID_MIN_SDK_VERSION.toInteger()
+        targetSdkVersion ANDROID_SDK_VERSION.toInteger()
+        versionCode SYBOTAN_CODE.toInteger()
+        versionName SYBOTAN_ANDROID_VERSION
+
+        testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
+    }
+
+    buildTypes {
+        release {
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+    }
+
+    kotlinOptions {
+        jvmTarget = JVM_TARGET
+    }
+}
+
+dependencies {
+    implementation fileTree(dir: 'libs', include: ['*.jar'])
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // kotlin 依赖
+    implementation group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib-jdk8', version: KOTLIN_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // android支持
+    implementation group: 'com.android.support', name: 'appcompat-v7', version: ANDROID_SUPPORT_VERSION
+    implementation group: 'com.android.support', name: 'design', version: ANDROID_SUPPORT_VERSION
+    //implementation group: 'com.android.support', name: 'support-v4', version: ANDROID_SUPPORT_VERSION
+    implementation group: 'com.android.support.constraint', name: 'constraint-layout', version: CONSTRAINT_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // anko依赖
+    // https://mvnrepository.com/artifact/org.jetbrains.anko/anko-common
+    implementation group: 'org.jetbrains.anko', name: 'anko-commons', version: ANKO_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // 测试依赖
+    testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: JUNIT_VERSION
+    androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.2', {
+        exclude group: 'com.android.support', module: 'support-annotations'
+    })
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // 运行时权限申请
+    // https://mvnrepository.com/artifact/pub.devrel/easypermissions
+    implementation group: 'pub.devrel', name: 'easypermissions', version: EASYPERMISSIONS_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // http请求
+    // https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp
+    implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: OKHTTP_VERSION
+
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // JSON解析
+    // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core
+    implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: JACKSON_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // 二维码与条形码
+    // https://mvnrepository.com/artifact/com.google.zxing/core
+    implementation group: 'com.google.zxing', name: 'core', version: ZXING_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // Sybotan依赖
+    implementation group: 'com.sybotan', name: 'sybotan-kotlin-base', version: SYBOTAN_KOTLIN_VERSION
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// 文档生成
+
+// 源码
+task sourcesJar(type: Jar) {
+    group = 'jar'
+    from "${android.sourceSets.main.java.srcDirs}"
+    classifier = 'sources'
+}
+
+// 文档
+task dokkaJavadoc(type: org.jetbrains.dokka.gradle.DokkaTask) {
+    jdkVersion = JDK_VERSION.toInteger()
+    noStdlibLink = true
+    outputFormat = 'javadoc'
+    outputDirectory = "$buildDir/javadoc"
+//    sourceDirs = files('src/main/java')
+}
+
+// 上成上传的文档jar包
+task javadocJar(type: Jar, dependsOn: dokkaJavadoc) {
+    group = 'jar'
+    classifier = 'javadoc'
+    from "${dokka.outputDirectory}"
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// maven 仓库管理
+
+// 设置上传的包,默认上传aar与pom
+artifacts {
+    // 上传源码包
+    // archives sourcesJar
+    // 上传文档包
+    // archives javadocJar
+}
+
+uploadArchives {
+    repositories {
+        mavenDeployer {
+            pom.groupId = project.group
+            pom.version = project.version
+            pom.artifactId = project.name
+            pom.project {
+                name project.name
+                packaging 'jar'
+                url SYBOTAN_URL
+                description '斯伯坦机器人世界 android核心支持库。'
+                licenses {
+                    license {
+                        name 'The Apache Software License, Version 2.0'
+                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+                    }
+                }
+                developers {
+                    developer {
+                        id DEVELOPER_ID
+                        name DEVELOPER_NAME
+                    }
+                }
+            }
+            snapshotRepository(url: MAVEN_REPO_SNAPSHOT_URL) {
+                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
+            }
+            repository(url: MAVEN_REPO_RELEASE_URL) {
+                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
+            }
+        }
+    }
+}

+ 21 - 0
sybotan-android-base/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

+ 33 - 0
sybotan-android-base/src/main/AndroidManifest.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ *********************************************************************************************************************
+  ~
+  ~               iFHS7.
+  ~              ;BBMBMBMc                  rZMBMBR              BMB
+  ~              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+  ~     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+  ~     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+  ~      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+  ~     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+  ~     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+  ~     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+  ~         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+  ~     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+  ~      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+  ~         i0BM: SWKHKGO  MBDv
+  ~           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+  ~              ,  XMW  ..
+  ~                  r                                                                     All rights reserved.
+  ~
+  ~ *********************************************************************************************************************
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="com.sybotan.android.base">
+
+    <!-- 震动器权限 -->
+    <uses-permission android:name="android.permission.VIBRATE"/>
+
+    <application>
+    </application>
+
+</manifest>

+ 64 - 0
sybotan-android-base/src/main/java/com/sybotan/android/base/SApplication.kt

@@ -0,0 +1,64 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.sybotan.android.base
+
+import android.app.Application
+import android.app.Service
+import android.os.Vibrator
+import com.sybotan.android.base.services.SVibratorService
+
+/**
+ * 斯伯坦机器人android应用程序对象
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+open class SApplication : Application() {
+    /** 类静态成员 */
+    companion object {
+        /** 应用程序对象 */
+        lateinit var app: SApplication
+    } // companion object
+
+    /** 数据库版本 */
+    var databaseVersion: Int = 1
+
+    /**
+     * 主构造函数
+     */
+    init {
+        app = this
+    } // init
+
+    /**
+     * 创建应用时调用
+     */
+    override fun onCreate() {
+        super.onCreate()
+
+        // 初始化震动器
+        SVibratorService.vibrator = getSystemService(Service.VIBRATOR_SERVICE) as Vibrator
+
+        return
+    }// Function onCreate()
+} // Class SApplication

+ 142 - 0
sybotan-android-base/src/main/java/com/sybotan/android/base/SOptions.kt

@@ -0,0 +1,142 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.sybotan.android.base
+
+import android.content.SharedPreferences
+import org.jetbrains.anko.defaultSharedPreferences
+
+/**
+ * 保存应用系统设置
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+open class SOptions {
+    /** 共享存储对象 */
+    private var pref: SharedPreferences = SApplication.app.defaultSharedPreferences
+
+    /**
+     * 获得Boolean类型的值
+     *
+     * @param   key         键
+     * @param   default     默认值
+     */
+    fun getBoolean(key: String, default: Boolean): Boolean {
+        return pref.getBoolean(key, default)
+    } // Function getBoolean()
+
+    /**
+     * 设置Boolean类型的值
+     *
+     * @param   key         键
+     * @param   value       值
+     */
+    fun putBoolean(key: String, value: Boolean) {
+        pref.edit().putBoolean(key, value).apply()
+        return
+    } // Function putBoolean()
+
+    /**
+     * 获得Float类型的值
+     *
+     * @param   key         键
+     * @param   default     默认值
+     */
+    fun getFloat(key: String, default: Float): Float {
+        return pref.getFloat(key, default)
+    } // Function getFloat()
+
+    /**
+     * 设置Float类型的值
+     *
+     * @param   key         键
+     * @param   value       值
+     */
+    fun putFloat(key: String, value: Float) {
+        pref.edit().putFloat(key, value).apply()
+        return
+    } // Function putFloat()
+
+    /**
+     * 获得Int类型的值
+     *
+     * @param   key         键
+     * @param   default     默认值
+     */
+    fun getInt(key: String, default: Int): Int {
+        return pref.getInt(key, default)
+    } // Function getInt()
+
+    /**
+     * 设置Int类型的值
+     *
+     * @param   key         键
+     * @param   value       值
+     */
+    fun putInt(key: String, value: Int) {
+        pref.edit().putInt(key, value).apply()
+        return
+    } // Function putInt()
+
+    /**
+     * 获得Long类型的值
+     *
+     * @param   key         键
+     * @param   default     默认值
+     */
+    fun getLong(key: String, default: Long): Long {
+        return pref.getLong(key, default)
+    } // Function getLong()
+
+    /**
+     * 设置Long类型的值
+     *
+     * @param   key         键
+     * @param   value       值
+     */
+    fun putLong(key: String, value: Long) {
+        pref.edit().putLong(key, value).apply()
+        return
+    } // Function putLong()
+
+    /**
+     * 获得String类型的值
+     *
+     * @param   key         键
+     * @param   default     默认值
+     */
+    fun getString(key: String, default: String): String {
+        return pref.getString(key, default)!!
+    } // Function getString()
+
+    /**
+     * 设置String类型的值
+     *
+     * @param   key         键
+     * @param   value       值
+     */
+    fun putString(key: String, value: String) {
+        pref.edit().putString(key, value).apply()
+        return
+    } // Function putString()
+} // Class SOptions

+ 100 - 0
sybotan-android-base/src/main/java/com/sybotan/android/base/activities/SBaseActivity.kt

@@ -0,0 +1,100 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.sybotan.android.base.activities
+
+import android.support.v7.app.AppCompatActivity
+import org.jetbrains.anko.toast
+import pub.devrel.easypermissions.AppSettingsDialog
+import pub.devrel.easypermissions.EasyPermissions
+
+/**
+ * Activity基类
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+open class SBaseActivity : AppCompatActivity(), EasyPermissions.PermissionCallbacks {
+
+
+    /**
+     * 申请权限
+     *
+     * @param   permissionList      权限列表
+     * @param   requestCode         请求码
+     */
+    fun requestPermission(permissionList: Array<String> , requestCode: Int = 1) {
+        // 如果没有获得相应的权限
+        if (!EasyPermissions.hasPermissions(this, *permissionList)) {
+            // 申请权限
+            EasyPermissions.requestPermissions(this, "", requestCode, *permissionList)
+        }
+
+        return
+    } // Function requestPermission()
+
+    /**
+     * 用户授权成功回调
+     *
+     * @param   requestCode     请求码
+     * @param   perms           请求权限列表
+     */
+    override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
+        toast("用户授权失败!")
+        /**
+         * 若是在权限弹窗中,用户勾选了'NEVER ASK AGAIN.'或者'不在提示',且拒绝权限。
+         * 这时候,需要跳转到设置界面去,让用户手动开启。
+         */
+        if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
+            AppSettingsDialog.Builder(this)
+                    .setRationale("此功能需要权限,否则无法正常使用,是否打开设置")
+                    .setPositiveButton("是")
+                    .setNegativeButton("否")
+                    .build()
+                    .show()
+        }
+    } // Function onPermissionsDenied()
+
+    /**
+     * 用户授权成功回调
+     *
+     * @param   requestCode     请求码
+     * @param   perms           请求权限列表
+     */
+    override fun onPermissionsGranted(requestCode: Int, perms: MutableList<String>) {
+        toast("用户授权成功!")
+        return
+    } // Function onPermissionsGranted()
+
+    /**
+     * 请求权限结果
+     *
+     * @param   requestCode     请求码
+     * @param   permissions     请求权限列表
+     * @param   grantResults    授权结果
+     */
+    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
+        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+        return
+    } // Function onRequestPermissionsResult()
+} // Class SBaseActivity()

+ 121 - 0
sybotan-android-base/src/main/java/com/sybotan/android/base/comparators/SFileComparator.kt

@@ -0,0 +1,121 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.sybotan.android.base.comparators
+
+import java.io.File
+
+/**
+ * 文件排序器
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+class SFileComparator {
+    /**
+     * 名称升序比较器
+     *
+     * @author  庞利祥(sybotan@126.com)
+     */
+    class NameAsc : Comparator<File> {
+        /**
+         * 文件名比较
+         *
+         * @param   file1   文件1
+         * @param   file2   文件2
+         * @return  如果文件1比文件2名称靠后返回1,否则返回-1
+         */
+        override fun compare(file1: File, file2: File): Int {
+            return if (file1.name > file2.name) {
+                1
+            } else {
+                -1
+            }
+        } // Function compare()
+    } // LastModifiedAsc
+
+    /**
+     * 文件名比较器
+     *
+     * @author  庞利祥(sybotan@126.com)
+     */
+    class NameDesc : Comparator<File> {
+        /**
+         * 创建时间比较
+         *
+         * @param   file1   文件1
+         * @param   file2   文件2
+         * @return  如果文件1比文件2名称靠前返回1,否则返回-1
+         */
+        override fun compare(file1: File, file2: File): Int {
+            return if (file1.name < file2.name) {
+                1
+            } else {
+                -1
+            }
+        } // Function compare()
+    } // NameDesc
+
+    /**
+     * 创建时间升序比较器
+     *
+     * @author  庞利祥(sybotan@126.com)
+     */
+    class LastModifiedAsc : Comparator<File> {
+        /**
+         * 创建时间比较
+         *
+         * @param   file1   文件1
+         * @param   file2   文件2
+         * @return  如果文件1比文件2修改时间靠后返回1,否则返回-1
+         */
+        override fun compare(file1: File, file2: File): Int {
+            return if (file1.lastModified() > file2.lastModified()) {
+                1
+            } else {
+                -1
+            }
+        } // Function compare()
+    } // LastModifiedAsc
+
+    /**
+     * 创建时间降序比较器
+     *
+     * @author  庞利祥(sybotan@126.com)
+     */
+    class LastModifiedDesc : Comparator<File> {
+        /**
+         * 创建时间比较
+         *
+         * @param   file1   文件1
+         * @param   file2   文件2
+         * @return  如果文件1比文件2修改时间靠前返回1,否则返回-1
+         */
+        override fun compare(file1: File, file2: File): Int {
+            return if (file1.lastModified() < file2.lastModified()) {
+                1
+            } else {
+                -1
+            }
+        } // Function compare()
+    } // LastModifiedDesc
+} // Class SFileComparator

+ 43 - 0
sybotan-android-base/src/main/java/com/sybotan/android/base/comparators/SSizesByAreaComparator.kt

@@ -0,0 +1,43 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.sybotan.android.base.comparators
+
+import android.util.Size
+
+/**
+ * 区域大小比较器
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+class SSizesByAreaComparator : Comparator<Size> {
+    /**
+     * 判断区域lhs是否比rhs大
+     *
+     * @param   lhs     比较区域1
+     * @param   rhs     比较区域2
+     */
+    override fun compare(lhs: Size, rhs: Size): Int {
+        return java.lang.Long.signum(lhs.width.toLong() * lhs.height - rhs.width.toLong() * rhs.height)
+    } // Function compare()
+} // Class SSizesByAreaComparator()

+ 48 - 0
sybotan-android-base/src/main/java/com/sybotan/android/base/extensions/SActivityExtension.kt

@@ -0,0 +1,48 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.sybotan.android.base.extensions
+
+import android.app.Activity
+import android.graphics.Color
+import android.view.View
+
+/**
+ * 全屏沉浸
+ */
+fun Activity.immersive() {
+    window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION  or View.SYSTEM_UI_FLAG_IMMERSIVE or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+    window.navigationBarColor = Color.TRANSPARENT
+    window.statusBarColor = Color.TRANSPARENT
+    return
+} // Function Activity.immersive()
+
+/**
+ * 粘性沉浸
+ */
+fun Activity.immersiveSticky() {
+    window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION  or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+    window.navigationBarColor = Color.TRANSPARENT
+    window.statusBarColor = Color.TRANSPARENT
+    return
+} // Function Activity.immersiveSticky()

+ 42 - 0
sybotan-android-base/src/main/java/com/sybotan/android/base/extensions/SMenuExtension.kt

@@ -0,0 +1,42 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.sybotan.android.base.extensions
+
+import android.view.Menu
+import android.view.MenuItem
+
+/**
+ * Menu扩展indexOf函数
+ *
+ * @param   item    查询item
+ * @return  item索引,不存在返回-1
+ */
+fun Menu.indexOf(item: MenuItem): Int {
+    for (i in 0 until size()) {
+        if (this.getItem(i) === item) {
+            return i
+        }
+    }
+    return -1
+} // Function Menu.indexO()

+ 87 - 0
sybotan-android-base/src/main/java/com/sybotan/android/base/extensions/SPathExtension.kt

@@ -0,0 +1,87 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.sybotan.android.base.extensions
+
+import android.graphics.Path
+
+/**
+ * 为Path扩展logo接口
+ *
+ * @return  logo的Path路径
+ */
+fun Path.logo(zoom: Float = 1f): Path {
+
+    val p1 = Path()
+    p1.addCircle(0f * zoom, 20f * zoom, 30f * zoom, Path.Direction.CCW)
+    val headPath = Path()
+    headPath.addCircle(0f * zoom, 0f * zoom, 50f * zoom, Path.Direction.CCW)
+    headPath.op(p1, Path.Op.DIFFERENCE)
+
+    val bodyPath = Path()
+    bodyPath.rLineTo(40f * zoom, -20f * zoom)
+    bodyPath.rLineTo(0f * zoom, 110f * zoom)
+    bodyPath.rLineTo(-10f * zoom, 30f * zoom)
+    bodyPath.rLineTo(-30f * zoom, 40f * zoom)
+    bodyPath.rLineTo(-30f * zoom, -40f * zoom)
+    bodyPath.rLineTo(-10f * zoom, -30f * zoom)
+    bodyPath.rLineTo(0f * zoom, -110f * zoom)
+    bodyPath.close()
+
+    val leftPath = Path()
+    leftPath.rLineTo(0f * zoom, 120f * zoom)
+    leftPath.rLineTo(20f * zoom, 50f * zoom)
+    leftPath.rLineTo(-90f * zoom, -60f * zoom)
+    leftPath.rLineTo(-10f * zoom, -30f * zoom)
+    leftPath.rLineTo(50f * zoom, 25f * zoom)
+    leftPath.rLineTo(0f * zoom, -20f * zoom)
+    leftPath.rLineTo(-50f * zoom, -25f * zoom)
+    leftPath.rLineTo(0f * zoom, -40f * zoom)
+    leftPath.rLineTo(50f * zoom, 25f * zoom)
+    leftPath.rLineTo(0f * zoom, -20f * zoom)
+    leftPath.rLineTo(-50f * zoom, -25f * zoom)
+    leftPath.rLineTo(0f * zoom, -40f * zoom)
+    leftPath.close()
+
+    val rightPath = Path()
+    rightPath.rLineTo(0f * zoom, 120f * zoom)
+    rightPath.rLineTo(-20f * zoom, 50f * zoom)
+    rightPath.rLineTo(90f * zoom, -60f * zoom)
+    rightPath.rLineTo(10f * zoom, -30f * zoom)
+    rightPath.rLineTo(-50f * zoom, 25f * zoom)
+    rightPath.rLineTo(0f * zoom, -20f * zoom)
+    rightPath.rLineTo(50f * zoom, -25f * zoom)
+    rightPath.rLineTo(0f * zoom, -40f * zoom)
+    rightPath.rLineTo(-50f * zoom, 25f * zoom)
+    rightPath.rLineTo(0f * zoom, -20f * zoom)
+    rightPath.rLineTo(50f * zoom, -25f * zoom)
+    rightPath.rLineTo(0f * zoom, -40f * zoom)
+    rightPath.close()
+
+    val logoPath = Path()
+    logoPath.addPath(headPath, 0f * zoom, -90f * zoom)
+    logoPath.addPath(bodyPath, 0f * zoom, -20f * zoom)
+    logoPath.addPath(leftPath, -60f * zoom, -50f * zoom)
+    logoPath.addPath(rightPath, 60f * zoom, -50f * zoom)
+    return logoPath
+} // Function logo()

+ 48 - 0
sybotan-android-base/src/main/java/com/sybotan/android/base/extensions/SRectExtension.kt

@@ -0,0 +1,48 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.sybotan.android.base.extensions
+
+import android.graphics.Point
+import android.graphics.Rect
+
+/**
+ * RectF位置移dx,dy
+ *
+ * @param   dx          横向移动的距离
+ * @param   dy          纵向移动的距离
+ * @return  移动后的RectF
+ */
+fun Rect.adjusted(dx: Int, dy: Int): Rect {
+    return Rect(this.left + dx, this.top + dy, this.right + dx, this.bottom + dy)
+} // Function adjusted()
+
+/**
+ * RectF位置移offset
+ *
+ * @param   offset      移动偏移量
+ * @return  移动后的RectF
+ */
+fun Rect.adjusted(offset: Point): Rect {
+    return adjusted(offset.x, offset.y)
+} // Function adjusted()

+ 48 - 0
sybotan-android-base/src/main/java/com/sybotan/android/base/extensions/SRectFExtension.kt

@@ -0,0 +1,48 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.sybotan.android.base.extensions
+
+import android.graphics.PointF
+import android.graphics.RectF
+
+/**
+ * RectF位置移dx,dy
+ *
+ * @param   dx          横向移动的距离
+ * @param   dy          纵向移动的距离
+ * @return  移动后的RectF
+ */
+fun RectF.adjusted(dx: Float, dy: Float): RectF {
+    return RectF(this.left + dx, this.top + dy, this.right + dx, this.bottom + dy)
+} // Function adjusted()
+
+/**
+ * RectF位置移offset
+ *
+ * @param   offset      移动偏移量
+ * @return  移动后的RectF
+ */
+fun RectF.adjusted(offset: PointF): RectF {
+    return adjusted(offset.x, offset.y)
+} // Function adjusted()

+ 43 - 0
sybotan-android-base/src/main/java/com/sybotan/android/base/extensions/SWebResourceRequestExtension.kt

@@ -0,0 +1,43 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.sybotan.android.base.extensions
+
+import android.webkit.WebResourceRequest
+import java.util.regex.Pattern
+
+/**
+ * 获得请求参数
+ *
+ * @param   name        参数名称
+ * @return  参数的值
+ */
+fun WebResourceRequest.param(name: String): String {
+    var ret = ""
+    val p = Pattern.compile("[&?]$name=([^&]*)(&|$)")
+    val m = p.matcher(this.url.toString())
+    while (m.find()) {
+        ret = m.group(1)
+    }
+    return ret
+} // Function param()

+ 57 - 0
sybotan-android-base/src/main/java/com/sybotan/android/base/services/SVibratorService.kt

@@ -0,0 +1,57 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.sybotan.android.base.services
+
+import android.os.Build
+import android.os.VibrationEffect
+import android.os.Vibrator
+
+/**
+ * 震动器服务对象
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+object SVibratorService {
+    /** 震动器 */
+    var vibrator: Vibrator? = null
+
+    /**
+     * 震动器震动
+     *
+     * @param   millisecond     震动时间,单位毫秒*
+     */
+    fun vibrate(millisecond: Long, amplitude: Int = 128) {
+
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {           // API 26 以上使用以下代码
+            val vibrationEffect  = VibrationEffect.createOneShot(millisecond, amplitude)
+            vibrator?.vibrate(vibrationEffect)
+        } else {
+            vibrator?.vibrate(millisecond)
+        }
+
+
+        return
+    } // Function vibrate()
+
+} // Class SVibratorService

+ 56 - 0
sybotan-android-base/src/main/java/com/sybotan/android/base/utils/SKeyboardUtil.kt

@@ -0,0 +1,56 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.sybotan.android.base.utils
+
+import android.content.Context.INPUT_METHOD_SERVICE
+import android.app.Activity
+import android.view.inputmethod.InputMethodManager
+
+
+/**
+ * Android软键盘工具类
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+object SKeyboardUtil {
+    /**
+     * 隐藏键盘
+     *
+     * @param   activity     当前activity对象
+     */
+    fun dismissSoftKeyboard(activity: Activity): Boolean {
+        try {
+            val inputMethodManage = activity.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
+            return if (activity.currentFocus == null) {
+                inputMethodManage.hideSoftInputFromWindow(activity.window.decorView.windowToken, 0)
+            } else {
+                inputMethodManage.hideSoftInputFromWindow(activity.currentFocus!!.windowToken, 0)
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+
+        return false
+    } // Function dismissSoftKeyboard()
+} // Object SKeyboardUtil

+ 140 - 0
sybotan-android-base/src/main/java/com/sybotan/android/base/utils/SQrCodeUtil.kt

@@ -0,0 +1,140 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.sybotan.android.base.utils
+
+import android.graphics.*
+import android.webkit.JavascriptInterface
+import com.google.zxing.*
+import com.google.zxing.common.HybridBinarizer
+import com.google.zxing.qrcode.QRCodeReader
+import com.google.zxing.qrcode.QRCodeWriter
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel
+import java.util.*
+
+/**
+ * 二维码生成工具
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+object SQrCodeUtil {
+
+    /** 背景颜色 */
+    var bgColor = 0xFFFFFFFF.toInt()
+    /** 前景颜色 */
+    var pixelColor = 0xFF000000.toInt()
+
+    /**
+     * 创建二维码图像
+     *
+     * @param   contents        二维码存储的内容
+     * @param   size            二维码大小
+     * @return  二维码图像
+     */
+    @JavascriptInterface
+    fun createQrCode(contents: String, size: Int, logo: Bitmap? = null): Bitmap? {
+        try {
+            val hints = Hashtable<EncodeHintType, Any>()
+            hints[EncodeHintType.CHARACTER_SET] = "utf-8"
+            hints[EncodeHintType.ERROR_CORRECTION] = ErrorCorrectionLevel.H
+
+            val matrix = QRCodeWriter().encode(contents, BarcodeFormat.QR_CODE, size, size, hints)
+            var image = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888)
+
+            for (y in 0 until size) {
+                for (x in 0 until size) {
+                    if (matrix.get(x, y)) {
+                        image.setPixel(x, y, pixelColor)
+                    } else {
+                        image.setPixel(x, y, bgColor)
+                    }
+                }
+            }
+
+            if (null != logo) {
+                image = addLogo(image, logo)
+            }
+
+            return image
+        } catch (e: WriterException) {
+            e.printStackTrace()
+        }
+        return null
+    } // Function createQrCode()
+
+    /**
+     * 解析二维码图片
+     *
+     * @param   bitmap      二维码图片
+     * @return  解析结果
+     */
+    fun decodeQrCode(bitmap: Bitmap): String? {
+        val width = bitmap.width
+        val height = bitmap.height
+        val pixels = IntArray(width * height)
+        bitmap.getPixels(pixels, 0, width, 0, 0, width, height)
+        val luminanceSource = RGBLuminanceSource(width, height, pixels)
+        val binaryBitmap = BinaryBitmap(HybridBinarizer(luminanceSource))
+        return decodeQrCode(binaryBitmap)
+    } // Function decode()
+
+    /**
+     * 解析二维码
+     *
+     * @param   binaryBitmap    被解析的图形对象
+     * @return  解析的结果
+     */
+    fun decodeQrCode(binaryBitmap: BinaryBitmap): String? {
+        return try {
+            val hints = HashMap<DecodeHintType, Any>()
+            hints[DecodeHintType.CHARACTER_SET] = "utf-8"
+            hints[DecodeHintType.TRY_HARDER] = true
+            hints[DecodeHintType.POSSIBLE_FORMATS] = BarcodeFormat.QR_CODE
+            val result = QRCodeReader().decode(binaryBitmap, hints)
+            result.text
+        } catch (e: Exception) {
+            e.printStackTrace()
+            null
+        }
+    } // Function decode()
+
+    /**
+     * 为二维码图片增加Logo
+     *
+     * @param   src         二维码图片
+     * @param   logo        Logol图片
+     * @return  添加过Logo的二维码图片
+     */
+    private fun addLogo(src: Bitmap, logo: Bitmap): Bitmap {
+        val srcWidth = src.width
+        val srcHeight = src.height
+
+        val image = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888)
+        val canvas = Canvas(image)
+        canvas.drawBitmap(src,0f,0f, null)
+        canvas.drawBitmap(logo, Rect(0, 0, srcWidth, srcHeight),
+                RectF(srcWidth * 2 / 5f, srcHeight * 2 / 5f, srcWidth * 3 / 5f, srcHeight * 3 / 5f), null)
+
+        return image
+    } // Function addLogo()
+} // Object QrCodeUntil

+ 32 - 0
sybotan-android-base/src/main/res/animator/sybotan_anim.xml

@@ -0,0 +1,32 @@
+<!--
+  ~ *********************************************************************************************************************
+  ~
+  ~               iFHS7.
+  ~              ;BBMBMBMc                  rZMBMBR              BMB
+  ~              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+  ~     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+  ~     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+  ~      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+  ~     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+  ~     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+  ~     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+  ~         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+  ~     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+  ~      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+  ~         i0BM: SWKHKGO  MBDv
+  ~           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+  ~              ,  XMW  ..
+  ~                  r                                                                     All rights reserved.
+  ~
+  ~ *********************************************************************************************************************
+  -->
+<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
+                android:duration="5000"
+                android:interpolator="@android:anim/linear_interpolator"
+                android:propertyName="trimPathOffset"
+                android:repeatMode="restart"
+                android:repeatCount="infinite"
+                android:valueFrom="0"
+                android:valueTo="1"
+                android:valueType="floatType">
+</objectAnimator>

+ 53 - 0
sybotan-android-base/src/main/res/drawable/sybotan_logo.xml

@@ -0,0 +1,53 @@
+<!--
+  ~ *********************************************************************************************************************
+  ~
+  ~               iFHS7.
+  ~              ;BBMBMBMc                  rZMBMBR              BMB
+  ~              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+  ~     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+  ~     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+  ~      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+  ~     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+  ~     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+  ~     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+  ~         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+  ~     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+  ~      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+  ~         i0BM: SWKHKGO  MBDv
+  ~           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+  ~              ,  XMW  ..
+  ~                  r                                                                     All rights reserved.
+  ~
+  ~ *********************************************************************************************************************
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="256dp"
+        android:height="256dp"
+        android:viewportWidth="256.0"
+        android:viewportHeight="256.0">
+    <path
+            android:name="header"
+            android:strokeWidth="3"
+            android:trimPathEnd="0.96"
+            android:pathData="M128,3c-24.7,0 -44.6,20 -44.6,44.6c0,22.7 17,41.5 39,44.3c-12.1,-2.6 -21.2,-13.4 -21.2,-26.4c0,-14.9 12,-27 26.9,-27c14.9,0 26.9,12.1 26.9,27c0,13 -9.1,23.8 -21.2,26.4c22,-2.8 39,-21.5 39,-44.3C172.6,23 152.7,3 128,3z"
+            android:strokeColor="#E60012"/>
+    <path
+            android:name="body"
+            android:strokeWidth="3"
+            android:trimPathEnd="0.95"
+            android:pathData="M163.7,92.3l-35.7,17.8l-35.7,-17.8l0,98.2l8.9,26.8l26.8,35.7l26.8,-35.7l8.9,-26.8z"
+            android:strokeColor="#E60012"/>
+    <path
+            android:name="left"
+            android:strokeWidth="3"
+            android:trimPathEnd="0.97"
+            android:pathData="M74.4,190.5l0,-17.9l0,-35.7l0,-17.8l0,-17.6l0,-18.1l-71.4,-35.7l0,35.7l44.6,22.3l0,17.8l-44.6,-22.3l0,35.7l44.6,22.3l0,17.9l-44.6,-22.3l8.9,26.8l80.4,53.5z"
+            android:strokeColor="#E60012"/>
+    <path
+            android:name="right"
+            android:strokeWidth="3"
+            android:trimPathEnd="0.97"
+            android:pathData="M253,83.4l0,-35.7l-71.4,35.7l0,17.8l0,17.9l0,17.8l0,35.7l0,17.7l1,0l-1.2,0.5l-17.8,44.7l80.5,-53.9l8.9,-26.8l-43.5,21.9l0,-18l43.5,-21.8l0,-35.7l-43.5,21.8l0,-17.9z"
+            android:strokeColor="#E60012"/>
+</vector>

+ 39 - 0
sybotan-android-base/src/main/res/drawable/sybotan_logo_anim.xml

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ *********************************************************************************************************************
+  ~
+  ~               iFHS7.
+  ~              ;BBMBMBMc                  rZMBMBR              BMB
+  ~              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+  ~     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+  ~     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+  ~      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+  ~     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+  ~     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+  ~     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+  ~         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+  ~     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+  ~      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+  ~         i0BM: SWKHKGO  MBDv
+  ~           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+  ~              ,  XMW  ..
+  ~                  r                                                                     All rights reserved.
+  ~
+  ~ *********************************************************************************************************************
+  -->
+
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
+                 android:drawable="@drawable/sybotan_logo">
+    <target
+            android:animation="@animator/sybotan_anim"
+            android:name="header"/>
+    <target
+            android:animation="@animator/sybotan_anim"
+            android:name="body"/>
+    <target
+            android:animation="@animator/sybotan_anim"
+            android:name="left"/>
+    <target
+            android:animation="@animator/sybotan_anim"
+            android:name="right"/>
+</animated-vector>

+ 301 - 0
sybotan-android-base/src/main/res/values/material_design_colors.xml

@@ -0,0 +1,301 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ *********************************************************************************************************************
+  ~
+  ~               iFHS7.
+  ~              ;BBMBMBMc                  rZMBMBR              BMB
+  ~              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+  ~     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+  ~     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+  ~      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+  ~     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+  ~     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+  ~     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+  ~         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+  ~     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+  ~      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+  ~         i0BM: SWKHKGO  MBDv
+  ~           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+  ~              ,  XMW  ..
+  ~                  r                                                                     All rights reserved.
+  ~
+  ~ *********************************************************************************************************************
+  -->
+
+<resources>
+    <color name="red_50">#FFEBEE</color>
+    <color name="red_100">#FFCDD2</color>
+    <color name="red_200">#EF9A9A</color>
+    <color name="red_300">#E57373</color>
+    <color name="red_400">#EF5350</color>
+    <color name="red_500">#F44336</color>
+    <color name="red_600">#E53935</color>
+    <color name="red_700">#D32F2F</color>
+    <color name="red_800">#C62828</color>
+    <color name="red_900">#B71C1C</color>
+    <color name="red_A100">#FF8A80</color>
+    <color name="red_A200">#FF5252</color>
+    <color name="red_A400">#FF1744</color>
+    <color name="red_A700">#D50000</color>
+
+    <color name="deep_purple_50">#EDE7F6</color>
+    <color name="deep_purple_100">#D1C4E9</color>
+    <color name="deep_purple_200">#B39DDB</color>
+    <color name="deep_purple_300">#9575CD</color>
+    <color name="deep_purple_400">#7E57C2</color>
+    <color name="deep_purple_500">#673AB7</color>
+    <color name="deep_purple_600">#5E35B1</color>
+    <color name="deep_purple_700">#512DA8</color>
+    <color name="deep_purple_800">#4527A0</color>
+    <color name="deep_purple_900">#311B92</color>
+    <color name="deep_purple_A100">#B388FF</color>
+    <color name="deep_purple_A200">#7C4DFF</color>
+    <color name="deep_purple_A400">#651FFF</color>
+    <color name="deep_purple_A700">#6200EA</color>
+
+    <color name="light_blue_50">#E1F5FE</color>
+    <color name="light_blue_100">#B3E5FC</color>
+    <color name="light_blue_200">#81D4FA</color>
+    <color name="light_blue_300">#4FC3F7</color>
+    <color name="light_blue_400">#29B6F6</color>
+    <color name="light_blue_500">#03A9F4</color>
+    <color name="light_blue_600">#039BE5</color>
+    <color name="light_blue_700">#0288D1</color>
+    <color name="light_blue_800">#0277BD</color>
+    <color name="light_blue_900">#01579B</color>
+    <color name="light_blue_A100">#80D8FF</color>
+    <color name="light_blue_A200">#40C4FF</color>
+    <color name="light_blue_A400">#00B0FF</color>
+    <color name="light_blue_A700">#0091EA</color>
+
+    <color name="green_50">#E8F5E9</color>
+    <color name="green_100">#C8E6C9</color>
+    <color name="green_200">#A5D6A7</color>
+    <color name="green_300">#81C784</color>
+    <color name="green_400">#66BB6A</color>
+    <color name="green_500">#4CAF50</color>
+    <color name="green_600">#43A047</color>
+    <color name="green_700">#388E3C</color>
+    <color name="green_800">#2E7D32</color>
+    <color name="green_900">#1B5E20</color>
+    <color name="green_A100">#B9F6CA</color>
+    <color name="green_A200">#69F0AE</color>
+    <color name="green_A400">#00E676</color>
+    <color name="green_A700">#00C853</color>
+
+    <color name="yellow_50">#FFFDE7</color>
+    <color name="yellow_100">#FFF9C4</color>
+    <color name="yellow_200">#FFF59D</color>
+    <color name="yellow_300">#FFF176</color>
+    <color name="yellow_400">#FFEE58</color>
+    <color name="yellow_500">#FFEB3B</color>
+    <color name="yellow_600">#FDD835</color>
+    <color name="yellow_700">#FBC02D</color>
+    <color name="yellow_800">#F9A825</color>
+    <color name="yellow_900">#F57F17</color>
+    <color name="yellow_A100">#FFFF8D</color>
+    <color name="yellow_A200">#FFFF00</color>
+    <color name="yellow_A400">#FFEA00</color>
+    <color name="yellow_A700">#FFD600</color>
+
+    <color name="deep_orange_50">#FBE9E7</color>
+    <color name="deep_orange_100">#FFCCBC</color>
+    <color name="deep_orange_200">#FFAB91</color>
+    <color name="deep_orange_300">#FF8A65</color>
+    <color name="deep_orange_400">#FF7043</color>
+    <color name="deep_orange_500">#FF5722</color>
+    <color name="deep_orange_600">#F4511E</color>
+    <color name="deep_orange_700">#E64A19</color>
+    <color name="deep_orange_800">#D84315</color>
+    <color name="deep_orange_900">#BF360C</color>
+    <color name="deep_orange_A100">#FF9E80</color>
+    <color name="deep_orange_A200">#FF6E40</color>
+    <color name="deep_orange_A400">#FF3D00</color>
+    <color name="deep_orange_A700">#DD2C00</color>
+
+    <color name="blue_grey_50">#ECEFF1</color>
+    <color name="blue_grey_100">#CFD8DC</color>
+    <color name="blue_grey_200">#B0BEC5</color>
+    <color name="blue_grey_300">#90A4AE</color>
+    <color name="blue_grey_400">#78909C</color>
+    <color name="blue_grey_500">#607D8B</color>
+    <color name="blue_grey_600">#546E7A</color>
+    <color name="blue_grey_700">#455A64</color>
+    <color name="blue_grey_800">#37474F</color>
+    <color name="blue_grey_900">#263238</color>
+
+    <color name="pink_50">#FCE4EC</color>
+    <color name="pink_100">#F8BBD0</color>
+    <color name="pink_200">#F48FB1</color>
+    <color name="pink_300">#F06292</color>
+    <color name="pink_400">#EC407A</color>
+    <color name="pink_500">#E91E63</color>
+    <color name="pink_600">#D81B60</color>
+    <color name="pink_700">#C2185B</color>
+    <color name="pink_800">#AD1457</color>
+    <color name="pink_900">#880E4F</color>
+    <color name="pink_A100">#FF80AB</color>
+    <color name="pink_A200">#FF4081</color>
+    <color name="pink_A400">#F50057</color>
+    <color name="pink_A700">#C51162</color>
+
+    <color name="indigo_50">#E8EAF6</color>
+    <color name="indigo_100">#C5CAE9</color>
+    <color name="indigo_200">#9FA8DA</color>
+    <color name="indigo_300">#7986CB</color>
+    <color name="indigo_400">#5C6BC0</color>
+    <color name="indigo_500">#3F51B5</color>
+    <color name="indigo_600">#3949AB</color>
+    <color name="indigo_700">#303F9F</color>
+    <color name="indigo_800">#283593</color>
+    <color name="indigo_900">#1A237E</color>
+    <color name="indigo_A100">#8C9EFF</color>
+    <color name="indigo_A200">#536DFE</color>
+    <color name="indigo_A400">#3D5AFE</color>
+    <color name="indigo_A700">#304FFE</color>
+
+    <color name="cyan_50">#E0F7FA</color>
+    <color name="cyan_100">#B2EBF2</color>
+    <color name="cyan_200">#80DEEA</color>
+    <color name="cyan_300">#4DD0E1</color>
+    <color name="cyan_400">#26C6DA</color>
+    <color name="cyan_500">#00BCD4</color>
+    <color name="cyan_600">#00ACC1</color>
+    <color name="cyan_700">#0097A7</color>
+    <color name="cyan_800">#00838F</color>
+    <color name="cyan_900">#006064</color>
+    <color name="cyan_A100">#84FFFF</color>
+    <color name="cyan_A200">#18FFFF</color>
+    <color name="cyan_A400">#00E5FF</color>
+    <color name="cyan_A700">#00B8D4</color>
+
+    <color name="light_green_50">#F1F8E9</color>
+    <color name="light_green_100">#DCEDC8</color>
+    <color name="light_green_200">#C5E1A5</color>
+    <color name="light_green_300">#AED581</color>
+    <color name="light_green_400">#9CCC65</color>
+    <color name="light_green_500">#8BC34A</color>
+    <color name="light_green_600">#7CB342</color>
+    <color name="light_green_700">#689F38</color>
+    <color name="light_green_800">#558B2F</color>
+    <color name="light_green_900">#33691E</color>
+    <color name="light_green_A100">#CCFF90</color>
+    <color name="light_green_A200">#B2FF59</color>
+    <color name="light_green_A400">#76FF03</color>
+    <color name="light_green_A700">#64DD17</color>
+
+    <color name="amber_50">#FFF8E1</color>
+    <color name="amber_100">#FFECB3</color>
+    <color name="amber_200">#FFE082</color>
+    <color name="amber_300">#FFD54F</color>
+    <color name="amber_400">#FFCA28</color>
+    <color name="amber_500">#FFC107</color>
+    <color name="amber_600">#FFB300</color>
+    <color name="amber_700">#FFA000</color>
+    <color name="amber_800">#FF8F00</color>
+    <color name="amber_900">#FF6F00</color>
+    <color name="amber_A100">#FFE57F</color>
+    <color name="amber_A200">#FFD740</color>
+    <color name="amber_A400">#FFC400</color>
+    <color name="amber_A700">#FFAB00</color>
+
+    <color name="brown_50">#EFEBE9</color>
+    <color name="brown_100">#D7CCC8</color>
+    <color name="brown_200">#BCAAA4</color>
+    <color name="brown_300">#A1887F</color>
+    <color name="brown_400">#8D6E63</color>
+    <color name="brown_500">#795548</color>
+    <color name="brown_600">#6D4C41</color>
+    <color name="brown_700">#5D4037</color>
+    <color name="brown_800">#4E342E</color>
+    <color name="brown_900">#3E2723</color>
+
+    <color name="purple_50">#F3E5F5</color>
+    <color name="purple_100">#E1BEE7</color>
+    <color name="purple_200">#CE93D8</color>
+    <color name="purple_300">#BA68C8</color>
+    <color name="purple_400">#AB47BC</color>
+    <color name="purple_500">#9C27B0</color>
+    <color name="purple_600">#8E24AA</color>
+    <color name="purple_700">#7B1FA2</color>
+    <color name="purple_800">#6A1B9A</color>
+    <color name="purple_900">#4A148C</color>
+    <color name="purple_A100">#EA80FC</color>
+    <color name="purple_A200">#E040FB</color>
+    <color name="purple_A400">#D500F9</color>
+    <color name="purple_A700">#AA00FF</color>
+
+    <color name="blue_50">#E3F2FD</color>
+    <color name="blue_100">#BBDEFB</color>
+    <color name="blue_200">#90CAF9</color>
+    <color name="blue_300">#64B5F6</color>
+    <color name="blue_400">#42A5F5</color>
+    <color name="blue_500">#2196F3</color>
+    <color name="blue_600">#1E88E5</color>
+    <color name="blue_700">#1976D2</color>
+    <color name="blue_800">#1565C0</color>
+    <color name="blue_900">#0D47A1</color>
+    <color name="blue_A100">#82B1FF</color>
+    <color name="blue_A200">#448AFF</color>
+    <color name="blue_A400">#2979FF</color>
+    <color name="blue_A700">#2962FF</color>
+
+    <color name="teal_50">#E0F2F1</color>
+    <color name="teal_100">#B2DFDB</color>
+    <color name="teal_200">#80CBC4</color>
+    <color name="teal_300">#4DB6AC</color>
+    <color name="teal_400">#26A69A</color>
+    <color name="teal_500">#009688</color>
+    <color name="teal_600">#00897B</color>
+    <color name="teal_700">#00796B</color>
+    <color name="teal_800">#00695C</color>
+    <color name="teal_900">#004D40</color>
+    <color name="teal_A100">#A7FFEB</color>
+    <color name="teal_A200">#64FFDA</color>
+    <color name="teal_A400">#1DE9B6</color>
+    <color name="teal_A700">#00BFA5</color>
+
+    <color name="lime_50">#F9FBE7</color>
+    <color name="lime_100">#F0F4C3</color>
+    <color name="lime_200">#E6EE9C</color>
+    <color name="lime_300">#DCE775</color>
+    <color name="lime_400">#D4E157</color>
+    <color name="lime_500">#CDDC39</color>
+    <color name="lime_600">#C0CA33</color>
+    <color name="lime_700">#AFB42B</color>
+    <color name="lime_800">#9E9D24</color>
+    <color name="lime_900">#827717</color>
+    <color name="lime_A100">#F4FF81</color>
+    <color name="lime_A200">#EEFF41</color>
+    <color name="lime_A400">#C6FF00</color>
+    <color name="lime_A700">#AEEA00</color>
+
+    <color name="orange_50">#FFF3E0</color>
+    <color name="orange_100">#FFE0B2</color>
+    <color name="orange_200">#FFCC80</color>
+    <color name="orange_300">#FFB74D</color>
+    <color name="orange_400">#FFA726</color>
+    <color name="orange_500">#FF9800</color>
+    <color name="orange_600">#FB8C00</color>
+    <color name="orange_700">#F57C00</color>
+    <color name="orange_800">#EF6C00</color>
+    <color name="orange_900">#E65100</color>
+    <color name="orange_A100">#FFD180</color>
+    <color name="orange_A200">#FFAB40</color>
+    <color name="orange_A400">#FF9100</color>
+    <color name="orange_A700">#FF6D00</color>
+
+    <color name="grey_50">#FAFAFA</color>
+    <color name="grey_100">#F5F5F5</color>
+    <color name="grey_200">#EEEEEE</color>
+    <color name="grey_300">#E0E0E0</color>
+    <color name="grey_400">#BDBDBD</color>
+    <color name="grey_500">#9E9E9E</color>
+    <color name="grey_600">#757575</color>
+    <color name="grey_700">#616161</color>
+    <color name="grey_800">#424242</color>
+    <color name="grey_900">#212121</color>
+
+    <color name="black">#000000</color>
+    <color name="white">#FFFFFF</color>
+</resources>

+ 29 - 0
sybotan-android-base/src/main/res/values/strings.xml

@@ -0,0 +1,29 @@
+<!--
+  ~ *********************************************************************************************************************
+  ~
+  ~               iFHS7.
+  ~              ;BBMBMBMc                  rZMBMBR              BMB
+  ~              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+  ~     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+  ~     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+  ~      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+  ~     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+  ~     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+  ~     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+  ~         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+  ~     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+  ~      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+  ~         i0BM: SWKHKGO  MBDv
+  ~           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+  ~              ,  XMW  ..
+  ~                  r                                                                     All rights reserved.
+  ~
+  ~ *********************************************************************************************************************
+  -->
+
+<resources>
+    <string name="app_name">sybotan-android-core</string>
+    <string name="btn_cancel">取消</string>
+    <string name="btn_close">关闭</string>
+    <string name="btn_ok">确定</string>
+</resources>