diff --git a/WallPanelApp/src/main/java/xyz/wallpanel/app/network/WallPanelService.kt b/WallPanelApp/src/main/java/xyz/wallpanel/app/network/WallPanelService.kt index 6f94c4e..33ce3c9 100644 --- a/WallPanelApp/src/main/java/xyz/wallpanel/app/network/WallPanelService.kt +++ b/WallPanelApp/src/main/java/xyz/wallpanel/app/network/WallPanelService.kt @@ -27,6 +27,7 @@ import android.hardware.display.DisplayManager import android.media.MediaPlayer import android.net.wifi.WifiManager import android.os.* +import android.os.PowerManager.WakeLock import android.view.Display import androidx.core.content.ContextCompat import androidx.lifecycle.LifecycleService @@ -99,6 +100,7 @@ class WallPanelService : LifecycleService(), MQTTModule.MQTTListener { private val mJpegSockets = ArrayList() private var partialWakeLock: PowerManager.WakeLock? = null + private var screenWakeLock: PowerManager.WakeLock? = null private var wifiLock: WifiManager.WifiLock? = null private var keyguardLock: KeyguardManager.KeyguardLock? = null private var audioPlayer: MediaPlayer? = null @@ -152,9 +154,15 @@ class WallPanelService : LifecycleService(), MQTTModule.MQTTListener { //noinspection deprecation partialWakeLock = if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) { - pm.newWakeLock(PowerManager.FULL_WAKE_LOCK or PowerManager.ACQUIRE_CAUSES_WAKEUP, "wallPanel:partialWakeLock") + pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "wallPanel:partialWakeLock") } else { - pm.newWakeLock(PowerManager.FULL_WAKE_LOCK or PowerManager.ACQUIRE_CAUSES_WAKEUP or PowerManager.ON_AFTER_RELEASE, "wallPanel:partialWakeLock") + pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK or PowerManager.ON_AFTER_RELEASE, "wallPanel:partialWakeLock") + } + + screenWakeLock = if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) { + pm.newWakeLock(PowerManager.FULL_WAKE_LOCK or PowerManager.ACQUIRE_CAUSES_WAKEUP, "wallPanel:fullWakeLock") + } else { + pm.newWakeLock(PowerManager.FULL_WAKE_LOCK or PowerManager.ACQUIRE_CAUSES_WAKEUP or PowerManager.ON_AFTER_RELEASE, "wallPanel:fullWakeLock") } // wifi lock @@ -283,9 +291,7 @@ class WallPanelService : LifecycleService(), MQTTModule.MQTTListener { } private fun configurePowerOptions() { - if (partialWakeLock != null && !partialWakeLock!!.isHeld) { - partialWakeLock!!.acquire(3000) - } + partialWakeLock?.let { acquireWakeLock(it) } if (!wifiLock!!.isHeld) { wifiLock!!.acquire() } @@ -299,9 +305,7 @@ class WallPanelService : LifecycleService(), MQTTModule.MQTTListener { private fun stopPowerOptions() { Timber.i("Releasing Screen/WiFi Locks") - if (partialWakeLock != null && partialWakeLock!!.isHeld) { - partialWakeLock!!.release() - } + partialWakeLock?.let { releaseWakeLock(it) } if (wifiLock != null && wifiLock!!.isHeld) { wifiLock!!.release() } @@ -519,6 +523,25 @@ class WallPanelService : LifecycleService(), MQTTModule.MQTTListener { } } + private fun acquireWakeLock(wakeLock: WakeLock, timeout: Long = -1) { + if (timeout >= 0) { + releaseWakeLock(wakeLock) + } + if (!wakeLock.isHeld) { + if (timeout >= 0) { + wakeLock.acquire(timeout) + } else { + wakeLock.acquire() + } + } + } + + private fun releaseWakeLock(wakeLock: WakeLock){ + if (wakeLock.isHeld){ + wakeLock.release() + } + } + // Attempt to restart camera and any optional camera options such as motion and streaming private fun restartCamera() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && configuration.cameraPermissionsShown) { @@ -698,6 +721,7 @@ class WallPanelService : LifecycleService(), MQTTModule.MQTTListener { // TODO temporarily wake screen private fun wakeScreen() { + screenWakeLock?.let { acquireWakeLock(it) } val intent = Intent(BROADCAST_SCREEN_WAKE) val bm = LocalBroadcastManager.getInstance(applicationContext) bm.sendBroadcast(intent) @@ -705,11 +729,9 @@ class WallPanelService : LifecycleService(), MQTTModule.MQTTListener { @SuppressLint("WakelockTimeout") private fun wakeScreenOn(wakeTime: Long) { - if (partialWakeLock != null && !partialWakeLock!!.isHeld) { - partialWakeLock?.acquire(wakeTime) - wakeScreenHandler.postDelayed(clearWakeScreenRunnable, wakeTime) - sendWakeScreenOn() - } + wakeScreenHandler.postDelayed(clearWakeScreenRunnable, wakeTime) + screenWakeLock?.let { acquireWakeLock(it, wakeTime) } + sendWakeScreenOn() } private val clearWakeScreenRunnable = Runnable { @@ -718,9 +740,7 @@ class WallPanelService : LifecycleService(), MQTTModule.MQTTListener { private fun wakeScreenOff() { wakeScreenHandler.removeCallbacks(clearWakeScreenRunnable) - if (partialWakeLock != null && partialWakeLock!!.isHeld) { - partialWakeLock!!.release() - } + screenWakeLock?.let { releaseWakeLock(it) } sendWakeScreenOff() } @@ -964,6 +984,7 @@ class WallPanelService : LifecycleService(), MQTTModule.MQTTListener { private fun sendWakeScreenOn() { Timber.d("sendWakeScreen") + screenWakeLock?.let { acquireWakeLock(it) } val intent = Intent(BROADCAST_SCREEN_WAKE_ON) val bm = LocalBroadcastManager.getInstance(applicationContext) bm.sendBroadcast(intent) @@ -971,6 +992,7 @@ class WallPanelService : LifecycleService(), MQTTModule.MQTTListener { private fun sendWakeScreenOff() { Timber.d("sendWakeScreenOff") + screenWakeLock?.let { releaseWakeLock(it) } val intent = Intent(BROADCAST_SCREEN_WAKE_OFF) val bm = LocalBroadcastManager.getInstance(applicationContext) bm.sendBroadcast(intent) diff --git a/WallPanelApp/src/main/java/xyz/wallpanel/app/ui/activities/BaseBrowserActivity.kt b/WallPanelApp/src/main/java/xyz/wallpanel/app/ui/activities/BaseBrowserActivity.kt index 94238a7..f032c2b 100644 --- a/WallPanelApp/src/main/java/xyz/wallpanel/app/ui/activities/BaseBrowserActivity.kt +++ b/WallPanelApp/src/main/java/xyz/wallpanel/app/ui/activities/BaseBrowserActivity.kt @@ -74,6 +74,22 @@ abstract class BaseBrowserActivity : DaggerAppCompatActivity() { var displayProgress = true var zoomLevel = 1.0f + // handler for received data from service for screen operations + private val mWakeBroadcastReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (BROADCAST_SCREEN_WAKE == intent.action && !isFinishing) { + stopDisconnectTimer() + } else if (BROADCAST_SCREEN_WAKE_ON == intent.action && !isFinishing) { + hasWakeScreen = true + resetScreenBrightness(false) + clearInactivityTimer() + } else if (BROADCAST_SCREEN_WAKE_OFF == intent.action && !isFinishing) { + hasWakeScreen = false + resetInactivityTimer() + } + } + } + // handler for received data from service private val mBroadcastReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { @@ -122,17 +138,6 @@ abstract class BaseBrowserActivity : DaggerAppCompatActivity() { resetInactivityTimer() resetScreenBrightness(false) } - } else if (BROADCAST_SCREEN_WAKE == intent.action && !isFinishing) { - stopDisconnectTimer() - } else if (BROADCAST_SCREEN_WAKE_ON == intent.action && !isFinishing) { - hasWakeScreen = true - resetScreenBrightness(false) - clearInactivityTimer() - window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) - } else if (BROADCAST_SCREEN_WAKE_OFF == intent.action && !isFinishing) { - hasWakeScreen = false - resetInactivityTimer() - window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } else if (BROADCAST_ACTION_RELOAD_PAGE == intent.action && !isFinishing) { hideScreenSaver() } else if (BROADCAST_SERVICE_STARTED == intent.action && !isFinishing) { @@ -150,7 +155,15 @@ abstract class BaseBrowserActivity : DaggerAppCompatActivity() { window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD) window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED) - window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON) + + setupWakeBroadcastReceiver() + + val filter = IntentFilter() + filter.addAction(BROADCAST_SCREEN_WAKE) + filter.addAction(BROADCAST_SCREEN_WAKE_ON) + filter.addAction(BROADCAST_SCREEN_WAKE_OFF) + val bm = LocalBroadcastManager.getInstance(this) + bm.registerReceiver(mWakeBroadcastReceiver, filter) decorView = window.decorView @@ -173,9 +186,6 @@ abstract class BaseBrowserActivity : DaggerAppCompatActivity() { filter.addAction(BROADCAST_CLEAR_ALERT_MESSAGE) filter.addAction(BROADCAST_ALERT_MESSAGE) filter.addAction(BROADCAST_TOAST_MESSAGE) - filter.addAction(BROADCAST_SCREEN_WAKE) - filter.addAction(BROADCAST_SCREEN_WAKE_ON) - filter.addAction(BROADCAST_SCREEN_WAKE_OFF) filter.addAction(BROADCAST_SERVICE_STARTED) val bm = LocalBroadcastManager.getInstance(this) bm.registerReceiver(mBroadcastReceiver, filter) @@ -196,13 +206,7 @@ abstract class BaseBrowserActivity : DaggerAppCompatActivity() { WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED ) } - if (configuration.appPreventSleep) { - window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) - decorView?.keepScreenOn = true - } else { - window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) - decorView?.keepScreenOn = false - } + decorView?.keepScreenOn = configuration.appPreventSleep wallPanelService = Intent(this, WallPanelService::class.java) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { startForegroundService(wallPanelService) @@ -216,7 +220,6 @@ abstract class BaseBrowserActivity : DaggerAppCompatActivity() { super.onDestroy() inactivityHandler.removeCallbacks(inactivityCallback) window.clearFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED) - window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } override fun onUserInteraction() { @@ -235,6 +238,15 @@ abstract class BaseBrowserActivity : DaggerAppCompatActivity() { } } + fun setupWakeBroadcastReceiver(){ + val filter = IntentFilter() + filter.addAction(BROADCAST_SCREEN_WAKE) + filter.addAction(BROADCAST_SCREEN_WAKE_ON) + filter.addAction(BROADCAST_SCREEN_WAKE_OFF) + val bm = LocalBroadcastManager.getInstance(this) + bm.registerReceiver(mWakeBroadcastReceiver, filter) + } + fun setDarkTheme() { val nightMode = AppCompatDelegate.getDefaultNightMode() if (nightMode == AppCompatDelegate.MODE_NIGHT_NO || nightMode == AppCompatDelegate.MODE_NIGHT_UNSPECIFIED) { @@ -315,7 +327,6 @@ abstract class BaseBrowserActivity : DaggerAppCompatActivity() { open fun hideScreenSaver() { Timber.d("hideScreenSaver") val isScreenSaver = dialogUtils.hideScreenSaverDialog() - window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) if (isScreenSaver) { resetScreenBrightness(false) }