Browse Source

sample: simplify debug

drake 1 year ago
parent
commit
b002bacad5
100 changed files with 81 additions and 2579 deletions
  1. 2 20
      sample/build.gradle
  2. BIN
      sample/src/main/assets/upload_file.jpg
  3. 2 84
      sample/src/main/java/com/drake/net/sample/base/App.kt
  4. 0 12
      sample/src/main/java/com/drake/net/sample/constants/Api.kt
  5. 0 12
      sample/src/main/java/com/drake/net/sample/constants/UserConfig.kt
  6. 0 23
      sample/src/main/java/com/drake/net/sample/contract/AlbumSelectContract.kt
  7. 0 18
      sample/src/main/java/com/drake/net/sample/converter/FastJsonConverter.kt
  8. 0 21
      sample/src/main/java/com/drake/net/sample/converter/GsonConverter.kt
  9. 0 23
      sample/src/main/java/com/drake/net/sample/converter/MoshiConverter.kt
  10. 0 34
      sample/src/main/java/com/drake/net/sample/converter/ProtobufConverter.kt
  11. 0 66
      sample/src/main/java/com/drake/net/sample/converter/SerializationConverter.kt
  12. 0 50
      sample/src/main/java/com/drake/net/sample/interceptor/EncryptDataInterceptor.kt
  13. 0 16
      sample/src/main/java/com/drake/net/sample/interceptor/GlobalHeaderInterceptor.kt
  14. 0 35
      sample/src/main/java/com/drake/net/sample/interceptor/RefreshTokenInterceptor.kt
  15. 0 55
      sample/src/main/java/com/drake/net/sample/mock/MockDispatcher.kt
  16. 0 6
      sample/src/main/java/com/drake/net/sample/model/ArrayData.kt
  17. 0 7
      sample/src/main/java/com/drake/net/sample/model/BasicData.kt
  18. 0 21
      sample/src/main/java/com/drake/net/sample/model/GameModel.kt
  19. 0 6
      sample/src/main/java/com/drake/net/sample/model/SubData.kt
  20. 44 29
      sample/src/main/java/com/drake/net/sample/ui/activity/MainActivity.kt
  21. 0 34
      sample/src/main/java/com/drake/net/sample/ui/fragment/AsyncTaskFragment.kt
  22. 0 32
      sample/src/main/java/com/drake/net/sample/ui/fragment/AutoDialogFragment.kt
  23. 0 36
      sample/src/main/java/com/drake/net/sample/ui/fragment/CallbackRequestFragment.kt
  24. 0 46
      sample/src/main/java/com/drake/net/sample/ui/fragment/CoroutineScopeFragment.kt
  25. 0 68
      sample/src/main/java/com/drake/net/sample/ui/fragment/DownloadFileFragment.kt
  26. 0 36
      sample/src/main/java/com/drake/net/sample/ui/fragment/EditDebounceFragment.kt
  27. 0 26
      sample/src/main/java/com/drake/net/sample/ui/fragment/ErrorHandlerFragment.kt
  28. 0 24
      sample/src/main/java/com/drake/net/sample/ui/fragment/ExceptionTraceFragment.kt
  29. 0 56
      sample/src/main/java/com/drake/net/sample/ui/fragment/FastestFragment.kt
  30. 0 55
      sample/src/main/java/com/drake/net/sample/ui/fragment/HttpsCertificateFragment.kt
  31. 0 25
      sample/src/main/java/com/drake/net/sample/ui/fragment/InterceptorFragment.kt
  32. 0 38
      sample/src/main/java/com/drake/net/sample/ui/fragment/LimitedTimeFragment.kt
  33. 0 34
      sample/src/main/java/com/drake/net/sample/ui/fragment/ParallelNetworkFragment.kt
  34. 0 38
      sample/src/main/java/com/drake/net/sample/ui/fragment/PreviewCacheFragment.kt
  35. 0 35
      sample/src/main/java/com/drake/net/sample/ui/fragment/PullRefreshFragment.kt
  36. 0 33
      sample/src/main/java/com/drake/net/sample/ui/fragment/PushRefreshFragment.kt
  37. 0 32
      sample/src/main/java/com/drake/net/sample/ui/fragment/ReadCacheFragment.kt
  38. 0 121
      sample/src/main/java/com/drake/net/sample/ui/fragment/RequestMethodFragment.kt
  39. 0 25
      sample/src/main/java/com/drake/net/sample/ui/fragment/StateLayoutFragment.kt
  40. 0 51
      sample/src/main/java/com/drake/net/sample/ui/fragment/SuperIntervalFragment.kt
  41. 0 34
      sample/src/main/java/com/drake/net/sample/ui/fragment/SwitchDispatcherFragment.kt
  42. 0 31
      sample/src/main/java/com/drake/net/sample/ui/fragment/SyncRequestFragment.kt
  43. 0 67
      sample/src/main/java/com/drake/net/sample/ui/fragment/TimingRequestFragment.kt
  44. 0 32
      sample/src/main/java/com/drake/net/sample/ui/fragment/UniqueRequestFragment.kt
  45. 0 82
      sample/src/main/java/com/drake/net/sample/ui/fragment/UploadFileFragment.kt
  46. 0 26
      sample/src/main/java/com/drake/net/sample/ui/fragment/ViewModelRequestFragment.kt
  47. 0 31
      sample/src/main/java/com/drake/net/sample/ui/fragment/converter/BaseConvertFragment.kt
  48. 0 31
      sample/src/main/java/com/drake/net/sample/ui/fragment/converter/FastJsonConvertFragment.kt
  49. 0 33
      sample/src/main/java/com/drake/net/sample/ui/fragment/converter/GsonConvertFragment.kt
  50. 0 33
      sample/src/main/java/com/drake/net/sample/ui/fragment/converter/MoshiConvertFragment.kt
  51. 0 37
      sample/src/main/java/com/drake/net/sample/ui/fragment/converter/SerializationConvertFragment.kt
  52. 0 34
      sample/src/main/java/com/drake/net/sample/utils/AESUtils.kt
  53. 0 33
      sample/src/main/java/com/drake/net/sample/vm/UserViewModel.kt
  54. 0 9
      sample/src/main/res/drawable/bg_card.xml
  55. BIN
      sample/src/main/res/drawable/bg_empty.webp
  56. BIN
      sample/src/main/res/drawable/bg_error.webp
  57. 0 6
      sample/src/main/res/drawable/bg_input.xml
  58. 0 9
      sample/src/main/res/drawable/ic_async_task.xml
  59. 0 10
      sample/src/main/res/drawable/ic_callback_request.xml
  60. 0 9
      sample/src/main/res/drawable/ic_config_dialog.xml
  61. 0 9
      sample/src/main/res/drawable/ic_convert.xml
  62. 0 11
      sample/src/main/res/drawable/ic_debounce.xml
  63. 0 9
      sample/src/main/res/drawable/ic_download_file.xml
  64. 0 9
      sample/src/main/res/drawable/ic_error_handler.xml
  65. 0 9
      sample/src/main/res/drawable/ic_exception_trace.xml
  66. 0 10
      sample/src/main/res/drawable/ic_fastest.xml
  67. 0 10
      sample/src/main/res/drawable/ic_https.xml
  68. 0 9
      sample/src/main/res/drawable/ic_interceptor.xml
  69. 0 9
      sample/src/main/res/drawable/ic_interval.xml
  70. 0 9
      sample/src/main/res/drawable/ic_menu.xml
  71. 0 9
      sample/src/main/res/drawable/ic_parallel_network.xml
  72. 0 12
      sample/src/main/res/drawable/ic_preview_cache.xml
  73. 0 9
      sample/src/main/res/drawable/ic_pull_refresh.xml
  74. 0 9
      sample/src/main/res/drawable/ic_push_refresh.xml
  75. 0 9
      sample/src/main/res/drawable/ic_read_cache.xml
  76. 0 9
      sample/src/main/res/drawable/ic_request_method.xml
  77. 0 9
      sample/src/main/res/drawable/ic_scope.xml
  78. 0 9
      sample/src/main/res/drawable/ic_state_layout.xml
  79. 0 9
      sample/src/main/res/drawable/ic_switch_dispatcher.xml
  80. 0 10
      sample/src/main/res/drawable/ic_sync_request.xml
  81. 0 10
      sample/src/main/res/drawable/ic_unique.xml
  82. 0 9
      sample/src/main/res/drawable/ic_upload_file.xml
  83. 0 10
      sample/src/main/res/drawable/ic_view_model.xml
  84. 33 38
      sample/src/main/res/layout/activity_main.xml
  85. 0 21
      sample/src/main/res/layout/fragment_async_task.xml
  86. 0 22
      sample/src/main/res/layout/fragment_auto_dialog.xml
  87. 0 20
      sample/src/main/res/layout/fragment_callback_request.xml
  88. 0 21
      sample/src/main/res/layout/fragment_coroutine_scope.xml
  89. 0 31
      sample/src/main/res/layout/fragment_custom_convert.xml
  90. 0 41
      sample/src/main/res/layout/fragment_download_file.xml
  91. 0 29
      sample/src/main/res/layout/fragment_edit_debounce.xml
  92. 0 21
      sample/src/main/res/layout/fragment_error_handler.xml
  93. 0 21
      sample/src/main/res/layout/fragment_exception_trace.xml
  94. 0 21
      sample/src/main/res/layout/fragment_fastest.xml
  95. 0 37
      sample/src/main/res/layout/fragment_https_certificate.xml
  96. 0 21
      sample/src/main/res/layout/fragment_interceptor.xml
  97. 0 27
      sample/src/main/res/layout/fragment_limited_time.xml
  98. 0 21
      sample/src/main/res/layout/fragment_parallel_network.xml
  99. 0 19
      sample/src/main/res/layout/fragment_pull_refresh.xml
  100. 0 21
      sample/src/main/res/layout/fragment_push_refresh.xml

+ 2 - 20
sample/build.gradle

@@ -62,32 +62,14 @@ dependencies {
     implementation 'androidx.legacy:legacy-support-v4:1.0.0'
     implementation "androidx.recyclerview:recyclerview:1.2.0"
     implementation "com.google.android.material:material:1.3.0"
-    implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5'
-    implementation 'androidx.navigation:navigation-ui-ktx:2.3.5'
 
-    // ------------------------------网络请求-------------------------------------
     implementation project(path: ":net")
     implementation "com.squareup.okhttp3:okhttp:$okhttp_version"
-    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutine_version" // 协程基础库
-    implementation "com.github.bumptech.glide:glide:4.11.0"
+    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutine_version"
     implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutine_version"
-    implementation "com.github.liangjingkanji:BRV:$brv_version" // 提供自动分页/缺省页/自动下拉刷新功能
-    implementation "com.github.chuckerteam.chucker:library:3.5.2" // 通知栏监听网络日志
+    implementation "com.github.chuckerteam.chucker:library:3.5.2"
 
 
-    // ------------------------------JSON解析-------------------------------------
-    implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2" // JSON序列化库, 首选推荐使用
-    implementation "org.jetbrains.kotlinx:kotlinx-serialization-protobuf:1.2.0"  // protobuf序列化
-    implementation "com.squareup.moshi:moshi-kotlin:1.14.0" // JSON序列化库, 强校验, JSON字段缺失会导致解析异常, 故不推荐
-    implementation "org.jetbrains.kotlin:kotlin-reflect:1.7.10"
-    implementation 'com.google.code.gson:gson:2.8.6' // JSON序列化库, 会导致kotlin默认值无效, 故不推荐
-    implementation 'com.alibaba:fastjson:1.2.73' // JSON序列化库, 会导致kotlin默认值无效(除非引入kt-reflect), 不推荐
-
-    // ------------------------------其他库-------------------------------------
-    implementation 'com.github.liangjingkanji:StatusBar:2.0.2' // 透明状态栏
-    implementation 'com.github.liangjingkanji:debugkit:1.3.0' // 开发调试窗口工具
-    implementation "com.github.liangjingkanji:Tooltip:1.2.2" // 吐司工具
     implementation 'com.github.liangjingkanji:Engine:0.0.74'
-    implementation "com.squareup.okhttp3:mockwebserver:4.10.0"
     debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12'
 }

BIN
sample/src/main/assets/upload_file.jpg


+ 2 - 84
sample/src/main/java/com/drake/net/sample/base/App.kt

@@ -3,104 +3,22 @@ package com.drake.net.sample.base
 import android.app.Application
 import com.chuckerteam.chucker.api.ChuckerCollector
 import com.chuckerteam.chucker.api.ChuckerInterceptor
-import com.drake.brv.utils.BRV
 import com.drake.net.NetConfig
-import com.drake.net.cookie.PersistentCookieJar
-import com.drake.net.interceptor.LogRecordInterceptor
-import com.drake.net.okhttp.setConverter
-import com.drake.net.okhttp.setDebug
-import com.drake.net.okhttp.setDialogFactory
-import com.drake.net.okhttp.setRequestInterceptor
-import com.drake.net.sample.BR
 import com.drake.net.sample.BuildConfig
