123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446 |
- package com.develop.foodcooking
- import android.annotation.SuppressLint
- import android.content.Context
- import android.content.Intent
- import android.content.res.Configuration
- import android.net.Uri
- import android.os.Build
- import android.os.Environment
- import android.os.PowerManager
- import android.provider.Settings
- import android.util.Log
- import com.blankj.utilcode.util.AppUtils
- import com.blankj.utilcode.util.FileUtils
- import com.blankj.utilcode.util.PathUtils
- import com.blankj.utilcode.util.ResourceUtils
- import com.blankj.utilcode.util.Utils
- import com.develop.base.app.BaseApp
- import com.develop.base.ext.getBrandNum
- import com.develop.base.ext.getOtaFileMd5
- import com.develop.base.ext.getSN
- import com.develop.base.ext.setAppCode
- import com.develop.base.ext.setIsBrand011A
- import com.develop.base.ext.setIsBrand036I
- import com.develop.base.ext.setIsBrand054A
- import com.develop.base.ext.setIsBrand062
- import com.develop.base.ext.setNightTheme
- import com.develop.base.ext.setOtaFileMd5
- import com.develop.base.util.MMkvUtils
- import com.develop.common.bean.TuyaEvent
- import com.develop.common.data_repo.FoodDataProvider
- import com.develop.common.data_repo.net.Api
- import com.develop.common.data_repo.net.converter.SerializationConverter
- import com.develop.common.data_repo.net.interceptor.FoodRequestInterceptor
- import com.develop.common.food_sdk.GlobalDevEvent
- import com.develop.common.food_sdk.SerialPortUtils
- import com.develop.common.tag.MODEL
- import com.develop.common.utils.StringUtils
- import com.develop.common.utils.TuyaUtils
- import com.develop.common.utils.compat.RecyclerViewCompat
- import com.develop.common.utils.compat.ShapeableImageViewCompat
- import com.develop.common.utils.compat.SmartRefreshLayoutCompat
- import com.develop.common.utils.compat.StartViewCompat
- import com.drake.net.convert.NetConverter
- import com.drake.net.interceptor.RequestInterceptor
- import com.drake.net.interfaces.NetErrorHandler
- import com.drake.net.time.Interval
- import com.kuyuntech.cofarcooking.device.sdk.constant.core.DevStatus
- import com.kuyuntech.cofarcooking.device.sdk.eventbus.event.DevPromptEvent
- import com.kuyuntech.cofarcooking.device.sdk.eventbus.event.DevStatusEvent
- import com.kuyuntech.cofarcooking.device.sdk.util.core.CofarSDK
- import org.alee.component.skin.compat.ConstraintLayoutCompat
- import org.alee.component.skin.page.WindowManager
- import org.alee.component.skin.service.Config
- import org.alee.component.skin.service.IOptionFactory
- import org.alee.component.skin.service.IThemeSkinOption
- import org.alee.component.skin.service.ThemeSkinService
- import org.greenrobot.eventbus.EventBus
- import org.greenrobot.eventbus.Subscribe
- import java.io.File
- import java.lang.reflect.Method
- import java.security.cert.X509Certificate
- import java.util.Locale
- import java.util.concurrent.TimeUnit
- import javax.net.ssl.TrustManager
- class FoodCookingApp : BaseApp() {
- companion object {
- init {
- Config.getInstance().skinMode = Config.SkinMode.REPLACE_ALL
- Config.getInstance().performanceMode = Config.PerformanceMode.EXPERIENCE_FIRST
- ConstraintLayoutCompat.init()
- RecyclerViewCompat.init()
- SmartRefreshLayoutCompat.init()
- ShapeableImageViewCompat.init()
- StartViewCompat.init()
- }
- }
- var mWakeLock: PowerManager.WakeLock? = null
- private lateinit var pm: PowerManager
- var minute = 0
- private var heartBeatInterval: Interval? = null
- var ledLock = false
- override fun onCreate() {
- hookWebView()
- super.onCreate()
- //处理崩溃问题
- // CrashHandler.getInstance().init(this);
- //FoodDataProvider.initFoodDataBase()
- WindowManager.getInstance().init(this, OptionFactory())
- setAppCode(BuildConfig.appCode)
- val isNight = BuildConfig.UpdatePlatform.equals("night")
- val is062 = BuildConfig.UpdatePlatform.equals("062A")
- val is011 = BuildConfig.UpdatePlatform.equals("011A")
- setIsBrand036I(BuildConfig.UpdatePlatform.equals("036I"))
- setIsBrand054A(BuildConfig.UpdatePlatform.equals("054A"))
- setIsBrand011A(is011)
- setIsBrand062(is062)
- if (BuildConfig.brandCode.startsWith("010")){
- MMkvUtils.save("appTime", BuildConfig.time)
- }
- if (is062) {
- ResourceUtils.copyFileFromAssets(
- ASSETS_BLUE_SKIN_PACK,
- SKIN_PACK_PATH + BLUE_SKIN_PACK_NAME
- )
- }
- if (is011) {
- ResourceUtils.copyFileFromAssets(
- ASSETS_ZERO_ONE_ONE_SKIN_PACK,
- SKIN_PACK_PATH + ZERO_ONE_ONE_SKIN_PACK_NAME
- )
- }
- if (isNight) {
- ResourceUtils.copyFileFromAssets(
- ASSETS_NIGHT_SKIN_PACK,
- SKIN_PACK_PATH + NIGHT_SKIN_PACK_NAME
- )
- }
- //切换主题,theme=0 night= false 是0000的主题,而且需要AndroidManifest.xml主题设置为 android:theme="@style/SplashTheme"
- ThemeSkinService.getInstance()
- .switchThemeSkin(if (isNight) 1 else if (is062) 2 else if (is011) 3 else 0)
- setNightTheme(isNight)
- CofarSDK.init(getBrandNum())
- SerialPortUtils.init()
- CofarSDK.register(this)
- CofarSDK.stopNative()
- // val powerManager = getSystemService(POWER_SERVICE) as PowerManager
- // val wakeLock: PowerManager.WakeLock =
- // powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "motionDetection:keepAwake")
- // wakeLock.acquire()
- pm = getSystemService(POWER_SERVICE) as PowerManager
- minute = MMkvUtils.getInt("ScreenSaver")
- if (minute == 0) {
- minute = 5
- }
- Settings.System.putInt(
- contentResolver,
- Settings.System.SCREEN_OFF_TIMEOUT,
- (1000 * 60 * minute).toInt()
- )
- Settings.Secure.putInt(contentResolver, Settings.Secure.INSTALL_NON_MARKET_APPS, 1)
- val uri: Uri = Settings.System
- .getUriFor(Settings.System.SCREEN_OFF_TIMEOUT)
- contentResolver.notifyChange(uri, null)
- heartBeatInterval = Interval(1, 1, TimeUnit.SECONDS, 5).finish {
- //设备不通讯异常
- EventBus.getDefault().post(
- DevPromptEvent.builder()
- .showCancelBtn(false)
- .msg("dev_error")
- .focus(true)
- .build()
- )
- }.start()
- var md5 = getOtaFileMd5()
- var sn = getSN()
- //处理ota食谱更新问题
- // if (sn.startsWith("010")&& getOtaFileMd5().isNotEmpty()
- // && md5 != StringUtils.getFileMD5("system/media/cofa_cooking.zip")){
- // //先删除sd卡目录下的cofa文件
- // FileUtils.delete(File(Environment.getExternalStorageDirectory(),"cofa_cooking"))
- //
- // FoodDataProvider.prepareData(this)
- // }else{
- // FoodDataProvider.prepareData(this)
- // }
- // //010 每一次都把md5的值set进去
- // if (sn.startsWith("010")){
- // setOtaFileMd5(StringUtils.getFileMD5("system/media/cofa_cooking.zip"))
- //
- // }
- }
- fun hookWebView() {
- val TAG = "ASDD"
- val sdkInt = Build.VERSION.SDK_INT
- try {
- val factoryClass = Class.forName("android.webkit.WebViewFactory")
- val field = factoryClass.getDeclaredField("sProviderInstance")
- field.isAccessible = true
- var sProviderInstance = field[null]
- if (sProviderInstance != null) {
- Log.d(TAG, "sProviderInstance isn't null")
- return
- }
- val getProviderClassMethod: Method
- getProviderClassMethod = if (sdkInt > 22) {
- factoryClass.getDeclaredMethod("getProviderClass")
- } else if (sdkInt == 22) {
- factoryClass.getDeclaredMethod("getFactoryClass")
- } else {
- Log.d(TAG, "Don't need to Hook WebView")
- return
- }
- getProviderClassMethod.isAccessible = true
- val providerClass = getProviderClassMethod.invoke(factoryClass) as Class<*>
- val delegateClass = Class.forName("android.webkit.WebViewDelegate")
- val providerConstructor = providerClass.getConstructor(delegateClass)
- if (providerConstructor != null) {
- providerConstructor.isAccessible = true
- val declaredConstructor = delegateClass.getDeclaredConstructor()
- declaredConstructor.isAccessible = true
- sProviderInstance =
- providerConstructor.newInstance(declaredConstructor.newInstance())
- field["sProviderInstance"] = sProviderInstance
- }
- Log.d(TAG, "Hook done!")
- } catch (e: Throwable) {
- }
- }
- override fun createHostUrl(): String {
- return Api.HOST
- }
- override fun createRequestInterceptor(): RequestInterceptor {
- return FoodRequestInterceptor()
- }
- override fun createConverter(): NetConverter {
- return SerializationConverter()
- }
- override fun createErrorHandle(): NetErrorHandler {
- return NetErrorHandler.DEFAULT
- }
- override fun attachBaseContext(base: Context?) {
- super.attachBaseContext(base)
- //把这个方法放到onCreate 处理ota问题
- FoodDataProvider.prepareData(this)
- }
- override fun onTerminate() {
- super.onTerminate()
- SerialPortUtils.destroy()
- CofarSDK.unregister(this)
- }
- @SuppressLint("InvalidWakeLockTag")
- @Subscribe
- fun onTuyaEvent(event: TuyaEvent) {
- TuyaUtils.uploadData()
- heartBeatInterval?.cancel()
- val pm = getSystemService(POWER_SERVICE) as PowerManager
- if (mWakeLock == null) {
- mWakeLock = pm.newWakeLock(
- PowerManager.SCREEN_BRIGHT_WAKE_LOCK or PowerManager.ON_AFTER_RELEASE or PowerManager.ACQUIRE_CAUSES_WAKEUP,
- "tag"
- );
- mWakeLock?.setReferenceCounted(false);
- mWakeLock?.acquire()
- }
- mWakeLock?.release()
- mWakeLock = null
- val intent = Intent()
- intent.action = "android.intent.action.SS_DEVICE_TOUCH"
- sendBroadcast(intent)
- }
- // @Subscribe
- // fun onCookDevMsgEvent(event: DevPromptEvent) {
- //
- //
- // }
- @SuppressLint("InvalidWakeLockTag")
- @Subscribe
- @Synchronized
- fun globalCoverEvent(event: DevStatusEvent) {
- TuyaUtils.uploadData()
- heartBeatInterval?.cancel()
- val devInfo = event.devInfo;
- val pm = getSystemService(POWER_SERVICE) as PowerManager
- if (devInfo.status == DevStatus.RUNNING.toInt() || devInfo.isWeightStatus) {
- if (mWakeLock == null) {
- mWakeLock = pm.newWakeLock(
- PowerManager.SCREEN_BRIGHT_WAKE_LOCK or PowerManager.ON_AFTER_RELEASE or PowerManager.ACQUIRE_CAUSES_WAKEUP,
- "tag"
- );
- mWakeLock?.setReferenceCounted(false);
- mWakeLock?.acquire()
- }
- } else if (devInfo.status != DevStatus.RUNNING.toInt()) {
- if (mWakeLock != null) {
- mWakeLock?.release()
- mWakeLock = null
- val intent = Intent()
- intent.action = "android.intent.action.SS_DEVICE_TOUCH"
- sendBroadcast(intent)
- }
- }
- // if (!ledLock) {
- // //devInfo.potStatus 0是有锅 1是没锅
- // //devInfo.potCloverStatus 0是合盖,1是没盒盖
- // ledLock = true;
- // //屏幕暗
- // if (!pm.isScreenOn) {
- //
- // //合盖
- // if (devInfo.potCloverStatus.toInt() == 0) {
- // CofarSDK.flashWhiteRedLed()
- // } else {
- // CofarSDK.switchWhiteLed('0');
- // CofarSDK.flashRedLed()
- // }
- //
- // } else {
- // //屏幕亮
- // if (devInfo.status == DevStatus.STOP.toInt()) {
- //
- // if (devInfo.potStatus.toInt() == 0) {
- // if (devInfo.potCloverStatus.toInt() == 0) {
- // CofarSDK.flashWhiteRedLed()
- // } else {
- // CofarSDK.switchWhiteLed('0');
- // CofarSDK.flashRedLed()
- // }
- // } else {
- // CofarSDK.switchWhiteLed('0');
- // CofarSDK.flashRedLed();
- // }
- //
- // }
- //
- // if (devInfo.status == DevStatus.RUNNING.toInt()) {
- //
- // if (devInfo.temp < 60) {
- // CofarSDK.switchRedLed('0');
- // CofarSDK.switchWhiteLed('1');
- // } else {
- // CofarSDK.switchRedLed('1');
- // CofarSDK.switchWhiteLed('0');
- // }
- //
- // }
- //
- // if (devInfo.status == DevStatus.PAUSE.toInt()) {
- //
- // //判断盖子是否打开
- // //合盖
- // if (devInfo.potCloverStatus.toInt() == 1) {
- // CofarSDK.switchWhiteLed('0');
- // CofarSDK.flashRedLed()
- // } else {
- // CofarSDK.flashWhiteRedLed()
- // }
- //
- //
- // }
- // }
- // ledLock = false;
- // }
- GlobalDevEvent.globalCoverEvent(event, pm)
- }
- }
- class OptionFactory : IOptionFactory {
- override fun defaultTheme(): Int {
- return 0
- }
- override fun requireOption(theme: Int): IThemeSkinOption? {
- return when (theme) {
- 1 -> NightOption()
- 2 -> BlueOption()
- 3 -> ZeroOneOneOption()
- else -> null
- }
- }
- }
- class NightOption : IThemeSkinOption {
- override fun getStandardSkinPackPath(): LinkedHashSet<String> {
- val pathSet = LinkedHashSet<String>()
- pathSet.add(SKIN_PACK_PATH + NIGHT_SKIN_PACK_NAME)
- return pathSet
- }
- }
- class BlueOption : IThemeSkinOption {
- override fun getStandardSkinPackPath(): LinkedHashSet<String> {
- val pathSet = LinkedHashSet<String>()
- pathSet.add(SKIN_PACK_PATH + BLUE_SKIN_PACK_NAME)
- return pathSet
- }
- }
- class ZeroOneOneOption : IThemeSkinOption {
- override fun getStandardSkinPackPath(): LinkedHashSet<String> {
- val pathSet = LinkedHashSet<String>()
- pathSet.add(SKIN_PACK_PATH + ZERO_ONE_ONE_SKIN_PACK_NAME)
- return pathSet
- }
- }
- const val NIGHT_SKIN_PACK_NAME = "night.skin"
- const val ASSETS_NIGHT_SKIN_PACK = "skins/night.skin"
- const val BLUE_SKIN_PACK_NAME = "blue.skin"
- const val ASSETS_BLUE_SKIN_PACK = "skins/blue.skin"
- const val ZERO_ONE_ONE_SKIN_PACK_NAME = "zeroOneOne.skin"
- const val ASSETS_ZERO_ONE_ONE_SKIN_PACK = "skins/zeroOneOne.skin"
- /**
- * 应用存储空间根路径
- */
- private val ROOT_PATH =
- Utils.getApp().getExternalFilesDir(null)?.absolutePath?.run { this + File.separator }
- ?: (PathUtils.getExternalAppDataPath() + "." + AppUtils.getAppPackageName() + File.separator)
- /**
- * 皮肤包根路径
- */
- val SKIN_PACK_PATH = ROOT_PATH + ".SkinPack" + File.separator
|