Browse Source

@fun: add base framework

bai 3 years ago
parent
commit
0222128449
27 changed files with 387 additions and 5 deletions
  1. 1 0
      .gitignore
  2. 6 0
      app/build.gradle.kts
  3. 13 0
      app/src/main/java/com/ys/bdtp/adm/AdmApplication.kt
  4. 1 1
      app/src/main/java/com/ys/bdtp/adm/MainActivity.kt
  5. 28 0
      app/src/main/java/com/ys/bdtp/adm/app/Constants.kt
  6. 27 0
      app/src/main/java/com/ys/bdtp/adm/app/converter/NullOrEmptyConverter.kt
  7. 41 0
      app/src/main/java/com/ys/bdtp/adm/app/interceptor/GzipRequestInterceptor.kt
  8. 1 1
      app/src/main/java/com/ys/bdtp/adm/ui/theme/Color.kt
  9. 1 1
      app/src/main/java/com/ys/bdtp/adm/ui/theme/Shape.kt
  10. 1 1
      app/src/main/java/com/ys/bdtp/adm/ui/theme/Theme.kt
  11. 1 1
      app/src/main/java/com/ys/bdtp/adm/ui/theme/Type.kt
  12. 97 0
      app/src/main/java/com/ys/bdtp/adm/di/Di.kt
  13. 33 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/Data.kt
  14. 10 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/Model.kt
  15. 30 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/db/AdmDatabase.kt
  16. 24 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/db/dao/UserDao.kt
  17. 11 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/db/entity/UserEntity.kt
  18. 3 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/nt/Api.kt
  19. 14 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/ui/flash/FlashScreen.kt
  20. 9 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/ui/login/LoginScrren.kt
  21. 8 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/ui/main/MainScreen.kt
  22. 3 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/vm/flash/FlashRepository.kt
  23. 6 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/vm/flash/FlashViewModel.kt
  24. 3 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/vm/login/LoginRepository.kt
  25. 6 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/vm/login/LoginViewModel.kt
  26. 3 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/vm/main/MainRepository.kt
  27. 6 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/vm/main/MainViewModel.kt

+ 1 - 0
.gitignore

@@ -6,5 +6,6 @@
 /.idea
 /captures
 /build
+/schemas
 local.properties
 /local.properties

+ 6 - 0
app/build.gradle.kts

