package com.develop.base.ext import android.Manifest import android.R import android.app.Application import android.content.Context import android.content.pm.PackageManager import android.content.res.Resources import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.drawable.Drawable import android.net.wifi.WifiInfo import android.net.wifi.WifiManager import android.os.Build import android.text.TextUtils import android.util.Patterns import android.util.TypedValue import android.widget.ImageView import androidx.annotation.DimenRes import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import com.bumptech.glide.Glide import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions import com.develop.base.BuildConfig import com.develop.base.app.BaseApp import com.develop.base.util.MMkvUtils import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody import okhttp3.RequestBody import okhttp3.RequestBody.Companion.toRequestBody import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream import java.net.URI import java.text.SimpleDateFormat import java.util.* import java.util.regex.Pattern fun globalApp(): Application = BaseApp.application fun globalRes(): Resources = globalApp().resources // ------------------------------Any扩展------------------------------------- fun Any.toJson(): String = Json.encodeToString(this) fun Any.dimenRes(@DimenRes res: Int): Int { return globalApp().resources.getDimensionPixelSize(res) } // ------------------------------String扩展------------------------------------- fun String.fromJson(): Any = Json.decodeFromString(this) fun String.getHost(): String { var hostUrl = this if (!(hostUrl.startsWith("http://") || hostUrl.startsWith("https://"))) { hostUrl = "http://$this" } var returnVal = "" try { val uri = URI(hostUrl) returnVal = uri.host } catch (e: Exception) { } if (returnVal.endsWith(".html") || returnVal.endsWith(".htm")) { returnVal = "" } return "http://$returnVal" } fun String.isHttpUrl(): Boolean = Patterns.WEB_URL.matcher(this).matches() fun String.assetsUri2Bitmap(): Bitmap? { val path = this var image: Bitmap? = null val am = globalApp().resources.assets try { val stream: InputStream = am.open(path) image = BitmapFactory.decodeStream(stream) stream.close() } catch (e: IOException) { e.printStackTrace() } return image } fun String.jsonSpiltField(fieldName: String): String { if (fieldName.isEmpty()) { return "" } val regex = "(?<=(\"$fieldName\":\")).*?(?=(\"))" val pattern = Pattern.compile(regex) val matcher = pattern.matcher(this) while (matcher.find()) { if (!TextUtils.isEmpty(matcher.group().trim { it <= ' ' })) { return matcher.group().trim { it <= ' ' } } } return "" } fun String.createFolder() { val file = File(this) if (!file.exists()) { file.mkdirs() } } fun String.deleteFile(): Boolean { val file = File(this) if (!file.exists()) { return false } return file.delete() } fun timeStamp2Time(timeSeconds: Long, format: String = "yyyy/MM/dd HH:mm"): String? { val date = Date(timeSeconds * 1000) return SimpleDateFormat(format, Locale.getDefault()).format(date) } fun String.toCacheFolder(): String = globalApp().externalCacheDir.toString() + "/" + this // ------------------------------Int扩展------------------------------------- fun Int.resId2Drawable(): Drawable? = ContextCompat.getDrawable(globalApp(), this) fun Int.resId2Dimension(): Float = BaseApp.application.resources.getDimension(this) // ------------------------------RequestBody扩展------------------------------------- fun Map.genMultipartBody(): RequestBody { val builder = MultipartBody.Builder() builder.setType(MultipartBody.FORM)//表单类型 this.forEach { builder.addFormDataPart(it.key, it.value) } return builder.build() } fun Map.genRequestBody(): Map { val requestBodyMap: MutableMap = HashMap() for (key in this.keys) { val requestBody: RequestBody = (if (this[key] == null) "" else this[key] ?: "" ).toRequestBody("text/plain".toMediaTypeOrNull()) requestBodyMap[key] = requestBody } return requestBodyMap } fun GlobalApp(): Application { return BaseApp.application } fun getWifiMacAddress(context: Context): String { // 检查是否具有读取Wi-Fi状态的权限 if (ActivityCompat.checkSelfPermission( context, Manifest.permission.ACCESS_WIFI_STATE ) != PackageManager.PERMISSION_GRANTED ) { // 无权限,请求权限 // 这里需要您自行实现权限请求的逻辑 return "" } val wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager val wifiInfo: WifiInfo? = wifiManager.connectionInfo return if (wifiInfo != null) wifiInfo.macAddress else "" } /** * 获取SN * @return */ fun getBrandNum(): String { return getSN().substring(0, 3) } /** * 获取模式 * @return */ fun getModelNum(): String { if (getSN().length < 9) { return "1039" } return getSN().substring(4, 8) } /** * 获取SN * @return */ fun getSN(): String { var serial: String // //由于063 需要写死SN 估在这加 // return "063A21050020123010190001" // return "011A10390020123010190001" if (BuildConfig.DEBUG) { // return "002D10390020123010190001" // return "045A21030020123010190001" // return "000A30150020123010190001" // return "000A10390020123010170001" // return "000A10390020123010190001" // return "000A50670020123010190005" // return "010D10390020123010190001" // return "010F10390020123010190001" // return "011D10390020123010190001" // return "011A10390020123010190001" // return "011A10390020123010190009" // return "000A50370020123010190004" // return "011A50370020123010190003" // return "011A50370020123010190006" // return "011E50370020123010190001" // return "007D20020020123010190001" // return "036I21060020123010190007" // return "030A10390020123010190004" // return "017A20060020123010190001" // return "017A10390020123010190001" // return "010D10390020123010190001" // return "010D10390020123010190001" // return "000A10390020123010190009" // return "032D21060020123010190001" // return "000A50370020123010190011" // return "030A10390020123010190002" // return "033F20020020123010190001" // return "033G20020020123010190001" // return "014A19050020123010190002" // return "029C21010020123010190002" // return "029C21010020123010190001" // return "029C10390020123010190001" // return "062A10390020123010190001" // return "062A20030020123010190001" // return "062A20030020123010190003" // return "062A20030020123010190004" // return "063A10390020123010190001" // return "063B10390020123010190001" return "063B21050020123010190001" // return "049B10390020123010190001" // return "000A50370020123010190017" // return "000A10390020123010190023" } else { //通过反射获取sn号 try { val c = Class.forName("android.os.SystemProperties") val get = c.getMethod("get", String::class.java) serial = get.invoke(c, "ro.serialno") as String if (serial != "" && serial != "unknown") return serial //9.0及以上无法获取到sn,此方法为补充,能够获取到多数高版本手机 sn if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) serial = Build.getSerial() } catch (e: java.lang.Exception) { serial = "unknown" } return serial } } fun getGoneLogin(): Boolean { var sn = getSN() return sn.startsWith("032D") || sn.startsWith("011") || sn.startsWith("030A") || sn.startsWith("010F") || sn.startsWith("033F") } fun getGoneTuYa(): Boolean { var sn = getSN() return sn.startsWith("010D") || sn.startsWith("010F") || sn.startsWith("032D") || sn.startsWith("033F") || sn.startsWith("011A") || sn.startsWith("036I") } fun getSNUrl(): String { return "https://icook.cofarcn.com/ext/devInfo?sn=" + getSN() } fun ImageView.load(data: Any?) { Glide.with(this.context).load(data) .diskCacheStrategy(DiskCacheStrategy.RESOURCE) .into(this) } fun ImageView.loadGif(data: Int) { Glide.with(this.context) .asGif().load(data) .diskCacheStrategy(DiskCacheStrategy.DATA) .override(240, 200) .into(this) } fun ImageView.load(data: Any?, width: Int, height: Int) { Glide.with(this.context) .asDrawable() .load(data) .diskCacheStrategy(DiskCacheStrategy.RESOURCE) .skipMemoryCache(false) .override(width, height) .dontAnimate() .into(this) } fun ImageView.load(data: Any?, error: Int) { Glide.with(this.context).load(data) .error(error) .transition(DrawableTransitionOptions.withCrossFade()) .into(this) } fun isScreenWidth(): Int { return MMkvUtils.getInt("screen_width", 0) } fun isScreenHeight(): Int { return MMkvUtils.getInt("screen_height", 0) } fun setScreenWidth(width: Int) { MMkvUtils.save("screen_width", width) } fun setScreenHeight(height: Int) { MMkvUtils.save("screen_height", height) } fun setAppCode(code: String) { MMkvUtils.save("appCode", code) } fun getAppCode(): String { return MMkvUtils.getString("appCode") ?: "1.01" } fun isNightTheme(): Boolean { return MMkvUtils.getBool("nightTheme", false) } fun isFrLanguage(): Boolean { return MMkvUtils.getString("CURRENT_LANGUAGE") == "FR" } fun setNightTheme(isNight: Boolean) { MMkvUtils.save("nightTheme", isNight) } fun setIsBrand036I(is036I: Boolean) { MMkvUtils.save("is036I", is036I) } fun isBrand036I(): Boolean { return MMkvUtils.getBool("is036I", false) } fun setIsBrand011A(is011A: Boolean) { MMkvUtils.save("is011A", is011A) } fun isBrand011A(): Boolean { return MMkvUtils.getBool("is011A", false) } fun setRecipesList(recipesList: String) { MMkvUtils.save("recipesList", recipesList) } fun isRecipesList(): String { return MMkvUtils.getString("recipesList") ?: "" } fun setIsBrand054A(is054A: Boolean) { MMkvUtils.save("is054A", is054A) } fun isBrand054A(): Boolean { return MMkvUtils.getBool("is054A", false) } fun setIsBrand062(is054A: Boolean) { MMkvUtils.save("is062", is054A) } fun setOtaFileMd5(code: String) { MMkvUtils.save("isOtaZipMd5", code) } fun getOtaFileMd5(): String { return MMkvUtils.getString("isOtaZipMd5") ?: "" } fun setUpdateRecipeTime(time :String) { MMkvUtils.save("isUpdateTime", time) } fun getUpdateRecipeTime():String { return MMkvUtils.getString("isUpdateTime") ?: "" } fun isBrand062(): Boolean { return MMkvUtils.getBool("is062", false) }