Parcourir la source

@fun: add adm-android-base

bai il y a 3 ans
Parent
commit
2879a672c4
29 fichiers modifiés avec 1183 ajouts et 3 suppressions
  1. 1 0
      adm-android-base/.gitignore
  2. 50 0
      adm-android-base/build.gradle.kts
  3. 21 0
      adm-android-base/proguard-rules.pro
  4. 24 0
      adm-android-base/src/androidTest/java/com/ys/bdtp/android/base/ExampleInstrumentedTest.kt
  5. 5 0
      adm-android-base/src/main/AndroidManifest.xml
  6. 41 0
      adm-android-base/src/main/java/com/ys/bdtp/android/base/SApplication.kt
  7. 119 0
      adm-android-base/src/main/java/com/ys/bdtp/android/base/SOptions.kt
  8. 78 0
      adm-android-base/src/main/java/com/ys/bdtp/android/base/activities/SBaseActivity.kt
  9. 98 0
      adm-android-base/src/main/java/com/ys/bdtp/android/base/comparators/SFileComparator.kt
  10. 20 0
      adm-android-base/src/main/java/com/ys/bdtp/android/base/comparators/SSizesByAreaComparator.kt
  11. 25 0
      adm-android-base/src/main/java/com/ys/bdtp/android/base/extensions/SActivityExtension.kt
  12. 19 0
      adm-android-base/src/main/java/com/ys/bdtp/android/base/extensions/SMenuExtension.kt
  13. 64 0
      adm-android-base/src/main/java/com/ys/bdtp/android/base/extensions/SPathExtension.kt
  14. 25 0
      adm-android-base/src/main/java/com/ys/bdtp/android/base/extensions/SRectExtension.kt
  15. 25 0
      adm-android-base/src/main/java/com/ys/bdtp/android/base/extensions/SRectFExtension.kt
  16. 20 0
      adm-android-base/src/main/java/com/ys/bdtp/android/base/extensions/SWebResourceRequestExtension.kt
  17. 34 0
      adm-android-base/src/main/java/com/ys/bdtp/android/base/services/SVibratorService.kt
  18. 33 0
      adm-android-base/src/main/java/com/ys/bdtp/android/base/utils/SKeyboardUtil.kt
  19. 117 0
      adm-android-base/src/main/java/com/ys/bdtp/android/base/utils/SQrCodeUtil.kt
  20. 11 0
      adm-android-base/src/main/res/animator/sybotan_anim.xml
  21. 30 0
      adm-android-base/src/main/res/drawable/sybotan_logo.xml
  22. 17 0
      adm-android-base/src/main/res/drawable/sybotan_logo_anim.xml
  23. 278 0
      adm-android-base/src/main/res/values/material_design_colors.xml
  24. 6 0
      adm-android-base/src/main/res/values/strings.xml
  25. 17 0
      adm-android-base/src/test/java/com/ys/bdtp/android/base/ExampleUnitTest.kt
  26. 0 0
      adm-cad/consumer-rules.pro
  27. 1 0
      adm-graph/build.gradle.kts
  28. 3 3
      adm-graph/src/main/java/com/ys/bdtp/graph/SGraphyScene.kt
  29. 1 0
      settings.gradle.kts

+ 1 - 0
adm-android-base/.gitignore

@@ -0,0 +1 @@
+/build

+ 50 - 0
adm-android-base/build.gradle.kts