-import com.drake.net.sample.R
-import com.drake.net.sample.constants.Api
-import com.drake.net.sample.converter.SerializationConverter
-import com.drake.net.sample.interceptor.GlobalHeaderInterceptor
-import com.drake.net.sample.mock.MockDispatcher
-import com.drake.statelayout.StateConfig
-import com.drake.tooltip.dialog.BubbleDialog
-import com.scwang.smart.refresh.footer.ClassicsFooter
-import com.scwang.smart.refresh.header.MaterialHeader
-import com.scwang.smart.refresh.layout.SmartRefreshLayout
-import okhttp3.Cache
-import java.util.concurrent.TimeUnit
 
 class App : Application() {
 
     override fun onCreate() {
         super.onCreate()
 
-        NetConfig.initialize(Api.HOST, this) {
+        NetConfig.initialize("", this) {
 
-            // 超时设置
-            connectTimeout(30, TimeUnit.SECONDS)
-            readTimeout(30, TimeUnit.SECONDS)
-            writeTimeout(30, TimeUnit.SECONDS)
-
-            // 本框架支持Http缓存协议和强制缓存模式
-            cache(Cache(cacheDir, 1024 * 1024 * 128)) // 缓存设置, 当超过maxSize最大值会根据最近最少使用算法清除缓存来限制缓存大小
-
-            // LogCat是否输出异常日志, 异常日志可以快速定位网络请求错误
-            setDebug(BuildConfig.DEBUG)
-
-            // AndroidStudio OkHttp Profiler 插件输出网络日志
-            addInterceptor(LogRecordInterceptor(BuildConfig.DEBUG))
-
-            // 添加持久化Cookie管理
-            cookieJar(PersistentCookieJar(this@App))
-
-            // 通知栏监听网络日志
             if (BuildConfig.DEBUG) {
                 addInterceptor(
-                    ChuckerInterceptor.Builder(this@App)
-                        .collector(ChuckerCollector(this@App))
-                        .maxContentLength(250000L)
-                        .redactHeaders(emptySet())
-                        .alwaysReadResponseBody(false)
-                        .build()
+                    ChuckerInterceptor.Builder(this@App).collector(ChuckerCollector(this@App)).maxContentLength(250000L).redactHeaders(emptySet()).alwaysReadResponseBody(false).build()
                 )
             }
-
-            // 添加请求拦截器, 可配置全局/动态参数
-            setRequestInterceptor(GlobalHeaderInterceptor())
-
-            // 数据转换器
-            setConverter(SerializationConverter())
-
-            // 自定义全局加载对话框
-            setDialogFactory {
-                BubbleDialog(it, "加载中....")
-            }
         }
-
-        MockDispatcher.initialize()
-
-        initializeThirdPart()
-    }
-
-    /** 初始化第三方依赖库库 */
-    private fun initializeThirdPart() {
-
-        // 全局缺省页配置 [https://github.com/liangjingkanji/StateLayout]
-        StateConfig.apply {
-            emptyLayout = R.layout.layout_empty
-            loadingLayout = R.layout.layout_loading
-            errorLayout = R.layout.layout_error
-            setRetryIds(R.id.iv)
-        }
-
-
-        // 初始化SmartRefreshLayout, 这是自动下拉刷新和上拉加载采用的第三方库  [https://github.com/scwang90/SmartRefreshLayout/tree/master] V2版本
-        SmartRefreshLayout.setDefaultRefreshHeaderCreator { context, _ ->
-            MaterialHeader(context)
-        }
-
-        SmartRefreshLayout.setDefaultRefreshFooterCreator { context, _ ->
-            ClassicsFooter(context)
-        }
-
-        BRV.modelId = BR.m
     }
 }
 

+ 0 - 12
sample/src/main/java/com/drake/net/sample/constants/Api.kt

@@ -1,12 +0,0 @@
-package com.drake.net.sample.constants
-
-object Api {
-    const val HOST = "http://127.0.0.1:8091"
-
-    const val TEST = "/test"
-    const val DELAY = "/delay"
-    const val UPLOAD = "/upload"
-    const val GAME = "/game"
-    const val DATA = "/data"
-    const val ARRAY = "/array"
-}

+ 0 - 12
sample/src/main/java/com/drake/net/sample/constants/UserConfig.kt

@@ -1,12 +0,0 @@
-package com.drake.net.sample.constants
-
-
-/**
- * 建议使用 https://github.com/liangjingkanji/Serialize 为字段提供持久化存储
- */
-object UserConfig {
-
-    var token = "6cad0ff06f5a214b9cfdf2a4a7c432339"
-
-    var isLogin = true
-}

+ 0 - 23
sample/src/main/java/com/drake/net/sample/contract/AlbumSelectContract.kt

@@ -1,23 +0,0 @@
-package com.drake.net.sample.contract
-
-import android.content.Context
-import android.content.Intent
-import android.net.Uri
-import android.provider.MediaStore
-import androidx.activity.result.contract.ActivityResultContract
-
-class AlbumSelectContract : ActivityResultContract<Unit, AlbumSelectContract.AlbumSelectResult>() {
-
-    override fun createIntent(context: Context, input: Unit): Intent {
-        val intent = Intent(Intent.ACTION_PICK)
-        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*")
-        return intent
-    }
-
-    class AlbumSelectResult(val code: Int, val uri: Uri?)
-
-    override fun parseResult(resultCode: Int, intent: Intent?): AlbumSelectResult {
-        println("AlbumSelectContract >>> selected = ${intent?.data}")
-        return AlbumSelectResult(resultCode, intent?.data)
-    }
-}

+ 0 - 18
sample/src/main/java/com/drake/net/sample/converter/FastJsonConverter.kt

@@ -1,18 +0,0 @@
-package com.drake.net.sample.converter
-
-import com.alibaba.fastjson.JSON
-import com.drake.net.convert.JSONConvert
-import org.json.JSONObject
-import java.lang.reflect.Type
-
-class FastJsonConverter : JSONConvert(code = "errorCode", message = "errorMsg", success = "0") {
-
-    override fun <R> String.parseBody(succeed: Type): R? {
-        val string = try {
-            JSONObject(this).getString("data")
-        } catch (e: Exception) {
-            this
-        }
-        return JSON.parseObject(string, succeed)
-    }
-}

+ 0 - 21
sample/src/main/java/com/drake/net/sample/converter/GsonConverter.kt

@@ -1,21 +0,0 @@
-package com.drake.net.sample.converter
-
-import com.drake.net.convert.JSONConvert
-import com.google.gson.GsonBuilder
-import org.json.JSONObject
-import java.lang.reflect.Type
-
-class GsonConverter : JSONConvert(code = "errorCode", message = "errorMsg") {
-    companion object {
-        private val gson = GsonBuilder().serializeNulls().create()
-    }
-
-    override fun <R> String.parseBody(succeed: Type): R? {
-        val string = try {
-            JSONObject(this).getString("data")
-        } catch (e: Exception) {
-            this
-        }
-        return gson.fromJson<R>(string, succeed)
-    }
-}

+ 0 - 23
sample/src/main/java/com/drake/net/sample/converter/MoshiConverter.kt

@@ -1,23 +0,0 @@
-package com.drake.net.sample.converter
-
-import com.drake.net.convert.JSONConvert
-import com.squareup.moshi.Moshi
-import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
-import org.json.JSONObject
-import java.lang.reflect.Type
-
-class MoshiConverter : JSONConvert(code = "errorCode", message = "errorMsg", success = "0") {
-
-    companion object {
-        private val moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build()
-    }
-
-    override fun <R> String.parseBody(succeed: Type): R? {
-        val string = try {
-            JSONObject(this).getString("data")
-        } catch (e: Exception) {
-            this
-        }
-        return moshi.adapter<R>(succeed).fromJson(string)
-    }
-}

+ 0 - 34
sample/src/main/java/com/drake/net/sample/converter/ProtobufConverter.kt

@@ -1,34 +0,0 @@
-@file:Suppress("UNCHECKED_CAST", "MemberVisibilityCanBePrivate")
-
-package com.drake.net.sample.converter
-
-import com.drake.net.convert.NetConverter
-import com.drake.net.exception.ConvertException
-import com.drake.net.exception.RequestParamsException
-import com.drake.net.exception.ServerResponseException
-import com.drake.net.request.kType
-import kotlinx.serialization.protobuf.ProtoBuf
-import kotlinx.serialization.serializer
-import okhttp3.Response
-import java.lang.reflect.Type
-
-class ProtobufConverter : NetConverter {
-
-    override fun <R> onConvert(succeed: Type, response: Response): R? {
-        try {
-            return NetConverter.onConvert<R>(succeed, response)
-        } catch (e: ConvertException) {
-            val code = response.code
-            when {
-                code in 200..299 -> { // 请求成功
-                    val bytes = response.body?.bytes() ?: return null
-                    val kType = response.request.kType ?: throw ConvertException(response, "Request does not contain KType")
-                    return ProtoBuf.decodeFromByteArray(ProtoBuf.serializersModule.serializer(kType), bytes) as R
-                }
-                code in 400..499 -> throw RequestParamsException(response, code.toString()) // 请求参数错误
-                code >= 500 -> throw ServerResponseException(response, code.toString()) // 服务器异常错误
-                else -> throw ConvertException(response)
-            }
-        }
-    }
-}

+ 0 - 66
sample/src/main/java/com/drake/net/sample/converter/SerializationConverter.kt

@@ -1,66 +0,0 @@
-@file:Suppress("UNCHECKED_CAST", "MemberVisibilityCanBePrivate")
-
-package com.drake.net.sample.converter
-
-import com.drake.net.NetConfig
-import com.drake.net.convert.NetConverter
-import com.drake.net.exception.ConvertException
-import com.drake.net.exception.RequestParamsException
-import com.drake.net.exception.ResponseException
-import com.drake.net.exception.ServerResponseException
-import com.drake.net.request.kType
-import kotlinx.serialization.json.Json
-import kotlinx.serialization.serializer
-import okhttp3.Response
-import org.json.JSONException
-import org.json.JSONObject
-import java.lang.reflect.Type
-import kotlin.reflect.KType
-
-class SerializationConverter(
-    val success: String = "0",
-    val code: String = "errorCode",
-    val message: String = "errorMsg",
-) : NetConverter {
-
-    companion object {
-        val jsonDecoder = Json {
-            ignoreUnknownKeys = true // 数据类可以不用声明Json的所有字段
-            coerceInputValues = true // 如果Json字段是Null则使用数据类字段默认值
-        }
-    }
-
-    override fun <R> onConvert(succeed: Type, response: Response): R? {
-        try {
-            return NetConverter.onConvert<R>(succeed, response)
-        } catch (e: ConvertException) {
-            val code = response.code
-            when {
-                code in 200..299 -> { // 请求成功
-                    val bodyString = response.body?.string() ?: return null
-                    val kType = response.request.kType
-                        ?: throw ConvertException(response, "Request does not contain KType")
-                    return try {
-                        val json = JSONObject(bodyString) // 获取JSON中后端定义的错误码和错误信息
-                        val srvCode = json.getString(this.code)
-                        if (srvCode == success) { // 对比后端自定义错误码
-                            json.getString("data").parseBody<R>(kType)
-                        } else { // 错误码匹配失败, 开始写入错误异常
-                            val errorMessage = json.optString(message, NetConfig.app.getString(com.drake.net.R.string.no_error_message))
-                            throw ResponseException(response, errorMessage, tag = srvCode) // 将业务错误码作为tag传递
-                        }
-                    } catch (e: JSONException) { // 固定格式JSON分析失败直接解析JSON
-                        bodyString.parseBody<R>(kType)
-                    }
-                }
-                code in 400..499 -> throw RequestParamsException(response, code.toString()) // 请求参数错误
-                code >= 500 -> throw ServerResponseException(response, code.toString()) // 服务器异常错误
-                else -> throw ConvertException(response)
-            }
-        }
-    }
-
-    fun <R> String.parseBody(succeed: KType): R? {
-        return jsonDecoder.decodeFromString(Json.serializersModule.serializer(succeed), this) as R
-    }
-}

+ 0 - 50
sample/src/main/java/com/drake/net/sample/interceptor/EncryptDataInterceptor.kt

@@ -1,50 +0,0 @@
-package com.drake.net.sample.interceptor
-
-import com.drake.net.request.MediaConst
-import com.drake.net.sample.utils.AESUtils
-import okhttp3.Interceptor
-import okhttp3.RequestBody.Companion.toRequestBody
-import okhttp3.Response
-import okhttp3.ResponseBody.Companion.toResponseBody
-import okio.Buffer
-
-/**
- * 演示如何加密请求参数/解密响应数据
- */
-class EncryptDataInterceptor : Interceptor {
-    override fun intercept(chain: Interceptor.Chain): Response {
-        var request = chain.request()
-
-        // 加密, 仅加密 POST请求/JSON参数类型
-        if (request.method == "POST" && request.header("Content-Type") == MediaConst.JSON.toString()) {
-            val body = request.body
-            if (body != null) {
-                val buff = Buffer()
-                body.writeTo(buff)
-                val json = buff.readUtf8()
-                if (json.isNotBlank()) {
-                    val encryptJson = AESUtils.encrypt(json)
-                    val newBody = encryptJson.toRequestBody(MediaConst.JSON)
-                    request = request.newBuilder().post(newBody).build()
-                }
-            }
-        }
-
-        var response = chain.proceed(request)
-
-        // 解密, 仅解密JSON响应类型
-        if (response.header("Content-Type") == MediaConst.JSON.toString()) {
-            val body = response.body
-            if (body != null) {
-                val json = body.string()
-                if (json.isNotBlank()) {
-                    val decryptJson = AESUtils.decrypt(json)
-                    val requestBody = decryptJson.toResponseBody(MediaConst.JSON)
-                    response = response.newBuilder().body(requestBody).build()
-                }
-            }
-        }
-
-        return response
-    }
-}

+ 0 - 16
sample/src/main/java/com/drake/net/sample/interceptor/GlobalHeaderInterceptor.kt

@@ -1,16 +0,0 @@
-package com.drake.net.sample.interceptor
-
-import com.drake.net.interceptor.RequestInterceptor
-import com.drake.net.request.BaseRequest
-import com.drake.net.sample.constants.UserConfig
-
-
-/** 演示添加全局请求头/参数 */
-class GlobalHeaderInterceptor : RequestInterceptor {
-
-    /** 本方法每次请求发起都会调用, 这里添加的参数可以是动态参数 */
-    override fun interceptor(request: BaseRequest) {
-        request.setHeader("client", "Android")
-        request.setHeader("token", UserConfig.token)
-    }
-}

+ 0 - 35
sample/src/main/java/com/drake/net/sample/interceptor/RefreshTokenInterceptor.kt

@@ -1,35 +0,0 @@
-package com.drake.net.sample.interceptor
-
-import com.drake.net.Net
-import com.drake.net.exception.ResponseException
-import com.drake.net.sample.constants.UserConfig
-import okhttp3.Interceptor
-import okhttp3.Response
-import org.json.JSONObject
-
-
-/**
- * 演示如何自动刷新token令牌
- */
-class RefreshTokenInterceptor : Interceptor {
-    override fun intercept(chain: Interceptor.Chain): Response {
-        val request = chain.request()
-        val response = chain.proceed(request) // 如果token失效
-
-        return synchronized(RefreshTokenInterceptor::class.java) {
-            if (response.code == 401 && UserConfig.isLogin && !request.url.pathSegments.contains("token")) {
-                val json = Net.get("token").execute<String>() // 同步刷新token
-                val jsonObject = JSONObject(json)
-                if (jsonObject.getBoolean("isExpired")) {
-                    // token刷新失败跳转到登录界面重新登录, 建议在错误处理器[NetErrorHandler]处理所有错误请求, 此处抛出异常即可
-                    throw ResponseException(response, "登录状态失效")
-                } else {
-                    UserConfig.token = jsonObject.optString("token")
-                }
-                chain.proceed(request)
-            } else {
-                response
-            }
-        }
-    }
-}

+ 0 - 55
sample/src/main/java/com/drake/net/sample/mock/MockDispatcher.kt

@@ -1,55 +0,0 @@
-package com.drake.net.sample.mock
-
-import android.util.Log
-import com.drake.engine.base.app
-import com.drake.net.sample.R
-import com.drake.net.sample.constants.Api
-import okhttp3.mockwebserver.Dispatcher
-import okhttp3.mockwebserver.MockResponse
-import okhttp3.mockwebserver.MockWebServer
-import okhttp3.mockwebserver.RecordedRequest
-import okio.buffer
-import okio.source
-import java.util.concurrent.TimeUnit
-import kotlin.concurrent.thread
-
-class MockDispatcher : Dispatcher() {
-
-    companion object {
-        fun initialize() {
-            val srv = MockWebServer()
-            srv.dispatcher = MockDispatcher()
-            thread {
-                try {
-                    srv.start(8091)
-                } catch (e: Exception) {
-                    Log.e("日志", "MOCK服务启动失败", e)
-                }
-            }
-        }
-    }
-
-    override fun dispatch(request: RecordedRequest): MockResponse {
-        var path = request.path
-        if (path != null) {
-            path = path.substringBefore("?") // 剔除URL参数
-        }
-        return when (path) {
-            Api.TEST -> MockResponse().setHeader("Content-Type", "text/plain").setBody("Request Success : ${request.method}")
-            Api.DELAY -> MockResponse().setBodyDelay(2, TimeUnit.SECONDS).setHeader("Content-Type", "text/plain").setBody("Request Success : ${request.method}")
-            Api.UPLOAD -> MockResponse().setBodyDelay(1, TimeUnit.SECONDS).setHeader("Content-Type", "text/plain").setBody("Upload Success")
-            Api.GAME -> getRawResponse(R.raw.game)
-            Api.DATA -> getRawResponse(R.raw.data)
-            Api.ARRAY -> getRawResponse(R.raw.array)
-            else -> MockResponse().setResponseCode(404)
-        }
-    }
-
-    private fun getRawResponse(rawId: Int, delay: Long = 500): MockResponse {
-        val buf = app.resources.openRawResource(rawId).source().buffer().readUtf8()
-        return MockResponse()
-            .setHeader("Content-Type", "application/json; charset=utf-8")
-            .setBodyDelay(delay, TimeUnit.MILLISECONDS)
-            .setBody(buf)
-    }
-}

+ 0 - 6
sample/src/main/java/com/drake/net/sample/model/ArrayData.kt

@@ -1,6 +0,0 @@
-package com.drake.net.sample.model
-
-class ArrayData {
-    var title: String = ""
-    var name: String = ""
-}

+ 0 - 7
sample/src/main/java/com/drake/net/sample/model/BasicData.kt

@@ -1,7 +0,0 @@
-package com.drake.net.sample.model
-
-open class BasicData<T> {
-    val code: String = ""
-    val msg: String = ""
-    val data: T? = null
-}

+ 0 - 21
sample/src/main/java/com/drake/net/sample/model/GameModel.kt

@@ -1,21 +0,0 @@
-package com.drake.net.sample.model
-
-@kotlinx.serialization.Serializable
-data class GameModel(
-    var total: Int = 0,
-    var list: List<Data> = listOf()
-) {
-
-    @kotlinx.serialization.Serializable
-    data class Data(
-        var id: Int = 0,
-        var img: String = "",
-        var name: String = "",
-        var label: List<String> = listOf(),
-        var price: String = "",
-        var initialPrice: String = "",
-        var grade: Int = 0,
-        var discount: Double = 0.0,
-        var endTime: Int = 0
-    )
-}

+ 0 - 6
sample/src/main/java/com/drake/net/sample/model/SubData.kt

@@ -1,6 +0,0 @@
-package com.drake.net.sample.model
-
-class SubData : BasicData<SubData>() {
-    var title: String = ""
-    var name: String = ""
-}

+ 44 - 29
sample/src/main/java/com/drake/net/sample/ui/activity/MainActivity.kt

@@ -1,48 +1,63 @@
 package com.drake.net.sample.ui.activity
 
-import androidx.core.view.GravityCompat
-import androidx.navigation.findNavController
-import androidx.navigation.fragment.FragmentNavigator
-import androidx.navigation.ui.AppBarConfiguration
-import androidx.navigation.ui.setupWithNavController
-import com.bumptech.glide.Glide
+import android.view.Menu
+import android.view.MenuItem
 import com.drake.engine.base.EngineActivity
+import com.drake.net.Get
+import com.drake.net.component.Progress
+import com.drake.net.interfaces.ProgressListener
 import com.drake.net.sample.R
 import com.drake.net.sample.databinding.ActivityMainBinding
-import com.drake.statusbar.immersive
+import com.drake.net.scope.NetCoroutineScope
+import com.drake.net.utils.scopeNetLife
+import java.io.File
 
-/**
- * 以下代码设置导航, 和框架本身无关无需关心, 请查看[com.drake.net.sample.ui.fragment]内的Fragment
- */
 class MainActivity : EngineActivity<ActivityMainBinding>(R.layout.activity_main) {
 
+    private lateinit var downloadScope: NetCoroutineScope
+
     override fun initView() {
-        immersive(binding.toolbar, true)
-        setSupportActionBar(binding.toolbar)
-        val navController = findNavController(R.id.nav)
-
-        Glide.with(this)
-            .load("https://avatars.githubusercontent.com/u/21078112?v=4")
-            .circleCrop()
-            .into(binding.drawerNav.getHeaderView(0).findViewById(R.id.iv))
-
-        binding.toolbar.setupWithNavController(
-            navController,
-            AppBarConfiguration(binding.drawerNav.menu, binding.drawer)
-        )
-        navController.addOnDestinationChangedListener { _, destination, _ ->
-            binding.toolbar.subtitle =
-                (destination as FragmentNavigator.Destination).className.substringAfterLast('.')
+
+        downloadScope = scopeNetLife {
+
+            val file =
+                Get<File>("https://r3---sn-i3b7knld.gvt1.com/edgedl/android/studio/install/2022.2.1.20/android-studio-2022.2.1.20-mac_arm.dmg?mh=fu&pl=22&shardbypass=sd&redirect_counter=1&cm2rm=sn-bavcx-hoael7s&req_id=6e6ac2d1c6f9032b&cms_redirect=yes&mip=180.190.115.150&mm=42&mn=sn-i3b7knld&ms=onc&mt=1685464123&mv=m&mvi=3&rmhost=r1---sn-i3b7knld.gvt1.com&smhost=r3---sn-i3b7kn6s.gvt1.com") {
+                    setDownloadFileName("android-studio.apk")
+                    setDownloadDir(this@MainActivity.filesDir)
+                    setDownloadMd5Verify()
+                    setDownloadTempFile()
+                    addDownloadListener(object : ProgressListener() {
+                        override fun onProgress(p: Progress) {
+                            binding.seek?.post {
+                                val progress = p.progress()
+                                binding.seek.progress = progress
+                                binding.tvProgress.text =
+                                    "download progress: $progress% download speed: ${p.speedSize()}     " +
+                                            "\n\nfileSize: ${p.totalSize()}  downloaded: ${p.currentSize()}  remainingSize: ${p.remainSize()}" +
+                                            "\n\nelapsedTime: ${p.useTime()}  timeLeft: ${p.remainTime()}"
+                            }
+                        }
+                    })
+                }.await()
+
         }
-        binding.drawerNav.setupWithNavController(navController)
     }
 
     override fun initData() {
     }
 
-    override fun onBackPressed() {
-        if (binding.drawer.isDrawerOpen(GravityCompat.START)) binding.drawer.closeDrawers() else super.onBackPressed()
+    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
+        menuInflater.inflate(R.menu.menu_download, menu)
+        return super.onCreateOptionsMenu(menu)
     }
+
+    override fun onOptionsItemSelected(item: MenuItem): Boolean {
+        when (item.itemId) {
+            R.id.cancel -> downloadScope.cancel() // Cancel download
+        }
+        return super.onOptionsItemSelected(item)
+    }
+
 }
 
 

+ 0 - 34
sample/src/main/java/com/drake/net/sample/ui/fragment/AsyncTaskFragment.kt

@@ -1,34 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import com.drake.engine.base.EngineFragment
-import com.drake.net.sample.R
-import com.drake.net.sample.databinding.FragmentAsyncTaskBinding
-import com.drake.net.utils.scope
-import kotlinx.coroutines.*
-
-class AsyncTaskFragment : EngineFragment<FragmentAsyncTaskBinding>(R.layout.fragment_async_task) {
-
-    override fun initView() {
-        scope {
-            binding.tvFragment.text = withContext(Dispatchers.IO) {
-                delay(2000)
-                "结果"
-            }
-        }
-    }
-
-    override fun initData() {
-    }
-
-    /**
-     * 抽出异步任务为一个函数
-     */
-    private suspend fun withDownloadFile() = withContext(Dispatchers.IO) {
-        delay(200)
-        "结果"
-    }
-
-    private fun CoroutineScope.asyncDownloadFile() = async {
-        "结果"
-    }
-}

+ 0 - 32
sample/src/main/java/com/drake/net/sample/ui/fragment/AutoDialogFragment.kt

@@ -1,32 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import com.drake.engine.base.EngineFragment
-import com.drake.net.Post
-import com.drake.net.sample.R
-import com.drake.net.sample.constants.Api
-import com.drake.net.sample.databinding.FragmentAutoDialogBinding
-import com.drake.net.utils.scopeDialog
-import com.drake.tooltip.toast
-import kotlinx.coroutines.CancellationException
-
-
-class AutoDialogFragment :
-    EngineFragment<FragmentAutoDialogBinding>(R.layout.fragment_auto_dialog) {
-
-    override fun initView() {
-        scopeDialog {
-            binding.tvFragment.text = Post<String>(Api.DELAY) {
-                param("username", "你的账号")
-                param("password", "123456")
-            }.await()
-        }.finally {
-            // 关闭对话框后执行的异常
-            if (it is CancellationException) {
-                toast("对话框被关闭, 网络请求自动取消") // 这里存在Handler吐司崩溃, 如果不想处理就直接使用我的吐司库 https://github.com/liangjingkanji/Tooltip
-            }
-        }
-    }
-
-    override fun initData() {
-    }
-}

+ 0 - 36
sample/src/main/java/com/drake/net/sample/ui/fragment/CallbackRequestFragment.kt

@@ -1,36 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import com.drake.engine.base.EngineFragment
-import com.drake.net.Net
-import com.drake.net.sample.R
-import com.drake.net.sample.constants.Api
-import com.drake.net.sample.databinding.FragmentCallbackRequestBinding
-import com.drake.net.utils.runMain
-import okhttp3.Call
-import okhttp3.Callback
-import okhttp3.Response
-import java.io.IOException
-
-class CallbackRequestFragment :
-    EngineFragment<FragmentCallbackRequestBinding>(R.layout.fragment_callback_request) {
-
-    override fun initData() {
-    }
-
-    override fun initView() {
-        // Net同样支持OkHttp原始的队列任务
-        Net.post(Api.TEST).enqueue(object : Callback {
-            override fun onFailure(call: Call, e: IOException) {
-            }
-
-            override fun onResponse(call: Call, response: Response) {
-                // 此处为子线程
-                val body = response.body?.string() ?: "无数据"
-                runMain {
-                    // 此处为主线程
-                    binding.tvFragment.text = body
-                }
-            }
-        })
-    }
-}

+ 0 - 46
sample/src/main/java/com/drake/net/sample/ui/fragment/CoroutineScopeFragment.kt

@@ -1,46 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import androidx.lifecycle.Lifecycle
-import com.drake.engine.base.EngineFragment
-import com.drake.net.sample.R
-import com.drake.net.sample.databinding.FragmentCoroutineScopeBinding
-import com.drake.net.utils.scope
-import com.drake.net.utils.scopeLife
-import com.drake.net.utils.scopeNet
-import com.drake.net.utils.scopeNetLife
-import kotlinx.coroutines.delay
-
-
-class CoroutineScopeFragment :
-    EngineFragment<FragmentCoroutineScopeBinding>(R.layout.fragment_coroutine_scope) {
-    override fun initData() {
-        // 其作用域在应用进程销毁时才会被动取消
-        scope {
-
-        }
-
-        // 其作用域在Activity或者Fragment销毁(onDestroy)时被动取消 [scopeNetLife]
-        scopeLife {
-            delay(2000)
-            binding.tvFragment.text = "任务结束"
-        }
-
-        // 自定义取消跟随的生命周期, 失去焦点时立即取消作用域
-        scopeLife(Lifecycle.Event.ON_PAUSE) {
-
-        }
-
-        // 此作用域会捕捉发生的异常, 如果是网络异常会进入网络异常的全局处理函数, 例如自动弹出吐司 [NetConfig.onError]
-        scopeNet {
-
-        }
-
-        // 自动网络处理 + 生命周期管理
-        scopeNetLife {
-
-        }
-    }
-
-    override fun initView() {
-    }
-}

+ 0 - 68
sample/src/main/java/com/drake/net/sample/ui/fragment/DownloadFileFragment.kt

@@ -1,68 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import android.annotation.SuppressLint
-import android.util.Log
-import android.view.Menu
-import android.view.MenuInflater
-import android.view.MenuItem
-import com.drake.engine.base.EngineFragment
-import com.drake.net.Get
-import com.drake.net.component.Progress
-import com.drake.net.interfaces.ProgressListener
-import com.drake.net.sample.R
-import com.drake.net.sample.databinding.FragmentDownloadFileBinding
-import com.drake.net.scope.NetCoroutineScope
-import com.drake.net.utils.scopeNetLife
-import java.io.File
-
-
-class DownloadFileFragment :
-    EngineFragment<FragmentDownloadFileBinding>(R.layout.fragment_download_file) {
-
-    private lateinit var downloadScope: NetCoroutineScope
-
-    @SuppressLint("SetTextI18n")
-    override fun initView() {
-        setHasOptionsMenu(true)
-        downloadScope = scopeNetLife {
-            val file =
-                Get<File>("https://r3---sn-i3b7knld.gvt1.com/edgedl/android/studio/install/2022.2.1.20/android-studio-2022.2.1.20-mac_arm.dmg?mh=fu&pl=22&shardbypass=sd&redirect_counter=1&cm2rm=sn-bavcx-hoael7s&req_id=6e6ac2d1c6f9032b&cms_redirect=yes&mip=180.190.115.150&mm=42&mn=sn-i3b7knld&ms=onc&mt=1685464123&mv=m&mvi=3&rmhost=r1---sn-i3b7knld.gvt1.com&smhost=r3---sn-i3b7kn6s.gvt1.com") {
-                    setDownloadFileName("net.apk")
-                    setDownloadDir(requireContext().filesDir)
-                    setDownloadMd5Verify()
-                    setDownloadTempFile()
-                    addDownloadListener(object : ProgressListener() {
-                        override fun onProgress(p: Progress) {
-                            binding.seek?.post {
-                                val progress = p.progress()
-                                binding.seek.progress = progress
-                                binding.tvProgress.text =
-                                    "下载进度: $progress% 下载速度: ${p.speedSize()}     " +
-                                            "\n\n文件大小: ${p.totalSize()}  已下载: ${p.currentSize()}  剩余大小: ${p.remainSize()}" +
-                                            "\n\n已使用时间: ${p.useTime()}  剩余时间: ${p.remainTime()}"
-                            }
-                        }
-                    })
-                }.await()
-
-            Log.d("日志", "(DownloadFileFragment.kt:47)    下载完毕 = ${file.absoluteFile}")
-
-            // 下载完成才会执行此处(所有网络请求使用await都会等待请求完成), 只是监听文件下载完成请不要使用[addDownloadListener]
-        }
-    }
-
-    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
-        super.onCreateOptionsMenu(menu, inflater)
-        inflater.inflate(R.menu.menu_download, menu)
-    }
-
-    override fun onOptionsItemSelected(item: MenuItem): Boolean {
-        when (item.itemId) {
-            R.id.cancel -> downloadScope.cancel() // 取消下载
-        }
-        return super.onOptionsItemSelected(item)
-    }
-
-    override fun initData() {
-    }
-}

+ 0 - 36
sample/src/main/java/com/drake/net/sample/ui/fragment/EditDebounceFragment.kt

@@ -1,36 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import com.drake.engine.base.EngineFragment
-import com.drake.net.Get
-import com.drake.net.sample.R
-import com.drake.net.sample.databinding.FragmentEditDebounceBinding
-import com.drake.net.utils.debounce
-import com.drake.net.utils.launchIn
-import com.drake.net.utils.scopeNetLife
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.cancel
-import kotlinx.coroutines.flow.distinctUntilChanged
-import org.json.JSONObject
-
-class EditDebounceFragment :
-    EngineFragment<FragmentEditDebounceBinding>(R.layout.fragment_edit_debounce) {
-
-    override fun initData() {
-    }
-
-    override fun initView() {
-        var scope: CoroutineScope? = null
-
-        // distinctUntilChanged 表示过滤掉重复结果
-        binding.etInput.debounce().distinctUntilChanged().launchIn(this) {
-            scope?.cancel() // 发起新的请求前取消旧的请求, 避免旧数据覆盖新数据
-            scope = scopeNetLife { // 保存旧的请求到一个变量中
-                binding.tvFragment.text = "请求中"
-                val data =
-                    Get<String>("http://api.k780.com/?app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json").await()
-                binding.tvFragment.text =
-                    JSONObject(data).getJSONObject("result").getString("datetime_2")
-            }
-        }
-    }
-}

+ 0 - 26
sample/src/main/java/com/drake/net/sample/ui/fragment/ErrorHandlerFragment.kt

@@ -1,26 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import com.drake.engine.base.EngineFragment
-import com.drake.net.Get
-import com.drake.net.sample.R
-import com.drake.net.sample.databinding.FragmentErrorHandlerBinding
-import com.drake.net.utils.scopeNetLife
-
-
-class ErrorHandlerFragment :
-    EngineFragment<FragmentErrorHandlerBinding>(R.layout.fragment_error_handler) {
-
-    override fun initView() {
-        scopeNetLife {
-            // 该请求是错误的路径会在控制台打印出错误信息
-            Get<String>("error").await()
-        }.catch {
-            // 重写该函数后, 错误不会流到[NetConfig.onError]中的全局错误处理, 在App.kt中可以自定义该全局处理, 同时包含onStateError
-            binding.tvFragment.text = it.message
-        }
-    }
-
-    override fun initData() {
-    }
-
-}

+ 0 - 24
sample/src/main/java/com/drake/net/sample/ui/fragment/ExceptionTraceFragment.kt

@@ -1,24 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import com.drake.engine.base.EngineFragment
-import com.drake.net.Get
-import com.drake.net.sample.R
-import com.drake.net.sample.databinding.FragmentExceptionTraceBinding
-import com.drake.net.utils.scopeNetLife
-
-
-class ExceptionTraceFragment :
-    EngineFragment<FragmentExceptionTraceBinding>(R.layout.fragment_exception_trace) {
-
-    override fun initView() {
-        scopeNetLife {
-            // 这是一个错误的地址, 请查看LogCat的错误信息, 在[initNet]函数中的[onError]回调中你也可以进行自定义错误信息打印
-            binding.tvFragment.text =
-                Get<String>("https://githuberror.com/liangjingkanji/Net/").await()
-        }
-    }
-
-    override fun initData() {
-    }
-
-}

+ 0 - 56
sample/src/main/java/com/drake/net/sample/ui/fragment/FastestFragment.kt

@@ -1,56 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import com.drake.engine.base.EngineFragment
-import com.drake.net.Get
-import com.drake.net.Post
-import com.drake.net.sample.R
-import com.drake.net.sample.constants.Api
-import com.drake.net.sample.databinding.FragmentFastestBinding
-import com.drake.net.utils.fastest
-import com.drake.net.utils.scopeNetLife
-
-class FastestFragment : EngineFragment<FragmentFastestBinding>(R.layout.fragment_fastest) {
-
-    override fun initView() {
-        scopeNetLife {
-            /*
-            网络请求的取消本质上依靠uid来辨别,如果设置[uid]参数可以在返回最快结果后取消掉其他网络请求, 反之不会取消其他网络请求
-            Tip: uid可以是任何值
-            */
-
-            // 同时发起四个网络请求
-            val deferred2 = Get<String>(Api.TEST) { setGroup("最快") }
-            val deferred3 = Post<String>("navi/json") { setGroup("最快") }
-            val deferred = Get<String>("api0") { setGroup("最快") } // 错误接口
-            val deferred1 = Get<String>("api1") { setGroup("最快") } // 错误接口
-
-            // 只返回最快的请求结果
-            binding.tvFragment.text =
-                fastest(listOf(deferred, deferred1, deferred2, deferred3), "最快")
-        }
-
-        /*
-        假设并发的接口返回的数据类型不同  或者 想要监听最快请求返回的结果回调请使用 [Deferred.transform] 函数
-        具体请看文档 https://liangjingkanji.github.io/Net/fastest/
-        */
-        // scopeNetLife {
-        //
-        //     // 同时发起四个网络请求
-        //     val requestList = mutableListOf<DeferredTransform<String, String>>().apply {
-        //         for (i in 0..28) {
-        //             val request = Get<String>(Api.BANNER).transform {
-        //                 Log.d("日志", "(FastestFragment.kt:73)    it = ${it}")
-        //                 it
-        //             }
-        //             add(request)
-        //         }
-        //     }
-        //
-        //     // 只返回最快的请求结果
-        //     binding.tvFragment.text = fastest(requestList).toString()
-        // }
-    }
-
-    override fun initData() {
-    }
-}

+ 0 - 55
sample/src/main/java/com/drake/net/sample/ui/fragment/HttpsCertificateFragment.kt

@@ -1,55 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import android.view.View
-import com.drake.engine.base.EngineFragment
-import com.drake.net.Get
-import com.drake.net.okhttp.setSSLCertificate
-import com.drake.net.okhttp.trustSSLCertificate
-import com.drake.net.sample.R
-import com.drake.net.sample.databinding.FragmentHttpsCertificateBinding
-import com.drake.net.utils.scopeNetLife
-import com.drake.tooltip.toast
-import okhttp3.OkHttpClient
-
-class HttpsCertificateFragment :
-    EngineFragment<FragmentHttpsCertificateBinding>(R.layout.fragment_https_certificate) {
-
-    override fun initView() {
-        binding.btnTrustCertificate.setOnClickListener(this::trustAllCertificate)
-        binding.btnImportCertificate.setOnClickListener(this::importCertificate)
-    }
-
-    override fun initData() {
-    }
-
-    /**
-     * 信任全部证书
-     * 大部分情况下还是建议在Application中配置一次全局的证书
-     */
-    private fun trustAllCertificate(view: View) {
-        scopeNetLife {
-            binding.tvResponse.text = Get<String>("https://github.com/liangjingkanji/Net/") {
-                // 构建新的客户端
-                okHttpClient = OkHttpClient.Builder().trustSSLCertificate().build()
-            }.await()
-        }
-    }
-
-    /**
-     * 导入私有证书
-     */
-    private fun importCertificate(view: View) {
-        scopeNetLife {
-            Get<String>("https://github.com/liangjingkanji/Net/") {
-                // 使用现在客户端
-                setClient {
-                    val privateCertificate = resources.assets.open("https.certificate")
-                    setSSLCertificate(privateCertificate)
-                }
-            }.await()
-        }.catch {
-            toast("作者没有证书, 只是演示代码, O(∩_∩)O哈哈~")
-        }
-    }
-
-}

+ 0 - 25
sample/src/main/java/com/drake/net/sample/ui/fragment/InterceptorFragment.kt

@@ -1,25 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import com.drake.engine.base.EngineFragment
-import com.drake.net.Get
-import com.drake.net.sample.R
-import com.drake.net.sample.constants.Api
-import com.drake.net.sample.databinding.FragmentInterceptorBinding
-import com.drake.net.utils.scopeNetLife
-
-
-class InterceptorFragment :
-    EngineFragment<FragmentInterceptorBinding>(R.layout.fragment_interceptor) {
-
-    override fun initView() {
-        scopeNetLife {
-            binding.tvFragment.text = Get<String>(Api.TEST) {
-                // 拦截器只支持全局, 无法单例, 请查看[com.drake.net.sample.interceptor.NetInterceptor]
-            }.await()
-        }
-    }
-
-    override fun initData() {
-    }
-
-}

+ 0 - 38
sample/src/main/java/com/drake/net/sample/ui/fragment/LimitedTimeFragment.kt

@@ -1,38 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import android.util.Log
-import android.view.View
-import com.drake.engine.base.EngineFragment
-import com.drake.net.Get
-import com.drake.net.sample.R
-import com.drake.net.sample.constants.Api
-import com.drake.net.sample.databinding.FragmentLimitedTimeBinding
-import com.drake.net.utils.scopeDialog
-import com.drake.tooltip.toast
-import kotlinx.coroutines.TimeoutCancellationException
-import kotlinx.coroutines.withTimeout
-
-class LimitedTimeFragment : EngineFragment<FragmentLimitedTimeBinding>(R.layout.fragment_limited_time) {
-    override fun initView() {
-        binding.v = this
-    }
-
-    override fun initData() {
-    }
-
-    override fun onClick(v: View) {
-        scopeDialog {
-            // 当接口请求在100毫秒内没有完成会抛出异常TimeoutCancellationException
-            withTimeout(100) {
-                Get<String>(Api.TEST).await()
-            }
-        }.catch {
-            Log.e("日志", "catch", it) // catch无法接收到CancellationException异常
-        }.finally {
-            Log.e("日志", "finally", it) // TimeoutCancellationException属于CancellationException子类故只会被finally接收到
-            if (it is TimeoutCancellationException) {
-                toast("由于未在指定时间完成请求则取消请求")
-            }
-        }
-    }
-}

+ 0 - 34
sample/src/main/java/com/drake/net/sample/ui/fragment/ParallelNetworkFragment.kt

@@ -1,34 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import com.drake.engine.base.EngineFragment
-import com.drake.net.Get
-import com.drake.net.Post
-import com.drake.net.Trace
-import com.drake.net.sample.R
-import com.drake.net.sample.constants.Api
-import com.drake.net.sample.databinding.FragmentParallelNetworkBinding
-import com.drake.net.utils.scopeNetLife
-
-
-class ParallelNetworkFragment :
-    EngineFragment<FragmentParallelNetworkBinding>(R.layout.fragment_parallel_network) {
-
-    override fun initView() {
-        scopeNetLife {
-
-            // 同时发起三个请求
-            val deferred = Get<String>(Api.TEST)
-            val deferred1 = Post<String>(Api.TEST)
-            val deferred2 = Trace<String>(Api.TEST)
-
-            // 同时接收三个请求数据
-            deferred.await()
-            deferred1.await()
-            deferred2.await()
-        }
-    }
-
-    override fun initData() {
-    }
-
-}

+ 0 - 38
sample/src/main/java/com/drake/net/sample/ui/fragment/PreviewCacheFragment.kt

@@ -1,38 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import android.util.Log
-import com.drake.engine.base.EngineFragment
-import com.drake.net.Get
-import com.drake.net.cache.CacheMode
-import com.drake.net.sample.R
-import com.drake.net.sample.constants.Api
-import com.drake.net.sample.databinding.FragmentReadCacheBinding
-import com.drake.net.utils.scopeNetLife
-
-
-/** 预览缓存. 其实不仅仅是双重加载缓存/网络也可以用于回退请求, 可以执行两次作用域并且忽略preview{}内的所有错误 */
-class PreviewCacheFragment : EngineFragment<FragmentReadCacheBinding>(R.layout.fragment_read_cache) {
-
-    override fun initView() {
-
-        // 一般用于秒开首页或者回退加载数据. 我们可以在preview{}只加载缓存. 然后再执行scopeNetLife来请求网络, 做到缓存+网络双重加载的效果
-
-        scopeNetLife {
-            // 然后执行这里(网络请求)
-            binding.tvFragment.text = Get<String>(Api.TEST) {
-                setCacheMode(CacheMode.WRITE)
-            }.await()
-            Log.d("日志", "网络请求")
-        }.preview(true) {
-            // 先执行这里(仅读缓存), 任何异常都视为读取缓存失败
-            binding.tvFragment.text = Get<String>(Api.TEST) {
-                setCacheMode(CacheMode.READ)
-            }.await()
-            Log.d("日志", "读取缓存")
-        }
-    }
-
-    override fun initData() {
-    }
-
-}

+ 0 - 35
sample/src/main/java/com/drake/net/sample/ui/fragment/PullRefreshFragment.kt

@@ -1,35 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import com.drake.brv.utils.linear
-import com.drake.brv.utils.setup
-import com.drake.engine.base.EngineFragment
-import com.drake.net.Get
-import com.drake.net.sample.R
-import com.drake.net.sample.constants.Api
-import com.drake.net.sample.databinding.FragmentPullRefreshBinding
-import com.drake.net.sample.model.GameModel
-import com.drake.net.utils.scope
-
-
-class PullRefreshFragment :
-    EngineFragment<FragmentPullRefreshBinding>(R.layout.fragment_pull_refresh) {
-
-    override fun initView() {
-        binding.rv.linear().setup {
-            addType<GameModel.Data>(R.layout.item_pull_list)
-        }
-
-        binding.page.onRefresh {
-            scope {
-                val response = Get<GameModel>(String.format(Api.GAME, index)).await()
-                addData(response.list) {
-                    index < response.total
-                }
-            }
-        }.autoRefresh()
-    }
-
-    override fun initData() {
-    }
-
-}

+ 0 - 33
sample/src/main/java/com/drake/net/sample/ui/fragment/PushRefreshFragment.kt

@@ -1,33 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import com.drake.brv.utils.linear
-import com.drake.brv.utils.models
-import com.drake.brv.utils.setup
-import com.drake.engine.base.EngineFragment
-import com.drake.net.Get
-import com.drake.net.sample.R
-import com.drake.net.sample.constants.Api
-import com.drake.net.sample.databinding.FragmentPushRefreshBinding
-import com.drake.net.sample.model.GameModel
-import com.drake.net.utils.scope
-
-/** 本页面已禁用上拉加载(添加xml属性app:srlEnableLoadMore="false"), 只允许下拉刷新 */
-class PushRefreshFragment :
-    EngineFragment<FragmentPushRefreshBinding>(R.layout.fragment_push_refresh) {
-
-    override fun initView() {
-        binding.rv.linear().setup {
-            addType<GameModel.Data>(R.layout.item_list)
-        }
-
-        binding.page.onRefresh {
-            scope {
-                binding.rv.models = Get<GameModel>(Api.GAME).await().list
-            }
-        }.autoRefresh()
-    }
-
-    override fun initData() {
-    }
-
-}

+ 0 - 32
sample/src/main/java/com/drake/net/sample/ui/fragment/ReadCacheFragment.kt

@@ -1,32 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import com.drake.engine.base.EngineFragment
-import com.drake.net.Post
-import com.drake.net.cache.CacheMode
-import com.drake.net.sample.R
-import com.drake.net.sample.constants.Api
-import com.drake.net.sample.databinding.FragmentReadCacheBinding
-import com.drake.net.utils.scopeNetLife
-
-
-/**
- * 默认支持Http标准缓存协议
- * 如果需要自定义缓存模式来强制读写缓存,可以使用[CacheMode], 这会覆盖默认的Http标准缓存协议.
- * 可以缓存任何数据, 包括文件. 并且遵守LRU缓存策略限制最大缓存空间
- */
-class ReadCacheFragment : EngineFragment<FragmentReadCacheBinding>(R.layout.fragment_read_cache) {
-
-    override fun initView() {
-        scopeNetLife {
-            binding.tvFragment.text =
-                Post<String>(Api.TEST) {
-                    setCacheMode(CacheMode.REQUEST_THEN_READ) // 请求网络失败会读取缓存, 请断网测试
-                    // setCacheKey("自定义缓存KEY")
-                }.await()
-        }
-    }
-
-    override fun initData() {
-    }
-
-}

+ 0 - 121
sample/src/main/java/com/drake/net/sample/ui/fragment/RequestMethodFragment.kt

@@ -1,121 +0,0 @@
-@file:Suppress("FunctionName")
-
-package com.drake.net.sample.ui.fragment
-
-import android.view.Menu
-import android.view.MenuInflater
-import android.view.MenuItem
-import com.drake.engine.base.EngineFragment
-import com.drake.net.*
-import com.drake.net.sample.R
-import com.drake.net.sample.constants.Api
-import com.drake.net.sample.databinding.FragmentRequestMethodBinding
-import com.drake.net.utils.scopeNetLife
-
-
-class RequestMethodFragment :
-    EngineFragment<FragmentRequestMethodBinding>(R.layout.fragment_request_method) {
-
-    override fun initView() {
-        setHasOptionsMenu(true)
-    }
-
-    override fun initData() {
-    }
-
-    private fun GET() {
-        scopeNetLife {
-            binding.tvFragment.text = Get<String>(Api.TEST).await()
-        }
-    }
-
-    private fun POST() {
-        scopeNetLife {
-            binding.tvFragment.text = Post<String>(Api.TEST).await()
-        }
-    }
-
-    private fun HEAD() {
-        scopeNetLife {
-            binding.tvFragment.text = Head<String>(Api.TEST).await()
-        }
-    }
-
-    private fun PUT() {
-        scopeNetLife {
-            binding.tvFragment.text = Put<String>(Api.TEST).await()
-        }
-    }
-
-    private fun PATCH() {
-        scopeNetLife {
-            binding.tvFragment.text = Patch<String>(Api.TEST).await()
-        }
-    }
-
-    private fun DELETE() {
-        scopeNetLife {
-            binding.tvFragment.text = Delete<String>(Api.TEST).await()
-        }
-    }
-
-    private fun TRACE() {
-        scopeNetLife {
-            binding.tvFragment.text = Trace<String>(Api.TEST).await()
-        }
-    }
-
-    private fun OPTIONS() {
-        scopeNetLife {
-            binding.tvFragment.text = Options<String>(Api.TEST).await()
-        }
-    }
-
-
-    /**
-     * 请求参数为JSON
-     */
-    private fun JSON() {
-        val name = "金城武"
-        val age = 29
-        val measurements = listOf(100, 100, 100)
-
-        scopeNetLife {
-
-            // 创建JSONObject对象
-            // binding.tvFragment.text = Post<String>(Api.BANNER) {
-            //     json(JSONObject().run {
-            //         put("name", name)
-            //         put("age", age)
-            //         put("measurements", JSONArray(measurements))
-            //     })
-            // }.await()
-
-            // 创建JSON
-            binding.tvFragment.text = Post<String>(Api.TEST) {
-                json("name" to name, "age" to age, "measurements" to measurements) // 同时支持Map集合
-            }.await()
-        }
-    }
-
-    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
-        super.onCreateOptionsMenu(menu, inflater)
-        inflater.inflate(R.menu.menu_request_method, menu)
-    }
-
-    override fun onOptionsItemSelected(item: MenuItem): Boolean {
-        when (item.itemId) {
-            R.id.get -> GET()
-            R.id.post -> POST()
-            R.id.head -> HEAD()
-            R.id.trace -> TRACE()
-            R.id.options -> OPTIONS()
-            R.id.delete -> DELETE()
-            R.id.put -> PUT()
-            R.id.patch -> PATCH()
-            R.id.json -> JSON()
-        }
-        return super.onOptionsItemSelected(item)
-    }
-
-}