@@ -36,6 +36,12 @@ android {
 
     kotlinOptions {
         jvmTarget = "1.8"
+        // 将数据库
+        kapt {
+            arguments {
+                arg("room.schemaLocation", "$rootDir/schemas")
+            }
+        }
     }
 
     buildFeatures {

+ 13 - 0
app/src/main/java/com/ys/bdtp/adm/AdmApplication.kt

@@ -0,0 +1,13 @@
+package com.ys.bdtp.adm
+
+import android.app.Application
+import org.kodein.di.DI
+import org.kodein.di.DIAware
+
+class AdmApplication : Application(), DIAware {
+    override val di: DI by DI.lazy {
+
+    }
+
+
+}

+ 1 - 1
app/src/main/java/com/ys/bdtp/adm/MainActivity.kt

@@ -8,7 +8,7 @@ import androidx.compose.material.Surface
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.tooling.preview.Preview
-import com.ys.bdtp.adm.ui.theme.AdmTheme
+import com.ys.bdtp.adm.app.theme.AdmTheme
 
 class MainActivity : ComponentActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {

+ 28 - 0
app/src/main/java/com/ys/bdtp/adm/app/Constants.kt

@@ -0,0 +1,28 @@
+package com.ys.bdtp.adm.app
+
+/**
+ * 测试服务器 IP
+ */
+const val testIP = "http://192.168.0.48:8876/"
+
+const val test2IP = "http://192.168.0.11:8876/"
+
+const val tencentIP = "http://82.157.28.170:8876/"
+
+const val JdIP = "http://82.157.151.123/adm-poc-backend/"
+
+const val IP = JdIP
+
+const val devFileServiceUrl = "http://develop.persagy.com/image-service/"
+
+const val fileServiceUrl = devFileServiceUrl
+
+const val pathDownloadMap = "adm/downloadMap?key="
+
+const val DEVICE_ID = "device_id"
+
+const val BDTP_TS = "bdtp_ts"
+
+const val ADM_TS = "adm_ts"
+
+const val CLIENT_ID = "client_id"

+ 27 - 0
app/src/main/java/com/ys/bdtp/adm/app/converter/NullOrEmptyConverter.kt

@@ -0,0 +1,27 @@
+package com.ys.bdtp.adm.app.converter
+
+import okhttp3.ResponseBody
+import retrofit2.Converter
+import retrofit2.Retrofit
+import java.lang.reflect.Type
+
+/**
+ * 空字符串转换器
+ */
+class NullOrEmptyConverter : Converter.Factory() {
+    override fun responseBodyConverter(
+        type: Type,
+        annotations: Array<out Annotation>,
+        retrofit: Retrofit
+    ): Converter<ResponseBody, *> {
+        val delegate: Converter<ResponseBody, Any> =
+            retrofit.nextResponseBodyConverter(this, type, annotations)
+        return Converter<ResponseBody, Any?> { value ->
+            val length = value.contentLength().toInt()
+            if (length == 0) {
+                return@Converter ""
+            }
+            delegate.convert(value)
+        }
+    }
+}

+ 41 - 0
app/src/main/java/com/ys/bdtp/adm/app/interceptor/GzipRequestInterceptor.kt

@@ -0,0 +1,41 @@
+package com.ys.bdtp.adm.app.interceptor
+
+import okhttp3.*
+import okio.*
+
+/**
+ * Gzip 压缩
+ */
+class GzipRequestInterceptor : Interceptor {
+    override fun intercept(chain: Interceptor.Chain): Response {
+        val originalRequest: Request = chain.request()
+        if (originalRequest.body == null || originalRequest.header("Content-Encoding") != "gzip") {
+            return chain.proceed(originalRequest)
+        }
+
+        val compressedRequest: Request = originalRequest.newBuilder()
+            .header("Content-Encoding", "gzip")
+            .method(originalRequest.method, gzip(originalRequest.body!!))
+            .build()
+        return chain.proceed(compressedRequest)
+    }
+
+    private fun gzip(body: RequestBody): RequestBody {
+        return object : RequestBody() {
+            override fun contentType(): MediaType? {
+                return body.contentType()
+            }
+
+            @Throws(IOException::class)
+            override fun writeTo(sink: BufferedSink) {
+                val gzipSink: BufferedSink = GzipSink(sink).buffer()
+                body.writeTo(gzipSink)
+                gzipSink.close()
+            }
+
+            override fun contentLength(): Long {
+                return -1
+            }
+        }
+    }
+}

+ 1 - 1
app/src/main/java/com/ys/bdtp/adm/ui/theme/Color.kt

@@ -1,4 +1,4 @@
-package com.ys.bdtp.adm.ui.theme
+package com.ys.bdtp.adm.app.theme
 
 import androidx.compose.ui.graphics.Color
 

+ 1 - 1
app/src/main/java/com/ys/bdtp/adm/ui/theme/Shape.kt

@@ -1,4 +1,4 @@
-package com.ys.bdtp.adm.ui.theme
+package com.ys.bdtp.adm.app.theme
 
 import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.material.Shapes

+ 1 - 1
app/src/main/java/com/ys/bdtp/adm/ui/theme/Theme.kt

@@ -1,4 +1,4 @@
-package com.ys.bdtp.adm.ui.theme
+package com.ys.bdtp.adm.app.theme
 
 import androidx.compose.foundation.isSystemInDarkTheme
 import androidx.compose.material.MaterialTheme

+ 1 - 1
app/src/main/java/com/ys/bdtp/adm/ui/theme/Type.kt

@@ -1,4 +1,4 @@
-package com.ys.bdtp.adm.ui.theme
+package com.ys.bdtp.adm.app.theme
 
 import androidx.compose.material.Typography
 import androidx.compose.ui.text.TextStyle

+ 97 - 0
app/src/main/java/com/ys/bdtp/adm/di/Di.kt

@@ -0,0 +1,97 @@
+package com.ys.bdtp.adm.di
+
+import android.util.Log
+import com.ys.bdtp.adm.app.IP
+import com.ys.bdtp.adm.app.converter.NullOrEmptyConverter
+import com.ys.bdtp.adm.app.interceptor.GzipRequestInterceptor
+import com.ys.bdtp.adm.mvvm.model.db.AdmDatabase
+import com.ys.bdtp.adm.mvvm.model.nt.Api
+import com.ys.bdtp.adm.mvvm.vm.flash.FlashViewModel
+import com.ys.bdtp.adm.mvvm.vm.login.LoginViewModel
+import com.ys.bdtp.adm.mvvm.vm.main.MainViewModel
+import okhttp3.OkHttpClient
+import okhttp3.logging.HttpLoggingInterceptor
+import org.kodein.di.DI
+import org.kodein.di.bind
+import org.kodein.di.bindProvider
+import org.kodein.di.bindSingleton
+import org.kodein.di.instance
+import org.kodein.di.provider
+import org.kodein.di.singleton
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+import java.io.UnsupportedEncodingException
+import java.util.concurrent.TimeUnit
+
+val httpModule = DI.Module("httpModule") {
+    // 构建 Retrofit 对象
+
+    bind {
+        singleton {
+            Retrofit.Builder()
+                .baseUrl(IP)
+                .client(instance())
+                .addConverterFactory(NullOrEmptyConverter())
+                .addConverterFactory(GsonConverterFactory.create())
+                .build()
+        }
+    }
+
+    // 构建 OkHttpClient 对象
+    bind {
+        singleton {
+            OkHttpClient.Builder()
+                .connectTimeout(100, TimeUnit.SECONDS)
+                .readTimeout(3000, TimeUnit.SECONDS)
+                .writeTimeout(3000, TimeUnit.SECONDS)
+                .addInterceptor(instance<HttpLoggingInterceptor>())
+                .addInterceptor(instance<GzipRequestInterceptor>())
+                .build()
+        }
+    }
+
+    // 构建 HttpLoggingInterceptor 对象
+    bind {
+        singleton {
+            HttpLoggingInterceptor { message ->
+                try {
+                    Log.d("OKHttp-----", message)
+                } catch (e: UnsupportedEncodingException) {
+                    e.printStackTrace()
+                    Log.d("OKHttp-----", message)
+                }
+            }.setLevel(HttpLoggingInterceptor.Level.BODY)
+        }
+    }
+
+    bind {
+        singleton {
+            GzipRequestInterceptor()
+        }
+    }
+
+    // Api 对象
+    bind {
+        singleton { instance<Retrofit>().create(Api::class.java) }
+    }
+}
+
+val repositoryModule = DI.Module("repository") {
+    //bindSingleton { AdmRepository(instance(), instance(), instance()) }
+}
+
+val viewModelModule = DI.Module("viewModel") {
+    bind { provider { FlashViewModel() } }
+    bind { provider { LoginViewModel() } }
+    bind { provider { MainViewModel() } }
+
+}
+
+
+val dbModule = DI.Module("dbModule") {
+    bind {
+        singleton {
+            AdmDatabase(instance())
+        }
+    }
+}

+ 33 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/model/Data.kt

@@ -0,0 +1,33 @@
+package com.ys.bdtp.adm.mvvm.model
+
+/**
+ * ③ UI 数据类
+ *
+ * @param state : 数据状态
+ * @param  data : 真实数据
+ * @param   msg : 提示信息
+ */
+data class Data<out T>(val state: State, val data: T? = null, val msg: String = "") {
+    companion object {
+        fun <T> success(data: T?): Data<T> {
+            return Data(State.Success, data, "")
+        }
+
+        fun <T> failure(msg: String): Data<T> {
+            return Data(State.Failure, null, msg)
+        }
+
+        fun <T> loading(): Data<T> {
+            return Data(State.Loading, null, "")
+        }
+    }
+}
+
+/**
+ * 数据状态
+ */
+sealed interface State {
+    object Success : State
+    object Loading : State
+    object Failure : State
+}

+ 10 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/model/Model.kt

@@ -0,0 +1,10 @@
+package com.ys.bdtp.adm.mvvm.model
+
+/**
+ * Api 请求数据容器
+ */
+data class Model<T>(
+    val code: String,
+    val msg: String? = null,
+    val data: T
+)

+ 30 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/model/db/AdmDatabase.kt

@@ -0,0 +1,30 @@
+package com.ys.bdtp.adm.mvvm.model.db
+
+import android.content.Context
+import androidx.room.Database
+import androidx.room.Entity
+import androidx.room.RenameTable
+import androidx.room.Room
+import androidx.room.RoomDatabase
+import com.ys.bdtp.adm.mvvm.model.db.dao.UserDao
+import com.ys.bdtp.adm.mvvm.model.db.entity.UserEntity
+
+@Database(entities = [UserEntity::class], version = 1, exportSchema = true)
+abstract class AdmDatabase : RoomDatabase() {
+    abstract fun userDao(): UserDao
+
+    companion object {
+        @Volatile
+        private var instance: AdmDatabase? = null
+
+        operator fun invoke(context: Context): AdmDatabase {
+            return instance ?: synchronized(this) {
+                instance ?: Room.databaseBuilder(
+                    context,
+                    AdmDatabase::class.java,
+                    "adm_db"
+                ).build().also { instance = it }
+            }
+        }
+    }
+}

+ 24 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/model/db/dao/UserDao.kt

@@ -0,0 +1,24 @@
+package com.ys.bdtp.adm.mvvm.model.db.dao
+
+import androidx.room.Dao
+import androidx.room.Delete
+import androidx.room.Insert
+import androidx.room.OnConflictStrategy
+import androidx.room.Query
+import androidx.room.Update
+import com.ys.bdtp.adm.mvvm.model.db.entity.UserEntity
+
+@Dao
+interface UserDao {
+    @Insert(onConflict = OnConflictStrategy.REPLACE)
+    fun insertUser(vararg user: UserEntity)
+
+    @Query("select * from user")
+    fun queryUsers(): List<UserEntity>
+
+    @Update
+    fun updateUser(user: UserEntity)
+
+    @Delete
+    fun deleteUser(user: UserEntity)
+}

+ 11 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/model/db/entity/UserEntity.kt

@@ -0,0 +1,11 @@
+package com.ys.bdtp.adm.mvvm.model.db.entity
+
+import androidx.room.ColumnInfo
+import androidx.room.Entity
+import androidx.room.PrimaryKey
+
+@Entity(tableName = "user")
+data class UserEntity(
+    @PrimaryKey val id: String,
+    @ColumnInfo(name = "name") val name: String
+)

+ 3 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/model/nt/Api.kt

@@ -0,0 +1,3 @@
+package com.ys.bdtp.adm.mvvm.model.nt
+
+interface Api

+ 14 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/flash/FlashScreen.kt

@@ -0,0 +1,14 @@
+package com.ys.bdtp.adm.mvvm.ui.flash
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+
+@Composable
+fun FlashScreen() {
+    Box(modifier = Modifier.fillMaxSize()) {
+        Text("Flash")
+    }
+}

+ 9 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/login/LoginScrren.kt

@@ -0,0 +1,9 @@
+package com.ys.bdtp.adm.mvvm.ui.login
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ComposeCompilerApi
+
+@Composable
+fun LoginScreen() {
+
+}

+ 8 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/main/MainScreen.kt

@@ -0,0 +1,8 @@
+package com.ys.bdtp.adm.mvvm.ui.main
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun MainScreen() {
+
+}

+ 3 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/vm/flash/FlashRepository.kt

@@ -0,0 +1,3 @@
+package com.ys.bdtp.adm.mvvm.vm.flash
+
+class FlashRepository

+ 6 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/vm/flash/FlashViewModel.kt

@@ -0,0 +1,6 @@
+package com.ys.bdtp.adm.mvvm.vm.flash
+
+import androidx.lifecycle.ViewModel
+
+class FlashViewModel:ViewModel() {
+}

+ 3 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/vm/login/LoginRepository.kt

@@ -0,0 +1,3 @@
+package com.ys.bdtp.adm.mvvm.vm.login
+
+class LoginRepository

+ 6 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/vm/login/LoginViewModel.kt

@@ -0,0 +1,6 @@
+package com.ys.bdtp.adm.mvvm.vm.login
+
+import androidx.lifecycle.ViewModel
+
+class LoginViewModel : ViewModel() {
+}

+ 3 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/vm/main/MainRepository.kt

@@ -0,0 +1,3 @@
+package com.ys.bdtp.adm.mvvm.vm.main
+
+class MainRepository

+ 6 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/vm/main/MainViewModel.kt

@@ -0,0 +1,6 @@
+package com.ys.bdtp.adm.mvvm.vm.main
+
+import androidx.lifecycle.ViewModel
+
+class MainViewModel : ViewModel() {
+}