I created a separate activity for kiosk mode
The main idea is to rid this task of other actions and keep the lock task always in the root of the stack
View.post(...) and similar ones with magic delay do not work for me
onResume() with isFinishing() works fine, but be careful with a clear task and / or with a transparent top
<style name="AppTheme.Transparent" parent="android:style/Theme.Translucent.NoTitleBar.Fullscreen"> <item name="android:colorPrimary">@color/colorPrimary</item> <item name="android:colorPrimaryDark">@color/colorPrimaryDark</item> <item name="android:colorAccent">@color/colorAccent</item> <item name="android:windowIsTranslucent">true</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowContentOverlay">@null</item> <item name="android:windowNoTitle">true</item> <item name="android:windowIsFloating">true</item> <item name="android:backgroundDimEnabled">false</item> </style>
class LockActivity : Activity() { private lateinit var adminManager: AdminManager override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) adminManager = AdminManager(applicationContext) } override fun onStart() { super.onStart() when (activityManager.lockTaskModeState) { ActivityManager.LOCK_TASK_MODE_NONE -> { if () { if (adminManager.setKioskMode(true)) { return } else { toast("HAVE NO OWNER RIGHTS") } } } ActivityManager.LOCK_TASK_MODE_LOCKED -> { if () { if (adminManager.setKioskMode(false)) { stopLockTask() } else { toast("HAVE NO OWNER RIGHTS") } } } } startActivity<LoginActivity>() finish() } override fun onResume() { super.onResume() if (!isFinishing) { startLockTask() startActivity<LoginActivity>() } } override fun onBackPressed() {} }
class AdminManager(context: Context) { private val adminComponent = ComponentName(context, AdminReceiver::class.java) private val deviceManager = context.devicePolicyManager private val packageName = context.packageName @Suppress("unused") val isAdmin: Boolean get() = deviceManager.isAdminActive(adminComponent) val isDeviceOwner: Boolean get() = deviceManager.isDeviceOwnerApp(packageName) fun setKioskMode(enable: Boolean): Boolean { if (isDeviceOwner) { setRestrictions(enable) setKeyGuardEnabled(enable) setLockTask(enable) return true } return false } private fun setRestrictions(disallow: Boolean) { arrayOf( UserManager.DISALLOW_FACTORY_RESET, UserManager.DISALLOW_SAFE_BOOT, UserManager.DISALLOW_USER_SWITCH, UserManager.DISALLOW_ADD_USER ).forEach { if (disallow) { deviceManager.addUserRestriction(adminComponent, it) } else { deviceManager.clearUserRestriction(adminComponent, it) } } } private fun setKeyGuardEnabled(enable: Boolean) { deviceManager.setKeyguardDisabled(adminComponent, !enable) } private fun setLockTask(enable: Boolean) { if (enable) { deviceManager.setLockTaskPackages(adminComponent, arrayOf(packageName)) } else { deviceManager.setLockTaskPackages(adminComponent, arrayOf()) } } }
source share