+ 0 - 25
sample/src/main/java/com/drake/net/sample/ui/fragment/StateLayoutFragment.kt

@@ -1,25 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import com.drake.engine.base.EngineFragment
-import com.drake.net.Get
-import com.drake.net.sample.R
-import com.drake.net.sample.constants.Api
-import com.drake.net.sample.databinding.FragmentStateLayoutBinding
-import com.drake.net.utils.scope
-
-
-class StateLayoutFragment :
-    EngineFragment<FragmentStateLayoutBinding>(R.layout.fragment_state_layout) {
-
-    override fun initData() {
-    }
-
-    override fun initView() {
-        binding.state.onRefresh {
-            scope {
-                binding.tvFragment.text = Get<String>(Api.TEST).await()
-            }
-        }.showLoading()
-    }
-
-}

+ 0 - 51
sample/src/main/java/com/drake/net/sample/ui/fragment/SuperIntervalFragment.kt

@@ -1,51 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import android.view.Menu
-import android.view.MenuInflater
-import android.view.MenuItem
-import com.drake.engine.base.EngineFragment
-import com.drake.net.sample.R
-import com.drake.net.sample.databinding.FragmentSuperIntervalBinding
-import com.drake.net.time.Interval
-import java.util.concurrent.TimeUnit
-
-
-class SuperIntervalFragment :
-    EngineFragment<FragmentSuperIntervalBinding>(R.layout.fragment_super_interval) {
-
-    private lateinit var interval: Interval // 轮询器
-
-    override fun initView() {
-        setHasOptionsMenu(true)
-        // 自定义计数器个数的轮询器, 当[start]]比[end]值大, 且end不等于-1时, 即为倒计时
-        interval = Interval(0, 1, TimeUnit.SECONDS, 10).life(this)
-        // interval = Interval(1, TimeUnit.SECONDS) // 每秒回调一次, 不会自动结束
-        interval.subscribe {
-            binding.tvFragment.text = it.toString()
-        }.finish {
-            binding.tvFragment.text = "计时完成"
-        }.start()
-    }
-
-    override fun initData() {
-    }
-
-    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
-        super.onCreateOptionsMenu(menu, inflater)
-        inflater.inflate(R.menu.menu_interval, menu)
-    }
-
-    override fun onOptionsItemSelected(item: MenuItem): Boolean {
-        when (item.itemId) {
-            R.id.start -> interval.start()
-            R.id.pause -> interval.pause()
-            R.id.resume -> interval.resume()
-            R.id.reset -> interval.reset()
-            R.id.switch_interval -> interval.switch()
-            R.id.stop -> interval.stop()
-            R.id.cancel -> interval.cancel()
-        }
-        return super.onOptionsItemSelected(item)
-    }
-
-}

