GlobaExt.kt 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  1. package com.develop.base.ext
  2. import android.Manifest
  3. import android.R
  4. import android.app.Application
  5. import android.content.Context
  6. import android.content.pm.PackageManager
  7. import android.content.res.Resources
  8. import android.graphics.Bitmap
  9. import android.graphics.BitmapFactory
  10. import android.graphics.drawable.Drawable
  11. import android.net.wifi.WifiInfo
  12. import android.net.wifi.WifiManager
  13. import android.os.Build
  14. import android.text.TextUtils
  15. import android.util.Patterns
  16. import android.util.TypedValue
  17. import android.widget.ImageView
  18. import androidx.annotation.DimenRes
  19. import androidx.core.app.ActivityCompat
  20. import androidx.core.content.ContextCompat
  21. import com.bumptech.glide.Glide
  22. import com.bumptech.glide.load.engine.DiskCacheStrategy
  23. import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
  24. import com.develop.base.BuildConfig
  25. import com.develop.base.app.BaseApp
  26. import com.develop.base.util.MMkvUtils
  27. import kotlinx.serialization.decodeFromString
  28. import kotlinx.serialization.encodeToString
  29. import kotlinx.serialization.json.Json
  30. import okhttp3.MediaType.Companion.toMediaTypeOrNull
  31. import okhttp3.MultipartBody
  32. import okhttp3.RequestBody
  33. import okhttp3.RequestBody.Companion.toRequestBody
  34. import java.io.ByteArrayOutputStream
  35. import java.io.File
  36. import java.io.IOException
  37. import java.io.InputStream
  38. import java.net.URI
  39. import java.text.SimpleDateFormat
  40. import java.util.*
  41. import java.util.regex.Pattern
  42. fun globalApp(): Application = BaseApp.application
  43. fun globalRes(): Resources = globalApp().resources
  44. // ------------------------------Any扩展-------------------------------------
  45. fun Any.toJson(): String = Json.encodeToString(this)
  46. fun Any.dimenRes(@DimenRes res: Int): Int {
  47. return globalApp().resources.getDimensionPixelSize(res)
  48. }
  49. // ------------------------------String扩展-------------------------------------
  50. fun String.fromJson(): Any = Json.decodeFromString(this)
  51. fun String.getHost(): String {
  52. var hostUrl = this
  53. if (!(hostUrl.startsWith("http://") || hostUrl.startsWith("https://"))) {
  54. hostUrl = "http://$this"
  55. }
  56. var returnVal = ""
  57. try {
  58. val uri = URI(hostUrl)
  59. returnVal = uri.host
  60. } catch (e: Exception) {
  61. }
  62. if (returnVal.endsWith(".html") || returnVal.endsWith(".htm")) {
  63. returnVal = ""
  64. }
  65. return "http://$returnVal"
  66. }
  67. fun String.isHttpUrl(): Boolean = Patterns.WEB_URL.matcher(this).matches()
  68. fun String.assetsUri2Bitmap(): Bitmap? {
  69. val path = this
  70. var image: Bitmap? = null
  71. val am = globalApp().resources.assets
  72. try {
  73. val stream: InputStream = am.open(path)
  74. image = BitmapFactory.decodeStream(stream)
  75. stream.close()
  76. } catch (e: IOException) {
  77. e.printStackTrace()
  78. }
  79. return image
  80. }
  81. fun String.jsonSpiltField(fieldName: String): String {
  82. if (fieldName.isEmpty()) {
  83. return ""
  84. }
  85. val regex = "(?<=(\"$fieldName\":\")).*?(?=(\"))"
  86. val pattern = Pattern.compile(regex)
  87. val matcher = pattern.matcher(this)
  88. while (matcher.find()) {
  89. if (!TextUtils.isEmpty(matcher.group().trim { it <= ' ' })) {
  90. return matcher.group().trim { it <= ' ' }
  91. }
  92. }
  93. return ""
  94. }
  95. fun String.createFolder() {
  96. val file = File(this)
  97. if (!file.exists()) {
  98. file.mkdirs()
  99. }
  100. }
  101. fun String.deleteFile(): Boolean {
  102. val file = File(this)
  103. if (!file.exists()) {
  104. return false
  105. }
  106. return file.delete()
  107. }
  108. fun timeStamp2Time(timeSeconds: Long, format: String = "yyyy/MM/dd HH:mm"): String? {
  109. val date = Date(timeSeconds * 1000)
  110. return SimpleDateFormat(format, Locale.getDefault()).format(date)
  111. }
  112. fun String.toCacheFolder(): String = globalApp().externalCacheDir.toString() + "/" + this
  113. // ------------------------------Int扩展-------------------------------------
  114. fun Int.resId2Drawable(): Drawable? = ContextCompat.getDrawable(globalApp(), this)
  115. fun Int.resId2Dimension(): Float = BaseApp.application.resources.getDimension(this)
  116. // ------------------------------RequestBody扩展-------------------------------------
  117. fun Map<String, String>.genMultipartBody(): RequestBody {
  118. val builder = MultipartBody.Builder()
  119. builder.setType(MultipartBody.FORM)//表单类型
  120. this.forEach {
  121. builder.addFormDataPart(it.key, it.value)
  122. }
  123. return builder.build()
  124. }
  125. fun Map<String, String>.genRequestBody(): Map<String, RequestBody> {
  126. val requestBodyMap: MutableMap<String, RequestBody> = HashMap()
  127. for (key in this.keys) {
  128. val requestBody: RequestBody =
  129. (if (this[key] == null) "" else this[key] ?: ""
  130. ).toRequestBody("text/plain".toMediaTypeOrNull())
  131. requestBodyMap[key] = requestBody
  132. }
  133. return requestBodyMap
  134. }
  135. fun GlobalApp(): Application {
  136. return BaseApp.application
  137. }
  138. fun getWifiMacAddress(context: Context): String {
  139. // 检查是否具有读取Wi-Fi状态的权限
  140. if (ActivityCompat.checkSelfPermission(
  141. context,
  142. Manifest.permission.ACCESS_WIFI_STATE
  143. ) != PackageManager.PERMISSION_GRANTED
  144. ) {
  145. // 无权限,请求权限
  146. // 这里需要您自行实现权限请求的逻辑
  147. return ""
  148. }
  149. val wifiManager =
  150. context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
  151. val wifiInfo: WifiInfo? = wifiManager.connectionInfo
  152. return if (wifiInfo != null) wifiInfo.macAddress else ""
  153. }
  154. /**
  155. * 获取SN
  156. * @return
  157. */
  158. fun getBrandNum(): String {
  159. return getSN().substring(0, 3)
  160. }
  161. /**
  162. * 获取SN 设备型号
  163. * @return
  164. */
  165. fun getDeviceNum(): String {
  166. return getSN().substring(0, 4)
  167. }
  168. /**
  169. * 获取模式
  170. * @return
  171. */
  172. fun getModelNum(): String {
  173. if (getSN().length < 9) {
  174. return "1039"
  175. }
  176. return getSN().substring(4, 8)
  177. }
  178. /**
  179. * 获取SN
  180. * @return
  181. */
  182. fun getSN(): String {
  183. var serial: String
  184. // //由于063 需要写死SN 估在这加
  185. // return "063A21050020123010190001"
  186. // return "011A10390020123010190001"
  187. //正式调试
  188. // return "011E50370020123010190001"
  189. // return "033H20020020123010190001"
  190. // return "032D21060020123010190001"
  191. if (BuildConfig.DEBUG) {
  192. // return "002D10390020123010190001"
  193. // return "045A21030020123010190001"
  194. // return "045A50370020123010190001"
  195. // return "000A30150020123010190001"
  196. // return "000A10390020123010170001"
  197. // return "000A10390020123010190001"
  198. // return "000B50370020123010190001"
  199. // return "000B10390020123010190001"
  200. // return "025A10390020123010190001"
  201. // return "054A50370020123010190001"
  202. // return "054A10390020123010190001"
  203. // return "010D10390020123010190001"
  204. // return "010F10390020123010190001"
  205. // return "011D10390020123010190001"
  206. // return "011A10390020123010190001"
  207. // return "011F10390020123010190001"
  208. // return "011A10390020123010190009"
  209. // return "000A50370020123010190004"
  210. // return "011A50370020123010190003"
  211. // return "011A50370020123010190006"
  212. // return "011E50370020123010190001"
  213. // return "007D20020020123010190001"
  214. // return "036I21060020123010190007"
  215. // return "030A10390020123010190004"
  216. // return "017A20060020123010190001"
  217. // return "017A10390020123010190001"
  218. // return "010D10390020123010190001"
  219. // return "010D10390020123010190001"
  220. // return "000A10390020123010190009"
  221. // return "032E21060020123010190001"
  222. // return "032D21060020123010190001"
  223. // return "000A50370020123010190011"
  224. // return "030A10390020123010190002"
  225. // return "033F20020020123010190001"
  226. // return "033I20020020123010190001"
  227. return "033G20020020123010190001"
  228. // return "014A19050020123010190002"
  229. // return "029C21010020123010190002"
  230. // return "029C21010030424071900612"
  231. // return "029C10390020123010190001"
  232. // return "062A10390020123010190001"
  233. // return "062A20030020123010190001"
  234. // return "062A20030020123010190003"
  235. // return "062A20030020123010190004"
  236. // return "063A10390020123010190015"
  237. // return "063B10390020123010190002"
  238. // return "063B10390020123010190001"
  239. // return "063B20030020123010190015"
  240. // return "063B21050020123010190001"
  241. // return "049B10390020123010190001"
  242. // return "000A50370020123010190017"
  243. // return "053A10390020123010190088"
  244. // return "053A103 90020123010190001"
  245. // return "000A10390020123010190023"
  246. // return "000A21050020123010190023"
  247. // return "000A50670020123010190005"
  248. // return "033H19050020123010190001"
  249. // return "077A10390020123010190023"
  250. } else {
  251. //通过反射获取sn号
  252. try {
  253. val c = Class.forName("android.os.SystemProperties")
  254. val get = c.getMethod("get", String::class.java)
  255. serial = get.invoke(c, "ro.serialno") as String
  256. if (serial != "" && serial != "unknown") return serial
  257. //9.0及以上无法获取到sn,此方法为补充,能够获取到多数高版本手机 sn
  258. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) serial = Build.getSerial()
  259. } catch (e: java.lang.Exception) {
  260. serial = "unknown"
  261. }
  262. return serial
  263. }
  264. }
  265. fun getGoneLogin(): Boolean {
  266. var sn = getSN()
  267. return sn.startsWith("032D") || sn.startsWith("032E") || sn.startsWith("011")
  268. || sn.startsWith("030A") || sn.startsWith("010F")
  269. || sn.startsWith("033")
  270. }
  271. fun getGoneTuYa(): Boolean {
  272. var sn = getSN()
  273. return sn.startsWith("010D") || sn.startsWith("010I")
  274. || sn.startsWith("010F") || sn.startsWith("010H")
  275. || sn.startsWith("032D") || sn.startsWith("033")
  276. || sn.startsWith("011") || sn.startsWith("036I")
  277. // || sn.startsWith("053A")
  278. || sn.startsWith("058A") || sn.startsWith("058B")
  279. }
  280. fun getCobotmix(): Boolean {
  281. //由于客户有自己软件,估不能进去到涂鸦页面显示SN号,估在这做多判断
  282. var sn = getSN()
  283. return sn.startsWith("062") || sn.startsWith("029C")
  284. || sn.startsWith("063B")
  285. }
  286. fun getSNUrl(): String {
  287. return "https://icook.cofarcn.com/ext/devInfo?sn=" + getSN()
  288. }
  289. fun ImageView.load(data: Any?) {
  290. Glide.with(this.context).load(data)
  291. .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
  292. .into(this)
  293. }
  294. fun ImageView.loadGif(data: Int) {
  295. Glide.with(this.context)
  296. .asGif().load(data)
  297. .diskCacheStrategy(DiskCacheStrategy.DATA)
  298. .override(240, 200)
  299. .into(this)
  300. }
  301. fun ImageView.load(data: Any?, width: Int, height: Int) {
  302. Glide.with(this.context)
  303. .asDrawable()
  304. .load(data)
  305. .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
  306. .skipMemoryCache(false)
  307. .override(width, height)
  308. .dontAnimate()
  309. .into(this)
  310. }
  311. fun ImageView.load(data: Any?, error: Int) {
  312. Glide.with(this.context).load(data)
  313. .error(error)
  314. .transition(DrawableTransitionOptions.withCrossFade())
  315. .into(this)
  316. }
  317. fun isScreenWidth(): Int {
  318. return MMkvUtils.getInt("screen_width", 0)
  319. }
  320. fun isScreenHeight(): Int {
  321. return MMkvUtils.getInt("screen_height", 0)
  322. }
  323. fun setScreenWidth(width: Int) {
  324. MMkvUtils.save("screen_width", width)
  325. }
  326. fun setScreenHeight(height: Int) {
  327. MMkvUtils.save("screen_height", height)
  328. }
  329. fun setAppCode(code: String) {
  330. MMkvUtils.save("appCode", code)
  331. }
  332. fun getAppCode(): String {
  333. return MMkvUtils.getString("appCode") ?: "1.01"
  334. }
  335. fun isNightTheme(): Boolean {
  336. return MMkvUtils.getBool("nightTheme", false)
  337. }
  338. fun isFrLanguage(): Boolean {
  339. return MMkvUtils.getString("CURRENT_LANGUAGE") == "FR"
  340. }
  341. fun setNightTheme(isNight: Boolean) {
  342. MMkvUtils.save("nightTheme", isNight)
  343. }
  344. fun setIsBrand036I(is036I: Boolean) {
  345. MMkvUtils.save("is036I", is036I)
  346. }
  347. fun isBrand036I(): Boolean {
  348. return MMkvUtils.getBool("is036I", false)
  349. }
  350. fun setIsBrand011A(is011A: Boolean) {
  351. MMkvUtils.save("is011A", is011A)
  352. }
  353. fun isBrand011A(): Boolean {
  354. return MMkvUtils.getBool("is011A", false)
  355. }
  356. fun setRecipesList(recipesList: String) {
  357. MMkvUtils.save("recipesList", recipesList)
  358. }
  359. fun isRecipesList(): String {
  360. return MMkvUtils.getString("recipesList") ?: ""
  361. }
  362. fun setIsBrand054A(is054A: Boolean) {
  363. MMkvUtils.save("is054A", is054A)
  364. }
  365. fun isBrand054A(): Boolean {
  366. return MMkvUtils.getBool("is054A", false)
  367. }
  368. fun setIsBrand062(is054A: Boolean) {
  369. MMkvUtils.save("is062", is054A)
  370. }
  371. fun setOtaFileMd5(code: String) {
  372. MMkvUtils.save("isOtaZipMd5", code)
  373. }
  374. fun getOtaFileMd5(): String {
  375. return MMkvUtils.getString("isOtaZipMd5") ?: ""
  376. }
  377. fun setUpdateRecipeTime(time: String) {
  378. MMkvUtils.save("isUpdateTime", time)
  379. }
  380. fun getUpdateRecipeTime(): String {
  381. return MMkvUtils.getString("isUpdateTime") ?: ""
  382. }
  383. fun isBrand062(): Boolean {
  384. return MMkvUtils.getBool("is062", false)
  385. }