Skip to content
This repository was archived by the owner on May 5, 2025. It is now read-only.
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -99,6 +100,7 @@ class WallPanelService : LifecycleService(), MQTTModule.MQTTListener {

private val mJpegSockets = ArrayList<AsyncHttpServerResponse>()
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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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()
}
Expand All @@ -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()
}
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -698,18 +721,17 @@ 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)
}

@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 {
Expand All @@ -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()
}

Expand Down Expand Up @@ -964,13 +984,15 @@ 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)
}

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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand All @@ -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

Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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() {
Expand All @@ -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) {
Expand Down Expand Up @@ -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)
}
Expand Down