+ 0 - 34
sample/src/main/java/com/drake/net/sample/ui/fragment/SwitchDispatcherFragment.kt

@@ -1,34 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import com.drake.engine.base.EngineFragment
-import com.drake.net.sample.R
-import com.drake.net.sample.databinding.FragmentSwitchDispatcherBinding
-import com.drake.net.utils.scopeLife
-import com.drake.net.utils.withIO
-import com.drake.net.utils.withMain
-import kotlinx.coroutines.launch
-
-
-class SwitchDispatcherFragment :
-    EngineFragment<FragmentSwitchDispatcherBinding>(R.layout.fragment_switch_dispatcher) {
-
-    override fun initView() {
-        scopeLife {
-
-            // 点击函数名查看更多相关函数
-            launch {
-                val data = withMain {
-                    "异步调度器切换到主线程"
-                }
-            }
-
-            val data = withIO {
-                "主线程切换到IO调度器"
-            }
-        }
-    }
-
-    override fun initData() {
-    }
-
-}

+ 0 - 31
sample/src/main/java/com/drake/net/sample/ui/fragment/SyncRequestFragment.kt

@@ -1,31 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import com.drake.engine.base.EngineFragment
-import com.drake.net.Net
-import com.drake.net.sample.R
-import com.drake.net.sample.constants.Api
-import com.drake.net.sample.databinding.FragmentSyncRequestBinding
-import kotlin.concurrent.thread
-
-class SyncRequestFragment :
-    EngineFragment<FragmentSyncRequestBinding>(R.layout.fragment_sync_request) {
-
-    override fun initView() {
-        thread { // 网络请求不允许在主线程
-            val result = try {
-                Net.post(Api.TEST).execute<String>()
-            } catch (e: Exception) { // 同步请求失败会导致崩溃要求捕获异常
-                "请求错误 = ${e.message}"
-            }
-
-            // val result = Net.post(Api.BANNER).toResult<String>().getOrDefault("请求发生错误, 我这是默认值")
-
-            binding.tvFragment?.post { // 这里用?号是避免界面被销毁依然赋值
-                binding.tvFragment?.text = result  // view要求在主线程更新
-            }
-        }
-    }
-
-    override fun initData() {
-    }
-}

