GlobaExt.kt 15 KB

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