@@ -0,0 +1,50 @@
+plugins {
+    id("com.android.library")
+    id("org.jetbrains.kotlin.android")
+}
+
+android {
+    compileSdk = 31
+
+    defaultConfig {
+        minSdk = 28
+        targetSdk = 31
+        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+    }
+
+    buildTypes {
+        release {
+            isMinifyEnabled = false
+            proguardFiles(
+                    getDefaultProguardFile("proguard-android-optimize.txt"),
+                    "proguard-rules.pro"
+            )
+        }
+    }
+
+    compileOptions {
+        sourceCompatibility = JavaVersion.VERSION_1_8
+        targetCompatibility = JavaVersion.VERSION_1_8
+    }
+
+    kotlinOptions {
+        jvmTarget = "1.8"
+    }
+}
+
+dependencies {
+
+    implementation("androidx.core:core-ktx:1.7.0")
+    implementation("androidx.appcompat:appcompat:1.4.0")
+    implementation("com.google.android.material:material:1.4.0")
+    implementation("com.google.zxing:core:3.3.0")
+    implementation("cn.sagacloud:saga-kotlin-base:1.4.105")
+    implementation("com.google.code.gson:gson:2.8.9")
+    implementation("org.greenrobot:eventbus:3.3.1")
+    implementation("pub.devrel:easypermissions:3.0.0")
+    //implementation("org.jetbrains.anko:anko-commons:0.10.8")
+
+    testImplementation("junit:junit:4.13.2")
+    androidTestImplementation("androidx.test.ext:junit:1.1.3")
+    androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0")
+}

+ 21 - 0
adm-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

+ 24 - 0
adm-android-base/src/androidTest/java/com/ys/bdtp/android/base/ExampleInstrumentedTest.kt

@@ -0,0 +1,24 @@
+package com.ys.bdtp.android.base
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.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.getInstrumentation().targetContext
+        assertEquals("com.ys.bdtp.android.base.test", appContext.packageName)
+    }
+}

+ 5 - 0
adm-android-base/src/main/AndroidManifest.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="com.ys.bdtp.android.base">
+
+</manifest>

+ 41 - 0
adm-android-base/src/main/java/com/ys/bdtp/android/base/SApplication.kt

@@ -0,0 +1,41 @@
+package com.ys.bdtp.android.base
+
+import android.app.Application
+import android.app.Service
+import android.os.Vibrator
+import com.ys.bdtp.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

+ 119 - 0
adm-android-base/src/main/java/com/ys/bdtp/android/base/SOptions.kt

@@ -0,0 +1,119 @@
+package com.ys.bdtp.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

+ 78 - 0
adm-android-base/src/main/java/com/ys/bdtp/android/base/activities/SBaseActivity.kt

@@ -0,0 +1,78 @@
+package com.ys.bdtp.android.base.activities
+
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+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.makeText(this, "用户授权失败!", Toast.LENGTH_SHORT).show()
+        //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.makeText(this, "用户授权成功!", Toast.LENGTH_SHORT).show()
+        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()

+ 98 - 0
adm-android-base/src/main/java/com/ys/bdtp/android/base/comparators/SFileComparator.kt

@@ -0,0 +1,98 @@
+package com.ys.bdtp.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

+ 20 - 0
adm-android-base/src/main/java/com/ys/bdtp/android/base/comparators/SSizesByAreaComparator.kt

@@ -0,0 +1,20 @@
+package com.ys.bdtp.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()

+ 25 - 0
adm-android-base/src/main/java/com/ys/bdtp/android/base/extensions/SActivityExtension.kt

@@ -0,0 +1,25 @@
+package com.ys.bdtp.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()

+ 19 - 0
adm-android-base/src/main/java/com/ys/bdtp/android/base/extensions/SMenuExtension.kt

@@ -0,0 +1,19 @@
+package com.ys.bdtp.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()

+ 64 - 0
adm-android-base/src/main/java/com/ys/bdtp/android/base/extensions/SPathExtension.kt

@@ -0,0 +1,64 @@
+package com.ys.bdtp.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()

+ 25 - 0
adm-android-base/src/main/java/com/ys/bdtp/android/base/extensions/SRectExtension.kt

@@ -0,0 +1,25 @@
+package com.ys.bdtp.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()

+ 25 - 0
adm-android-base/src/main/java/com/ys/bdtp/android/base/extensions/SRectFExtension.kt

@@ -0,0 +1,25 @@
+package com.ys.bdtp.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()

+ 20 - 0
adm-android-base/src/main/java/com/ys/bdtp/android/base/extensions/SWebResourceRequestExtension.kt