+ 0 - 67
sample/src/main/java/com/drake/net/sample/ui/fragment/TimingRequestFragment.kt

@@ -1,67 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import android.view.View
-import com.drake.engine.base.EngineFragment
-import com.drake.net.Get
-import com.drake.net.sample.R
-import com.drake.net.sample.databinding.FragmentTimingRequestBinding
-import com.drake.net.utils.scopeNetLife
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.cancel
-import kotlinx.coroutines.delay
-import org.json.JSONObject
-import kotlin.time.DurationUnit
-import kotlin.time.toDuration
-
-class TimingRequestFragment : EngineFragment<FragmentTimingRequestBinding>(R.layout.fragment_timing_request) {
-
-    private var scope: CoroutineScope? = null
-
-    override fun initView() {
-        binding.v = this
-    }
-
-    override fun initData() {
-    }
-
-    override fun onClick(v: View) {
-        when (v) {
-            binding.btnRepeat -> repeatRequest()
-            binding.infinityRepeat -> infinityRequest()
-            binding.btnCancel -> scope?.cancel()
-        }
-    }
-
-    /** 重复请求10次 */
-    private fun repeatRequest() {
-        scope?.cancel()
-        scope = scopeNetLife {
-            // 每两秒请求一次, 总共执行10次
-            repeat(20) {
-                delay(1000)
-                val data =
-                    Get<String>("http://api.k780.com/?app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json").await()
-                binding.tvContent.text =
-                    JSONObject(data).getJSONObject("result").getString("datetime_2")
-                // 通过return@repeat可以终止循环
-            }
-        }
-    }
-
-    /** 无限次数请求 */
-    private fun infinityRequest() {
-        scope?.cancel()
-        scope = scopeNetLife {
-            // 每两秒请求一次, 总共执行10次
-            while (true) {
-                delay(1.toDuration(DurationUnit.SECONDS))
-                val data =
-                    Get<String>("http://api.k780.com/?app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json").await()
-                binding.tvContent.text =
-                    JSONObject(data).getJSONObject("result").getString("datetime_2")
-                // 通过break可以终止循环
-            }
-        }
-    }
-
-}

+ 0 - 32
sample/src/main/java/com/drake/net/sample/ui/fragment/UniqueRequestFragment.kt

