package com.peachpasswords.ui.components import android.view.Window import android.view.WindowManager import java.util.WeakHashMap /** * The only owner of [WindowManager.LayoutParams.FLAG_SECURE] transitions. * * Release activities install a permanent policy and therefore no later * composable can accidentally clear the activity-wide protection. Debug-only * secret screens take reference-counted leases so nested effects cannot clear * the flag while another secret screen is still composed. Window instances are * weakly keyed because their lifecycle owns the actual resources. */ internal object SecureWindowPolicy { private data class State( var leases: Int = 0, var releaseOwned: Boolean = false, ) private val states = WeakHashMap() /** Install a release-wide owner that is never cleared for this window. */ fun installRelease(window: Window) { synchronized(states) { val state = states.getOrPut(window) { State() } state.releaseOwned = true window.setFlags( WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE, ) } } /** Acquire one debug/composable lease for a window. */ fun acquire(window: Window) { synchronized(states) { val state = states.getOrPut(window) { State() } state.leases++ window.setFlags( WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE, ) } } /** Release one lease; release-owned windows remain protected forever. */ fun release(window: Window) { synchronized(states) { val state = states[window] ?: return if (state.leases > 0) state.leases-- if (state.leases == 0 && !state.releaseOwned) { window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE) states.remove(window) } } } }