FoodCookingApp.kt 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. package com.develop.foodcooking
  2. import android.annotation.SuppressLint
  3. import android.content.Context
  4. import android.content.Intent
  5. import android.net.Uri
  6. import android.os.Build
  7. import android.os.PowerManager
  8. import android.provider.Settings
  9. import android.util.Log
  10. import com.blankj.utilcode.util.AppUtils
  11. import com.blankj.utilcode.util.PathUtils
  12. import com.blankj.utilcode.util.ResourceUtils
  13. import com.blankj.utilcode.util.Utils
  14. import com.develop.base.app.BaseApp
  15. import com.develop.base.ext.getBrandNum
  16. import com.develop.base.ext.isNightTheme
  17. import com.develop.base.ext.setNightTheme
  18. import com.develop.base.util.MMkvUtils
  19. import com.develop.common.data_repo.FoodDataProvider
  20. import com.develop.common.data_repo.net.Api
  21. import com.develop.common.data_repo.net.converter.SerializationConverter
  22. import com.develop.common.data_repo.net.interceptor.FoodRequestInterceptor
  23. import com.develop.common.food_sdk.GlobalDevEvent
  24. import com.develop.common.food_sdk.SerialPortUtils
  25. import com.develop.common.utils.compat.RecyclerViewCompat
  26. import com.develop.common.utils.compat.ShapeableImageViewCompat
  27. import com.develop.common.utils.compat.SmartRefreshLayoutCompat
  28. import com.develop.common.utils.compat.StartViewCompat
  29. import com.drake.net.convert.NetConverter
  30. import com.drake.net.interceptor.RequestInterceptor
  31. import com.drake.net.interfaces.NetErrorHandler
  32. import com.drake.net.time.Interval
  33. import com.kuyuntech.cofarcooking.device.sdk.constant.core.DevStatus
  34. import com.kuyuntech.cofarcooking.device.sdk.eventbus.event.DevPromptEvent
  35. import com.kuyuntech.cofarcooking.device.sdk.eventbus.event.DevStatusEvent
  36. import com.kuyuntech.cofarcooking.device.sdk.util.core.CofarSDK
  37. import org.alee.component.skin.compat.ConstraintLayoutCompat
  38. import org.alee.component.skin.page.WindowManager
  39. import org.alee.component.skin.service.Config
  40. import org.alee.component.skin.service.IOptionFactory
  41. import org.alee.component.skin.service.IThemeSkinOption
  42. import org.alee.component.skin.service.ThemeSkinService
  43. import org.greenrobot.eventbus.EventBus
  44. import org.greenrobot.eventbus.Subscribe
  45. import java.io.File
  46. import java.lang.reflect.Method
  47. import java.util.concurrent.TimeUnit
  48. class FoodCookingApp : BaseApp() {
  49. companion object {
  50. init {
  51. Config.getInstance().skinMode = Config.SkinMode.REPLACE_ALL
  52. Config.getInstance().performanceMode = Config.PerformanceMode.EXPERIENCE_FIRST
  53. ConstraintLayoutCompat.init()
  54. RecyclerViewCompat.init()
  55. SmartRefreshLayoutCompat.init()
  56. ShapeableImageViewCompat.init()
  57. StartViewCompat.init()
  58. }
  59. }
  60. var mWakeLock: PowerManager.WakeLock? = null
  61. private lateinit var pm: PowerManager
  62. var minute = 0
  63. private var heartBeatInterval :Interval?=null
  64. override fun onCreate() {
  65. hookWebView()
  66. super.onCreate()
  67. //FoodDataProvider.initFoodDataBase()
  68. ResourceUtils.copyFileFromAssets(
  69. ASSETS_NIGHT_SKIN_PACK,
  70. SKIN_PACK_PATH + NIGHT_SKIN_PACK_NAME
  71. )
  72. WindowManager.getInstance().init(this, OptionFactory())
  73. val isNight = !isNightTheme()
  74. //切换主题,theme=0 night= false 是0000的主题,而且需要AndroidManifest.xml主题设置为 android:theme="@style/SplashTheme"
  75. ThemeSkinService.getInstance().switchThemeSkin(1)
  76. setNightTheme(true)
  77. CofarSDK.init(getBrandNum())
  78. SerialPortUtils.init()
  79. CofarSDK.register(this)
  80. CofarSDK.stopNative()
  81. // val powerManager = getSystemService(POWER_SERVICE) as PowerManager
  82. // val wakeLock: PowerManager.WakeLock =
  83. // powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "motionDetection:keepAwake")
  84. // wakeLock.acquire()
  85. pm = getSystemService(POWER_SERVICE) as PowerManager
  86. minute = MMkvUtils.getInt("ScreenSaver")
  87. if (minute == 0) {
  88. minute = 5
  89. }
  90. Settings.System.putInt(
  91. contentResolver,
  92. Settings.System.SCREEN_OFF_TIMEOUT,
  93. (1000 * 60 * minute).toInt()
  94. )
  95. Settings.Secure.putInt(contentResolver, Settings.Secure.INSTALL_NON_MARKET_APPS, 1)
  96. val uri: Uri = Settings.System
  97. .getUriFor(Settings.System.SCREEN_OFF_TIMEOUT)
  98. contentResolver.notifyChange(uri, null)
  99. heartBeatInterval = Interval(1,1,TimeUnit.SECONDS,5).finish {
  100. //设备不通讯异常
  101. EventBus.getDefault().post(
  102. DevPromptEvent.builder()
  103. .showCancelBtn(false)
  104. .msg("dev_error")
  105. .focus(true)
  106. .build()
  107. )
  108. }.start()
  109. }
  110. fun hookWebView() {
  111. val TAG = "ASDD"
  112. val sdkInt = Build.VERSION.SDK_INT
  113. try {
  114. val factoryClass = Class.forName("android.webkit.WebViewFactory")
  115. val field = factoryClass.getDeclaredField("sProviderInstance")
  116. field.isAccessible = true
  117. var sProviderInstance = field[null]
  118. if (sProviderInstance != null) {
  119. Log.d(TAG, "sProviderInstance isn't null")
  120. return
  121. }
  122. val getProviderClassMethod: Method
  123. getProviderClassMethod = if (sdkInt > 22) {
  124. factoryClass.getDeclaredMethod("getProviderClass")
  125. } else if (sdkInt == 22) {
  126. factoryClass.getDeclaredMethod("getFactoryClass")
  127. } else {
  128. Log.d(TAG, "Don't need to Hook WebView")
  129. return
  130. }
  131. getProviderClassMethod.isAccessible = true
  132. val providerClass = getProviderClassMethod.invoke(factoryClass) as Class<*>
  133. val delegateClass = Class.forName("android.webkit.WebViewDelegate")
  134. val providerConstructor = providerClass.getConstructor(delegateClass)
  135. if (providerConstructor != null) {
  136. providerConstructor.isAccessible = true
  137. val declaredConstructor = delegateClass.getDeclaredConstructor()
  138. declaredConstructor.isAccessible = true
  139. sProviderInstance =
  140. providerConstructor.newInstance(declaredConstructor.newInstance())
  141. field["sProviderInstance"] = sProviderInstance
  142. }
  143. Log.d(TAG, "Hook done!")
  144. } catch (e: Throwable) {
  145. }
  146. }
  147. override fun createHostUrl(): String {
  148. return Api.HOST
  149. }
  150. override fun createRequestInterceptor(): RequestInterceptor {
  151. return FoodRequestInterceptor()
  152. }
  153. override fun createConverter(): NetConverter {
  154. return SerializationConverter()
  155. }
  156. override fun createErrorHandle(): NetErrorHandler {
  157. return NetErrorHandler.DEFAULT
  158. }
  159. override fun attachBaseContext(base: Context?) {
  160. super.attachBaseContext(base)
  161. FoodDataProvider.prepareData(this)
  162. }
  163. override fun onTerminate() {
  164. super.onTerminate()
  165. SerialPortUtils.destroy()
  166. CofarSDK.unregister(this)
  167. }
  168. @SuppressLint("InvalidWakeLockTag")
  169. @Subscribe
  170. @Synchronized
  171. fun globalCoverEvent(event: DevStatusEvent) {
  172. heartBeatInterval?.cancel()
  173. val devInfo = event.devInfo;
  174. val pm = getSystemService(POWER_SERVICE) as PowerManager
  175. if (devInfo.status == DevStatus.RUNNING.toInt() || devInfo.isWeightStatus) {
  176. if (mWakeLock == null) {
  177. mWakeLock = pm.newWakeLock(
  178. PowerManager.SCREEN_BRIGHT_WAKE_LOCK or PowerManager.ON_AFTER_RELEASE or PowerManager.ACQUIRE_CAUSES_WAKEUP,
  179. "tag"
  180. );
  181. mWakeLock?.setReferenceCounted(false);
  182. mWakeLock?.acquire()
  183. }
  184. } else if (devInfo.status != DevStatus.RUNNING.toInt()) {
  185. if (mWakeLock != null) {
  186. mWakeLock?.release()
  187. mWakeLock = null
  188. val intent = Intent()
  189. intent.action = "android.intent.action.SS_DEVICE_TOUCH"
  190. sendBroadcast(intent)
  191. }
  192. }
  193. GlobalDevEvent.globalCoverEvent(event, pm)
  194. }
  195. }
  196. class OptionFactory : IOptionFactory {
  197. override fun defaultTheme(): Int {
  198. return 0
  199. }
  200. override fun requireOption(theme: Int): IThemeSkinOption? {
  201. return when (theme) {
  202. 1 -> NightOption()
  203. else -> null
  204. }
  205. }
  206. }
  207. class NightOption : IThemeSkinOption {
  208. override fun getStandardSkinPackPath(): LinkedHashSet<String> {
  209. val pathSet = LinkedHashSet<String>()
  210. pathSet.add(SKIN_PACK_PATH + NIGHT_SKIN_PACK_NAME)
  211. return pathSet
  212. }
  213. }
  214. const val NIGHT_SKIN_PACK_NAME = "night.skin"
  215. const val ASSETS_NIGHT_SKIN_PACK = "skins/night.skin"
  216. /**
  217. * 应用存储空间根路径
  218. */
  219. private val ROOT_PATH =
  220. Utils.getApp().getExternalFilesDir(null)?.absolutePath?.run { this + File.separator }
  221. ?: (PathUtils.getExternalAppDataPath() + "." + AppUtils.getAppPackageName() + File.separator)
  222. /**
  223. * 皮肤包根路径
  224. */
  225. val SKIN_PACK_PATH = ROOT_PATH + ".SkinPack" + File.separator