@@ -1,32 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import android.util.Log
-import com.drake.engine.base.EngineFragment
-import com.drake.net.Post
-import com.drake.net.sample.R
-import com.drake.net.sample.constants.Api
-import com.drake.net.sample.databinding.FragmentUniqueRequestBinding
-import com.drake.net.scope.AndroidScope
-import com.drake.net.utils.scopeNetLife
-
-class UniqueRequestFragment :
-    EngineFragment<FragmentUniqueRequestBinding>(R.layout.fragment_unique_request) {
-
-    private var scope: AndroidScope? = null
-
-    override fun initView() {
-        binding.btnRequest.setOnClickListener {
-            binding.tvResult.text = "请求中"
-            scope?.cancel() // 如果存在则取消
-
-            scope = scopeNetLife {
-                val result = Post<String>(Api.TEST).await()
-                Log.d("日志", "请求到结果") // 你一直重复点击"发起请求"按钮会发现永远无法拿到请求结果, 因为每次发起新的请求会取消未完成的
-                binding.tvResult.text = result
-            }
-        }
-    }
-
-    override fun initData() {
-    }
-}

+ 0 - 82
sample/src/main/java/com/drake/net/sample/ui/fragment/UploadFileFragment.kt

@@ -1,82 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import android.app.Activity
-import android.net.Uri
-import com.drake.engine.base.EngineFragment
-import com.drake.net.Post
-import com.drake.net.component.Progress
-import com.drake.net.interfaces.ProgressListener
-import com.drake.net.sample.R
-import com.drake.net.sample.constants.Api
-import com.drake.net.sample.contract.AlbumSelectContract
-import com.drake.net.sample.databinding.FragmentUploadFileBinding
-import com.drake.net.utils.TipUtils
-import com.drake.net.utils.scopeNetLife
-import okio.buffer
-import okio.sink
-import okio.source
-import java.io.File
-
-
-class UploadFileFragment : EngineFragment<FragmentUploadFileBinding>(R.layout.fragment_upload_file) {
-    private val albumSelectLauncher = registerForActivityResult(AlbumSelectContract()) {
-        when (it.code) {
-            Activity.RESULT_CANCELED -> TipUtils.toast("图片选择取消")
-            Activity.RESULT_OK -> uploadUri(it.uri)
-        }
-    }
-
-    override fun initView() {
-        binding.btnFile.setOnClickListener {
-            uploadFile()
-        }
-        binding.btnUri.setOnClickListener {
-            albumSelectLauncher.launch(null)
-        }
-    }
-
-    private fun uploadFile() {
-        scopeNetLife {
-            Post<String>(Api.UPLOAD) {
-                param("file", getAssetsFile())
-                addUploadListener(object : ProgressListener() {
-                    override fun onProgress(p: Progress) {
-                        binding.seek.post {
-                            binding.seek.progress = p.progress()
-                            binding.tvProgress.text = "上传进度: ${p.progress()}% 上传速度: ${p.speedSize()}     " + "\n\n文件大小: ${p.totalSize()}  已上传: ${p.currentSize()}  剩余大小: ${p.remainSize()}" + "\n\n已使用时间: ${p.useTime()}  剩余时间: ${p.remainTime()}"
-                        }
-                    }
-                })
-            }.await()
-        }
-    }
-
-    private fun uploadUri(uri: Uri?) {
-        scopeNetLife {
-            Post<String>(Api.UPLOAD) {
-                param("file", uri)
-                addUploadListener(object : ProgressListener() {
-                    override fun onProgress(p: Progress) {
-                        binding.seek.post {
-                            binding.seek.progress = p.progress()
-                            binding.tvProgress.text = "上传进度: ${p.progress()}% 上传速度: ${p.speedSize()}     " + "\n\n文件大小: ${p.totalSize()}  已上传: ${p.currentSize()}  剩余大小: ${p.remainSize()}" + "\n\n已使用时间: ${p.useTime()}  剩余时间: ${p.remainTime()}"
-                        }
-                    }
-                })
-            }.await()
-        }
-    }
-
-    private fun getAssetsFile(): File {
-        val fileName = "upload_file.jpg"
-        val inputStream = resources.assets.open(fileName)
-        val file = File(requireContext().filesDir.path, fileName)
-        inputStream.source().buffer().use {
-            it.readAll(file.sink())
-        }
-        return file
-    }
-
-    override fun initData() {
-    }
-}

+ 0 - 26
sample/src/main/java/com/drake/net/sample/ui/fragment/ViewModelRequestFragment.kt

@@ -1,26 +0,0 @@
-package com.drake.net.sample.ui.fragment
-
-import androidx.fragment.app.viewModels
-import com.drake.engine.base.EngineFragment
-import com.drake.net.sample.R
-import com.drake.net.sample.databinding.FragmentViewModelRequestBinding
-import com.drake.net.sample.vm.UserViewModel
-
-class ViewModelRequestFragment :
-    EngineFragment<FragmentViewModelRequestBinding>(R.layout.fragment_view_model_request) {
-
-    private val userViewModel: UserViewModel by viewModels() // 创建ViewModel
-
-    override fun initView() {
-        binding.lifecycleOwner = this
-        binding.m = userViewModel
-
-        // 动作开始拉取服务器数据
-        binding.btnFetchUserinfo.setOnClickListener {
-            userViewModel.fetchUserInfo()
-        }
-    }
-
-    override fun initData() {
-    }
-}

+ 0 - 31
sample/src/main/java/com/drake/net/sample/ui/fragment/converter/BaseConvertFragment.kt

@@ -1,31 +0,0 @@
-package com.drake.net.sample.ui.fragment.converter
-
-import android.os.Bundle
-import android.view.Menu
-import android.view.MenuInflater
-import android.view.MenuItem
-import androidx.annotation.LayoutRes
-import androidx.databinding.ViewDataBinding
-import androidx.navigation.fragment.findNavController
-import androidx.navigation.ui.onNavDestinationSelected
-import com.drake.engine.base.EngineFragment
-import com.drake.net.sample.R
-
-abstract class BaseConvertFragment<T : ViewDataBinding>(@LayoutRes contentLayoutId: Int = 0) :
-    EngineFragment<T>(contentLayoutId) {
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setHasOptionsMenu(true)
-    }
-
-    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
-        super.onCreateOptionsMenu(menu, inflater)
-        inflater.inflate(R.menu.menu_converter, menu)
-    }
-
-    override fun onOptionsItemSelected(item: MenuItem): Boolean {
-        item.onNavDestinationSelected(findNavController())
-        return true
-    }
-}

+ 0 - 31
sample/src/main/java/com/drake/net/sample/ui/fragment/converter/FastJsonConvertFragment.kt

@@ -1,31 +0,0 @@
-package com.drake.net.sample.ui.fragment.converter
-
-import com.drake.net.Get
-import com.drake.net.sample.R
-import com.drake.net.sample.constants.Api
-import com.drake.net.sample.converter.FastJsonConverter
-import com.drake.net.sample.databinding.FragmentCustomConvertBinding
-import com.drake.net.sample.model.GameModel
-import com.drake.net.utils.scopeNetLife
-
-
-class FastJsonConvertFragment :
-    BaseConvertFragment<FragmentCustomConvertBinding>(R.layout.fragment_custom_convert) {
-
-    override fun initView() {
-        binding.tvConvertTip.text = """
-            1. 阿里巴巴出品的Json解析库
-            2. 引入kotlin-reflect库可以支持kotlin默认值
-        """.trimIndent()
-
-        scopeNetLife {
-            binding.tvFragment.text = Get<GameModel>(Api.GAME) {
-                converter = FastJsonConverter() // 单例转换器, 此时会忽略全局转换器
-            }.await().list[0].name
-        }
-    }
-
-    override fun initData() {
-    }
-
-}

+ 0 - 33
sample/src/main/java/com/drake/net/sample/ui/fragment/converter/GsonConvertFragment.kt

@@ -1,33 +0,0 @@
-package com.drake.net.sample.ui.fragment.converter
-
-import com.drake.net.Get
-import com.drake.net.sample.R
-import com.drake.net.sample.constants.Api
-import com.drake.net.sample.converter.GsonConverter
-import com.drake.net.sample.databinding.FragmentCustomConvertBinding
-import com.drake.net.sample.model.GameModel
-import com.drake.net.utils.scopeNetLife
-
-
-class GsonConvertFragment :
-    BaseConvertFragment<FragmentCustomConvertBinding>(R.layout.fragment_custom_convert) {
-
-    override fun initView() {
-        binding.tvConvertTip.text = """
-            1. Google官方出品
-            2. Json解析库Java上的老牌解析库
-            3. 不支持Kotlin构造参数默认值
-            4. 支持动态解析
-        """.trimIndent()
-
-        scopeNetLife {
-            binding.tvFragment.text = Get<GameModel>(Api.GAME) {
-                converter = GsonConverter() // 单例转换器, 此时会忽略全局转换器, 在Net中可以直接解析List等嵌套泛型数据
-            }.await().list[0].name
-        }
-    }
-
-    override fun initData() {
-    }
-
-}

+ 0 - 33
sample/src/main/java/com/drake/net/sample/ui/fragment/converter/MoshiConvertFragment.kt

@@ -1,33 +0,0 @@
-package com.drake.net.sample.ui.fragment.converter
-
-import com.drake.net.Get
-import com.drake.net.sample.R
-import com.drake.net.sample.constants.Api
-import com.drake.net.sample.converter.MoshiConverter
-import com.drake.net.sample.databinding.FragmentCustomConvertBinding
-import com.drake.net.sample.model.GameModel
-import com.drake.net.utils.scopeNetLife
-
-
-class MoshiConvertFragment :
-    BaseConvertFragment<FragmentCustomConvertBinding>(R.layout.fragment_custom_convert) {
-
-    override fun initView() {
-        binding.tvConvertTip.text = """
-            1. Square出品的JSON解析库
-            2. 支持Kotlin构造默认值
-            3. 具备注解和反射两种使用方式
-            4. 非可选类型反序列化时赋值Null会抛出异常
-            5, 不支持动态解析
-        """.trimIndent()
-
-        scopeNetLife {
-            binding.tvFragment.text = Get<GameModel>(Api.GAME) {
-                converter = MoshiConverter() // 单例转换器, 此时会忽略全局转换器
-            }.await().list[0].name
-        }
-    }
-
-    override fun initData() {
-    }
-}

+ 0 - 37
sample/src/main/java/com/drake/net/sample/ui/fragment/converter/SerializationConvertFragment.kt

@@ -1,37 +0,0 @@
-package com.drake.net.sample.ui.fragment.converter
-
-import com.drake.net.Get
-import com.drake.net.sample.R
-import com.drake.net.sample.constants.Api
-import com.drake.net.sample.converter.SerializationConverter
-import com.drake.net.sample.databinding.FragmentCustomConvertBinding
-import com.drake.net.sample.model.GameModel
-import com.drake.net.utils.scopeNetLife
-
-class SerializationConvertFragment :
-    BaseConvertFragment<FragmentCustomConvertBinding>(R.layout.fragment_custom_convert) {
-
-    override fun initView() {
-        binding.tvConvertTip.text = """
-            1. kotlin官方出品, 推荐使用 
-            2. kotlinx.serialization 是Kotlin上是最完美的序列化工具 
-            3. 支持多种反序列化数据类型Pair/枚举/Map...
-            4. 多配置选项
-            5. 支持动态解析
-            6. 支持ProtoBuf/CBOR/JSON等数据
-        """.trimIndent()
-
-        scopeNetLife {
-            val data = Get<GameModel>(Api.GAME) {
-                // 该转换器直接解析JSON中的data字段, 而非返回的整个JSON字符串
-                converter = SerializationConverter() // 单例转换器, 此时会忽略全局转换器
-            }.await()
-
-            binding.tvFragment.text = data.list[0].name
-        }
-    }
-
-    override fun initData() {
-    }
-
-}

+ 0 - 34
sample/src/main/java/com/drake/net/sample/utils/AESUtils.kt

@@ -1,34 +0,0 @@
-package com.drake.net.sample.utils
-
-import okio.ByteString
-import okio.ByteString.Companion.decodeHex
-import javax.crypto.Cipher
-import javax.crypto.spec.SecretKeySpec
-
-object AESUtils {
-
-    private const val KEY = "123456789"
-    private const val IV = "123456789"
-
-    fun encrypt(data: String): String {
-        val key = KEY.decodeHex()
-        val iv = IV.decodeHex()
-        val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
-        val keySpec = SecretKeySpec(key.toByteArray(), "AES")
-        val ivSpec = javax.crypto.spec.IvParameterSpec(iv.toByteArray())
-        cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec)
-        val encrypted = cipher.doFinal(data.toByteArray())
-        return ByteString.of(*encrypted).hex()
-    }
-
-    fun decrypt(data: String): String {
-        val key = KEY.decodeHex()
-        val iv = IV.decodeHex()
-        val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
-        val keySpec = SecretKeySpec(key.toByteArray(), "AES")
-        val ivSpec = javax.crypto.spec.IvParameterSpec(iv.toByteArray())
-        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec)
-        val encrypted = cipher.doFinal(data.decodeHex().toByteArray())
-        return String(encrypted)
-    }
-}

+ 0 - 33
sample/src/main/java/com/drake/net/sample/vm/UserViewModel.kt

@@ -1,33 +0,0 @@
-package com.drake.net.sample.vm
-
-import androidx.lifecycle.MutableLiveData
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.scopeNetLife
-import com.drake.net.Get
-import com.drake.net.sample.constants.Api
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.coroutineScope
-
-class UserViewModel : ViewModel() {
-
-    // 用户信息
-    var userInfo: MutableLiveData<String> = MutableLiveData()
-
-    /**
-     * 拉取用户信息, 会自动通知页面更新, 同时页面销毁会自动取消网络请求
-     * 其包含作用域, 生命周期跟随当前viewModel
-     * scopeNetLife/scopeDialog不推荐写在ViewModel中
-     */
-    fun fetchUserInfo() = scopeNetLife {
-        userInfo.value = Get<String>(Api.GAME).await()
-    }
-
-    /** 返回Deferred, 可以灵活使用, 支持并发组合 */
-    fun CoroutineScope.fetchList() = Get<String>(Api.TEST)
-
-    /** 直接返回数据, 会阻塞直至数据返回 */
-    suspend fun fetchPrecessData() = coroutineScope {
-        val response = Get<String>(Api.TEST).await()
-        response + "处理数据"
-    }
-}