@@ -0,0 +1,20 @@
+package com.ys.bdtp.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()

+ 34 - 0
adm-android-base/src/main/java/com/ys/bdtp/android/base/services/SVibratorService.kt

@@ -0,0 +1,34 @@
+package com.ys.bdtp.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

+ 33 - 0
adm-android-base/src/main/java/com/ys/bdtp/android/base/utils/SKeyboardUtil.kt

@@ -0,0 +1,33 @@
+package com.ys.bdtp.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

+ 117 - 0
adm-android-base/src/main/java/com/ys/bdtp/android/base/utils/SQrCodeUtil.kt

@@ -0,0 +1,117 @@
+package com.ys.bdtp.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

+ 11 - 0
adm-android-base/src/main/res/animator/sybotan_anim.xml

@@ -0,0 +1,11 @@
+
+<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>

+ 30 - 0
adm-android-base/src/main/res/drawable/sybotan_logo.xml

@@ -0,0 +1,30 @@
+<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>

+ 17 - 0
adm-android-base/src/main/res/drawable/sybotan_logo_anim.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<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>

+ 278 - 0
adm-android-base/src/main/res/values/material_design_colors.xml

@@ -0,0 +1,278 @@
+<?xml version="1.0" encoding="utf-8"?>
+<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>

+ 6 - 0
adm-android-base/src/main/res/values/strings.xml

@@ -0,0 +1,6 @@
+<resources>
+    <string name="app_name">adm-android-base</string>
+    <string name="btn_cancel">取消</string>
+    <string name="btn_close">关闭</string>
+    <string name="btn_ok">确定</string>
+</resources>

+ 17 - 0
adm-android-base/src/test/java/com/ys/bdtp/android/base/ExampleUnitTest.kt

@@ -0,0 +1,17 @@
+package com.ys.bdtp.android.base
+
+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)
+    }
+}

+ 0 - 0
adm-cad/consumer-rules.pro


+ 1 - 0
adm-graph/build.gradle.kts

@@ -34,6 +34,7 @@ android {
 
 dependencies {
 
+    implementation(project(":adm-android-base"))
     implementation("androidx.core:core-ktx:1.7.0")
     implementation("androidx.appcompat:appcompat:1.4.0")
     implementation("com.google.android.material:material:1.4.0")

+ 3 - 3
adm-graph/src/main/java/com/ys/bdtp/graph/SGraphyScene.kt

@@ -3,14 +3,14 @@ package com.ys.bdtp.graph
 import android.graphics.*
 import android.util.Log
 import android.view.MotionEvent
-import com.sybotan.android.base.extensions.adjusted
+import com.sybotan.base.extensions.toJson
+import com.ys.bdtp.android.base.extensions.adjusted
 import com.ys.bdtp.graph.data.SLineF
 import com.ys.bdtp.graph.enums.SGraphyItemFlag
 import com.ys.bdtp.graph.items.SGraphyImageItem
 import com.ys.bdtp.graph.items.SGraphyLineItem
 import com.ys.bdtp.graph.items.SGraphyRectItem
 import com.ys.bdtp.graph.utils.MatrixUtil
-//import com.sybotan.base.extensions.toJson
 
 /**
  * SGraphy图形引擎场景类
@@ -203,7 +203,7 @@ open class SGraphyScene {
      * @return  如果事件被处理返回 true , 否则返回 false 。
      */
     open fun onSingleTapUp(e: SMotionEvent): Boolean {
-        Log.e("手势scene","$e")
+        Log.e("手势scene", e.toJson())
         if (null != grabItem) {     // 如果当前锁定item不为空
             val ie = toGrabItemMotionEvent(grabItem!!, e)
             return grabItem!!.onSingleTapUp(ie)

+ 1 - 0
settings.gradle.kts

@@ -26,3 +26,4 @@ include(":app")
 include(":adm-graph")
 include(":adm-base")
 include(":adm-cad")
+include(":adm-android-base")