+ 0 - 9
sample/src/main/res/drawable/bg_card.xml

@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <stroke
-        android:width="2dp"
-        android:color="@color/stroke" />
-    <corners android:radius="4dp" />
-    <solid android:color="@color/white" />
-</shape>

BIN
sample/src/main/res/drawable/bg_empty.webp


BIN
sample/src/main/res/drawable/bg_error.webp


+ 0 - 6
sample/src/main/res/drawable/bg_input.xml

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <corners android:radius="8dp" />
-    <solid android:color="#646464" />
-</shape>

+ 0 - 9
sample/src/main/res/drawable/ic_async_task.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M14,5h8v2h-8zM14,10.5h8v2h-8zM14,16h8v2h-8zM2,11.5C2,15.08 4.92,18 8.5,18L9,18v2l3,-3 -3,-3v2h-0.5C6.02,16 4,13.98 4,11.5S6.02,7 8.5,7L12,7L12,5L8.5,5C4.92,5 2,7.92 2,11.5z" />
-</vector>

+ 0 - 10
sample/src/main/res/drawable/ic_callback_request.xml

@@ -1,10 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24"
-    android:tint="@color/black">
-    <path
-        android:fillColor="@color/black"
-        android:pathData="M3,8.41l9,9l7,-7V15h2V7h-8v2h4.59L12,14.59L4.41,7L3,8.41z" />
-</vector>

+ 0 - 9
sample/src/main/res/drawable/ic_config_dialog.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M18.6,6.62c-1.44,0 -2.8,0.56 -3.77,1.53L12,10.66 10.48,12h0.01L7.8,14.39c-0.64,0.64 -1.49,0.99 -2.4,0.99 -1.87,0 -3.39,-1.51 -3.39,-3.38S3.53,8.62 5.4,8.62c0.91,0 1.76,0.35 2.44,1.03l1.13,1 1.51,-1.34L9.22,8.2C8.2,7.18 6.84,6.62 5.4,6.62 2.42,6.62 0,9.04 0,12s2.42,5.38 5.4,5.38c1.44,0 2.8,-0.56 3.77,-1.53l2.83,-2.5 0.01,0.01L13.52,12h-0.01l2.69,-2.39c0.64,-0.64 1.49,-0.99 2.4,-0.99 1.87,0 3.39,1.51 3.39,3.38s-1.52,3.38 -3.39,3.38c-0.9,0 -1.76,-0.35 -2.44,-1.03l-1.14,-1.01 -1.51,1.34 1.27,1.12c1.02,1.01 2.37,1.57 3.82,1.57 2.98,0 5.4,-2.41 5.4,-5.38s-2.42,-5.37 -5.4,-5.37z" />
-</vector>

+ 0 - 9
sample/src/main/res/drawable/ic_convert.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M22,12l-4,-4v3H3v2h15v3z" />
-</vector>

+ 0 - 11
sample/src/main/res/drawable/ic_debounce.xml

@@ -1,11 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24"
-    android:tint="?attr/colorControlNormal"
-    android:autoMirrored="true">
-  <path
-      android:fillColor="@android:color/white"
-      android:pathData="M9.78,11.16l-1.42,1.42c-0.68,-0.69 -1.34,-1.58 -1.79,-2.94l1.94,-0.49C8.83,10.04 9.28,10.65 9.78,11.16zM11,6L7,2L3,6h3.02C6.04,6.81 6.1,7.54 6.21,8.17l1.94,-0.49C8.08,7.2 8.03,6.63 8.02,6H11zM21,6l-4,-4l-4,4h2.99c-0.1,3.68 -1.28,4.75 -2.54,5.88c-0.5,0.44 -1.01,0.92 -1.45,1.55c-0.34,-0.49 -0.73,-0.88 -1.13,-1.24L9.46,13.6C10.39,14.45 11,15.14 11,17c0,0 0,0 0,0h0v5h2v-5c0,0 0,0 0,0c0,-2.02 0.71,-2.66 1.79,-3.63c1.38,-1.24 3.08,-2.78 3.2,-7.37H21z" />
-</vector>

+ 0 - 9
sample/src/main/res/drawable/ic_download_file.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM17,13l-5,5 -5,-5h3V9h4v4h3z" />
-</vector>

+ 0 - 9
sample/src/main/res/drawable/ic_error_handler.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M11.99,2C6.47,2 2,6.47 2,12s4.47,10 9.99,10S22,17.53 22,12 17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM16.18,7.76l-1.06,1.06 -1.06,-1.06L13,8.82l1.06,1.06L13,10.94 14.06,12l1.06,-1.06L16.18,12l1.06,-1.06 -1.06,-1.06 1.06,-1.06zM7.82,12l1.06,-1.06L9.94,12 11,10.94 9.94,9.88 11,8.82 9.94,7.76 8.88,8.82 7.82,7.76 6.76,8.82l1.06,1.06 -1.06,1.06zM12,14c-2.33,0 -4.31,1.46 -5.11,3.5h10.22c-0.8,-2.04 -2.78,-3.5 -5.11,-3.5z" />
-</vector>

+ 0 - 9
sample/src/main/res/drawable/ic_exception_trace.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M20,8h-2.81c-0.45,-0.78 -1.07,-1.45 -1.82,-1.96L17,4.41 15.59,3l-2.17,2.17C12.96,5.06 12.49,5 12,5c-0.49,0 -0.96,0.06 -1.41,0.17L8.41,3 7,4.41l1.62,1.63C7.88,6.55 7.26,7.22 6.81,8L4,8v2h2.09c-0.05,0.33 -0.09,0.66 -0.09,1v1L4,12v2h2v1c0,0.34 0.04,0.67 0.09,1L4,16v2h2.81c1.04,1.79 2.97,3 5.19,3s4.15,-1.21 5.19,-3L20,18v-2h-2.09c0.05,-0.33 0.09,-0.66 0.09,-1v-1h2v-2h-2v-1c0,-0.34 -0.04,-0.67 -0.09,-1L20,10L20,8zM14,16h-4v-2h4v2zM14,12h-4v-2h4v2z" />
-</vector>

+ 0 - 10
sample/src/main/res/drawable/ic_fastest.xml

@@ -1,10 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24"
-    android:tint="?attr/colorControlNormal">
-    <path
-        android:fillColor="@android:color/white"
-        android:pathData="M7,2v11h3v9l7,-12h-4l4,-8z" />
-</vector>

+ 0 - 10
sample/src/main/res/drawable/ic_https.xml

@@ -1,10 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24"
-    android:tint="@color/black">
-    <path
-        android:fillColor="@color/black"
-        android:pathData="M22,4v-0.5C22,2.12 20.88,1 19.5,1S17,2.12 17,3.5L17,4c-0.55,0 -1,0.45 -1,1v4c0,0.55 0.45,1 1,1h5c0.55,0 1,-0.45 1,-1L23,5c0,-0.55 -0.45,-1 -1,-1zM21.2,4h-3.4v-0.5c0,-0.94 0.76,-1.7 1.7,-1.7s1.7,0.76 1.7,1.7L21.2,4zM18.92,12c0.04,0.33 0.08,0.66 0.08,1 0,2.08 -0.8,3.97 -2.1,5.39 -0.26,-0.81 -1,-1.39 -1.9,-1.39h-1v-3c0,-0.55 -0.45,-1 -1,-1L7,13v-2h2c0.55,0 1,-0.45 1,-1L10,8h2c1.1,0 2,-0.9 2,-2L14,3.46c-0.95,-0.3 -1.95,-0.46 -3,-0.46C5.48,3 1,7.48 1,13s4.48,10 10,10 10,-4.48 10,-10c0,-0.34 -0.02,-0.67 -0.05,-1h-2.03zM10,20.93c-3.95,-0.49 -7,-3.85 -7,-7.93 0,-0.62 0.08,-1.21 0.21,-1.79L8,16v1c0,1.1 0.9,2 2,2v1.93z" />
-</vector>

+ 0 - 9
sample/src/main/res/drawable/ic_interceptor.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M3,8.41l9,9 7,-7V15h2V7h-8v2h4.59L12,14.59 4.41,7 3,8.41z" />
-</vector>

+ 0 - 9
sample/src/main/res/drawable/ic_interval.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M22,5.72l-4.6,-3.86 -1.29,1.53 4.6,3.86L22,5.72zM7.88,3.39L6.6,1.86 2,5.71l1.29,1.53 4.59,-3.85zM12.5,8L11,8v6l4.75,2.85 0.75,-1.23 -4,-2.37L12.5,8zM12,4c-4.97,0 -9,4.03 -9,9s4.02,9 9,9c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9zM12,20c-3.87,0 -7,-3.13 -7,-7s3.13,-7 7,-7 7,3.13 7,7 -3.13,7 -7,7z" />
-</vector>

+ 0 - 9
sample/src/main/res/drawable/ic_menu.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M3,18h18v-2L3,16v2zM3,13h18v-2L3,11v2zM3,6v2h18L21,6L3,6z" />
-</vector>

+ 0 - 9
sample/src/main/res/drawable/ic_parallel_network.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M17,20.41L18.41,19 15,15.59 13.59,17 17,20.41zM7.5,8H11v5.59L5.59,19 7,20.41l6,-6V8h3.5L12,3.5 7.5,8z" />
-</vector>

+ 0 - 12
sample/src/main/res/drawable/ic_preview_cache.xml

@@ -1,12 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="14dp"
-    android:height="16dp"
-    android:viewportWidth="14"
-    android:viewportHeight="16">
-  <path
-      android:pathData="M0.4121,11.2265C0.4121,11.8077 0.562,12.2464 0.8619,12.5425C1.1618,12.8387 1.6059,12.9868 2.1942,12.9868L8.5641,12.9868C9.1559,12.9868 9.6009,12.8387 9.899,12.5425C10.1971,12.2464 10.3461,11.8077 10.3461,11.2265L10.3461,5.8619C10.3461,5.2803 10.1971,4.8414 9.899,4.5453C9.6009,4.2491 9.1559,4.101 8.5641,4.101L5.86,4.101L5.86,1.4599C5.86,1.3364 5.8125,1.2278 5.7177,1.1339C5.6228,1.04 5.511,0.9931 5.382,0.9931C5.2493,0.9931 5.1364,1.04 5.0433,1.1339C4.9501,1.2278 4.9036,1.3364 4.9036,1.4599L4.9036,4.101L2.1942,4.101C1.6059,4.101 1.1618,4.2482 0.8619,4.5426C0.562,4.837 0.4121,5.2768 0.4121,5.8619L0.4121,11.2265ZM5.382,9.4228C5.3178,9.4228 5.2571,9.4109 5.1999,9.3872C5.1427,9.3634 5.0839,9.3216 5.0236,9.2616L3.1554,7.459C3.0641,7.3674 3.0185,7.265 3.0185,7.152C3.0185,7.0304 3.0591,6.93 3.1403,6.8507C3.2215,6.7714 3.3236,6.7318 3.4464,6.7318C3.5797,6.7318 3.6888,6.7799 3.7737,6.8762L4.6741,7.8275L4.9427,8.1369L4.9036,7.3083L4.9036,4.5017C4.9036,4.3708 4.9475,4.2621 5.0353,4.1754C5.1231,4.0888 5.2387,4.0455 5.382,4.0455C5.5215,4.0455 5.636,4.0888 5.7256,4.1754C5.8152,4.2621 5.86,4.3708 5.86,4.5017L5.86,7.3083L5.8209,8.1369L6.0842,7.8275L6.9846,6.8762C7.0695,6.7799 7.1766,6.7318 7.306,6.7318C7.4293,6.7318 7.5323,6.7714 7.6153,6.8507C7.6982,6.93 7.7397,7.0304 7.7397,7.152C7.7397,7.265 7.6941,7.3674 7.6029,7.459L5.7399,9.2616C5.6761,9.3216 5.6156,9.3634 5.5584,9.3872C5.5012,9.4109 5.4424,9.4228 5.382,9.4228ZM5.4655,15.6064L11.3723,15.6064C11.961,15.6064 12.4043,15.4583 12.7022,15.1621C13.0002,14.866 13.1491,14.4254 13.1491,13.8402L13.1491,8.2741C13.1491,7.6904 13.0007,7.2513 12.7039,6.9567C12.4072,6.6621 11.9657,6.5143 11.3797,6.5132L11.1297,6.5132L11.1297,11.3011C11.1297,11.8366 11.035,12.2881 10.8454,12.6557C10.6559,13.0233 10.3755,13.3009 10.0042,13.4887C9.6329,13.6765 9.1778,13.7704 8.6388,13.7704L3.6829,13.7704L3.6829,13.8233C3.6844,14.4082 3.8305,14.8517 4.1211,15.1535C4.4118,15.4554 4.86,15.6064 5.4655,15.6064Z"
-      android:strokeWidth="1"
-      android:fillColor="#000000"
-      android:fillType="nonZero"
-      android:strokeColor="#00000000" />
-</vector>

+ 0 - 9
sample/src/main/res/drawable/ic_pull_refresh.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M6,7h2.5L5,3.5 1.5,7L4,7v10L1.5,17L5,20.5 8.5,17L6,17L6,7zM10,5v2h12L22,5L10,5zM10,19h12v-2L10,17v2zM10,13h12v-2L10,11v2z" />
-</vector>

+ 0 - 9
sample/src/main/res/drawable/ic_push_refresh.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M15.55,5.55L11,1v3.07C7.06,4.56 4,7.92 4,12s3.05,7.44 7,7.93v-2.02c-2.84,-0.48 -5,-2.94 -5,-5.91s2.16,-5.43 5,-5.91L11,10l4.55,-4.45zM19.93,11c-0.17,-1.39 -0.72,-2.73 -1.62,-3.89l-1.42,1.42c0.54,0.75 0.88,1.6 1.02,2.47h2.02zM13,17.9v2.02c1.39,-0.17 2.74,-0.71 3.9,-1.61l-1.44,-1.44c-0.75,0.54 -1.59,0.89 -2.46,1.03zM16.89,15.48l1.42,1.41c0.9,-1.16 1.45,-2.5 1.62,-3.89h-2.02c-0.14,0.87 -0.48,1.72 -1.02,2.48z" />
-</vector>

+ 0 - 9
sample/src/main/res/drawable/ic_read_cache.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M20.54,5.23l-1.39,-1.68C18.88,3.21 18.47,3 18,3H6c-0.47,0 -0.88,0.21 -1.16,0.55L3.46,5.23C3.17,5.57 3,6.02 3,6.5V19c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V6.5c0,-0.48 -0.17,-0.93 -0.46,-1.27zM12,17.5L6.5,12H10v-2h4v2h3.5L12,17.5zM5.12,5l0.81,-1h12l0.94,1H5.12z" />
-</vector>

+ 0 - 9
sample/src/main/res/drawable/ic_request_method.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM19,18H6c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4h0.71C7.37,7.69 9.48,6 12,6c3.04,0 5.5,2.46 5.5,5.5v0.5H19c1.66,0 3,1.34 3,3s-1.34,3 -3,3z" />
-</vector>

+ 0 - 9
sample/src/main/res/drawable/ic_scope.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M21,3.01H3c-1.1,0 -2,0.9 -2,2V9h2V4.99h18v14.03H3V15H1v4.01c0,1.1 0.9,1.98 2,1.98h18c1.1,0 2,-0.88 2,-1.98v-14c0,-1.11 -0.9,-2 -2,-2zM11,16l4,-4 -4,-4v3H1v2h10v3z" />
-</vector>

+ 0 - 9
sample/src/main/res/drawable/ic_state_layout.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M14,2L6,2c-1.1,0 -1.99,0.9 -1.99,2L4,20c0,1.1 0.89,2 1.99,2L18,22c1.1,0 2,-0.9 2,-2L20,8l-6,-6zM12,18c-2.05,0 -3.81,-1.24 -4.58,-3h1.71c0.63,0.9 1.68,1.5 2.87,1.5 1.93,0 3.5,-1.57 3.5,-3.5S13.93,9.5 12,9.5c-1.35,0 -2.52,0.78 -3.1,1.9l1.6,1.6h-4L6.5,9l1.3,1.3C8.69,8.92 10.23,8 12,8c2.76,0 5,2.24 5,5s-2.24,5 -5,5z" />
-</vector>

+ 0 - 9
sample/src/main/res/drawable/ic_switch_dispatcher.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M10.59,9.17L5.41,4 4,5.41l5.17,5.17 1.42,-1.41zM14.5,4l2.04,2.04L4,18.59 5.41,20 17.96,7.46 20,9.5L20,4h-5.5zM14.83,13.41l-1.41,1.41 3.13,3.13L14.5,20L20,20v-5.5l-2.04,2.04 -3.13,-3.13z" />
-</vector>

+ 0 - 10
sample/src/main/res/drawable/ic_sync_request.xml

@@ -1,10 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24"
-    android:tint="@color/black">
-    <path
-        android:fillColor="@color/black"
-        android:pathData="M20,5.41L18.59,4 7,15.59V9H5v10h10v-2H8.41z" />
-</vector>

+ 0 - 10
sample/src/main/res/drawable/ic_unique.xml

@@ -1,10 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24"
-    android:tint="?attr/colorControlNormal">
-    <path
-        android:fillColor="@android:color/white"
-        android:pathData="M19,13H5v-2h14v2z" />
-</vector>

+ 0 - 9
sample/src/main/res/drawable/ic_upload_file.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM14,13v4h-4v-4H7l5,-5 5,5h-3z" />
-</vector>

+ 0 - 10
sample/src/main/res/drawable/ic_view_model.xml

@@ -1,10 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:tint="@color/black"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path
-        android:fillColor="@color/black"
-        android:pathData="M13,2.05v3.03c3.39,0.49 6,3.39 6,6.92 0,0.9 -0.18,1.75 -0.48,2.54l2.6,1.53c0.56,-1.24 0.88,-2.62 0.88,-4.07 0,-5.18 -3.95,-9.45 -9,-9.95zM12,19c-3.87,0 -7,-3.13 -7,-7 0,-3.53 2.61,-6.43 6,-6.92V2.05c-5.06,0.5 -9,4.76 -9,9.95 0,5.52 4.47,10 9.99,10 3.31,0 6.24,-1.61 8.06,-4.09l-2.6,-1.53C16.17,17.98 14.21,19 12,19z" />
-</vector>

+ 33 - 38
sample/src/main/res/layout/activity_main.xml

@@ -1,46 +1,41 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <layout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto">
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools">
 
 
-    <androidx.drawerlayout.widget.DrawerLayout
-        android:id="@+id/drawer"
+    <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        tools:context=".ui.fragment.DownloadFileFragment">
 
-
-        <LinearLayout
+        <SeekBar
+            android:id="@+id/seek"
             android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:orientation="vertical">
-
-            <androidx.appcompat.widget.Toolbar
-                android:id="@+id/toolbar"
-                android:background="@color/background"
-                app:navigationIcon="@drawable/ic_menu"
-                app:subtitleTextAppearance="@style/ToolbarSubtitle"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content" />
-
-            <fragment
-                android:id="@+id/nav"
-                android:name="androidx.navigation.fragment.NavHostFragment"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                app:defaultNavHost="false"
-                app:navGraph="@navigation/nav_main" />
-
-        </LinearLayout>
-
-        <com.google.android.material.navigation.NavigationView
-            android:id="@+id/drawerNav"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_gravity="start"
-            app:headerLayout="@layout/layout_drawer_nav_header"
-            app:menu="@menu/menu_main" />
-
-    </androidx.drawerlayout.widget.DrawerLayout>
-</layout>
-
+            android:layout_height="wrap_content"
+            android:layout_margin="16dp"
+            android:gravity="center"
+            android:text="等待下载完成"
+            android:textSize="18dp"
+            android:textStyle="bold"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintVertical_bias="0.5" />
+
+        <TextView
+            android:id="@+id/tvProgress"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="16dp"
+            android:layout_marginHorizontal="16dp"
+            android:textSize="12dp"
+            app:layout_constraintLeft_toLeftOf="@id/seek"
+            app:layout_constraintRight_toRightOf="@id/seek"
+            app:layout_constraintTop_toBottomOf="@id/seek"
+            tools:text="下载进度: 90%" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</layout>

+ 0 - 21
sample/src/main/res/layout/fragment_async_task.xml

@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
-
-
-    <FrameLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        tools:context=".ui.fragment.AsyncTaskFragment">
-
-        <TextView
-            android:id="@+id/tvFragment"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:gravity="center"
-            android:textStyle="bold"
-            android:text="等待2秒" />
-
-    </FrameLayout>
-</layout>

+ 0 - 22
sample/src/main/res/layout/fragment_auto_dialog.xml

@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
-
-
-    <FrameLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        tools:context=".ui.fragment.AutoDialogFragment">
-
-        <TextView
-            android:id="@+id/tvFragment"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:layout_margin="16dp"
-            android:gravity="center"
-            android:text="等待数据中"
-            android:textStyle="bold" />
-
-    </FrameLayout>
-</layout>

+ 0 - 20
sample/src/main/res/layout/fragment_callback_request.xml

@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
-
-
-    <FrameLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        tools:context=".ui.fragment.CallbackRequestFragment">
-
-        <TextView
-            android:id="@+id/tvFragment"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:gravity="center"
-            android:textStyle="bold"
-            android:text="等待2秒" />
-
-    </FrameLayout>
-</layout>

+ 0 - 21
sample/src/main/res/layout/fragment_coroutine_scope.xml

@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
-
-
-    <FrameLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        tools:context=".ui.fragment.CoroutineScopeFragment">
-
-        <TextView
-            android:id="@+id/tvFragment"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:gravity="center"
-            android:textStyle="bold"
-            android:text="等待2秒" />
-
-    </FrameLayout>
-</layout>

+ 0 - 31
sample/src/main/res/layout/fragment_custom_convert.xml

@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
-
-
-    <FrameLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        tools:context=".ui.fragment.converter.GsonConvertFragment">
-
-        <TextView
-            android:id="@+id/tvConvertTip"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:gravity="center_vertical"
-            android:minHeight="50dp"
-            android:paddingHorizontal="20dp"
-            android:textSize="12dp"
-            tools:text="推荐, kotlinx.serialization支持任何泛型, 可直接返回Map/List/Pair..." />
-
-        <TextView
-            android:id="@+id/tvFragment"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:gravity="center"
-            android:text="等待请求完成"
-            android:textStyle="bold" />
-
-    </FrameLayout>
-</layout>

+ 0 - 41
sample/src/main/res/layout/fragment_download_file.xml

@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools">
-
-
-    <androidx.constraintlayout.widget.ConstraintLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        tools:context=".ui.fragment.DownloadFileFragment">
-
-        <SeekBar
-            android:id="@+id/seek"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_margin="16dp"
-            android:gravity="center"
-            android:text="等待下载完成"
-            android:textSize="18dp"
-            android:textStyle="bold"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintLeft_toLeftOf="parent"
-            app:layout_constraintRight_toRightOf="parent"
-            app:layout_constraintTop_toTopOf="parent"
-            app:layout_constraintVertical_bias="0.5" />
-
-        <TextView
-            android:id="@+id/tvProgress"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="16dp"
-            android:layout_marginHorizontal="16dp"
-            android:textSize="12dp"
-            app:layout_constraintLeft_toLeftOf="@id/seek"
-            app:layout_constraintRight_toRightOf="@id/seek"
-            app:layout_constraintTop_toBottomOf="@id/seek"
-            tools:text="下载进度: 90%" />
-
-    </androidx.constraintlayout.widget.ConstraintLayout>
-</layout>

+ 0 - 29
sample/src/main/res/layout/fragment_edit_debounce.xml

@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
-
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:orientation="vertical"
-        tools:context=".ui.fragment.EditDebounceFragment">
-
-        <EditText
-            android:id="@+id/etInput"
-            android:layout_width="match_parent"
-            android:layout_height="50dp"
-            android:layout_marginHorizontal="32dp"
-            android:layout_marginTop="20dp"
-            android:hint="输入内容将自动查询当前时间" />
-
-
-        <TextView
-            android:id="@+id/tvFragment"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:layout_margin="32dp"
-            android:textStyle="bold" />
-
-    </LinearLayout>
-</layout>

+ 0 - 21
sample/src/main/res/layout/fragment_error_handler.xml

@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
-
-
-    <FrameLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        tools:context=".ui.fragment.ErrorHandlerFragment">
-
-        <TextView
-            android:id="@+id/tvFragment"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:gravity="center"
-            android:textStyle="bold"
-            android:text="LogCat查看请求返回的错误信息" />
-
-    </FrameLayout>
-</layout>

+ 0 - 21
sample/src/main/res/layout/fragment_exception_trace.xml

@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
-
-
-    <FrameLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        tools:context=".ui.fragment.ExceptionTraceFragment">
-
-        <TextView
-            android:id="@+id/tvFragment"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:gravity="center"
-            android:textStyle="bold"
-            android:text="查看控制台" />
-
-    </FrameLayout>
-</layout>

+ 0 - 21
sample/src/main/res/layout/fragment_fastest.xml

@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
-
-
-    <FrameLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        tools:context=".ui.fragment.FastestFragment">
-
-        <TextView
-            android:id="@+id/tvFragment"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:gravity="center"
-            android:textStyle="bold"
-            android:text="请求结果显示" />
-
-    </FrameLayout>
-</layout>

+ 0 - 37
sample/src/main/res/layout/fragment_https_certificate.xml

@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
-
-
-    <androidx.appcompat.widget.LinearLayoutCompat
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:gravity="center"
-        android:orientation="vertical"
-        tools:context=".ui.fragment.HttpsCertificateFragment">
-
-        <Button
-            android:id="@+id/btn_trust_certificate"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="信任所有证书" />
-
-        <Button
-            android:id="@+id/btn_import_certificate"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="导入证书" />
-
-        <TextView
-            android:id="@+id/tvResponse"
-            android:scrollbars="vertical"
-            android:layout_width="match_parent"
-            android:layout_height="400dp"
-            android:layout_marginHorizontal="20dp"
-            android:layout_marginTop="20dp"
-            android:maxLines="300"
-            android:background="@color/divider"
-            android:padding="8dp" />
-
-    </androidx.appcompat.widget.LinearLayoutCompat>
-</layout>

+ 0 - 21
sample/src/main/res/layout/fragment_interceptor.xml

@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
-
-
-    <FrameLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        tools:context=".ui.fragment.InterceptorFragment">
-
-        <TextView
-            android:id="@+id/tvFragment"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:gravity="center"
-            android:textStyle="bold"
-            android:text="拦截器仅支持全局" />
-
-    </FrameLayout>
-</layout>

+ 0 - 27
sample/src/main/res/layout/fragment_limited_time.xml

@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
-
-    <data>
-
-        <variable
-            name="v"
-            type="com.drake.net.sample.ui.fragment.LimitedTimeFragment" />
-
-    </data>
-
-    <FrameLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        tools:context=".ui.fragment.LimitedTimeFragment">
-
-        <Button
-            click="@{v}"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center"
-            android:text="开始请求" />
-
-    </FrameLayout>
-</layout>

+ 0 - 21
sample/src/main/res/layout/fragment_parallel_network.xml

@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
-
-
-    <FrameLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        tools:context=".ui.fragment.ParallelNetworkFragment">
-
-        <TextView
-            android:id="@+id/tvFragment"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:gravity="center"
-            android:textStyle="bold"
-            android:text="查看Demo源码" />
-
-    </FrameLayout>
-</layout>

+ 0 - 19
sample/src/main/res/layout/fragment_pull_refresh.xml

@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
-
-
-    <com.drake.brv.PageRefreshLayout
-        android:id="@+id/page"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        tools:context=".ui.fragment.PullRefreshFragment">
-
-        <androidx.recyclerview.widget.RecyclerView
-            android:id="@+id/rv"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent" />
-
-    </com.drake.brv.PageRefreshLayout>
-</layout>

+ 0 - 21
sample/src/main/res/layout/fragment_push_refresh.xml

@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    xmlns:app="http://schemas.android.com/apk/res-auto">
-
-
-    <com.drake.brv.PageRefreshLayout
-        android:id="@+id/page"
-        android:layout_width="match_parent"
-        app:srlEnableLoadMore="false"
-        android:layout_height="match_parent"
-        tools:context=".ui.fragment.PushRefreshFragment">
-
-        <androidx.recyclerview.widget.RecyclerView
-            android:id="@+id/rv"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent" />
-
-    </com.drake.brv.PageRefreshLayout>
-</layout>

Some files were not shown because too many files changed in this diff