From bad426ac6fb47b432b58e895fe0b4d4c5ee2713c Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Fri, 5 Jun 2026 10:52:15 +0200 Subject: [PATCH] screen lock improvements Signed-off-by: Marcel Hibbe --- .../nextcloud/talk/activities/BaseActivity.kt | 30 +++++++++++++++++-- .../nextcloud/talk/activities/MainActivity.kt | 5 +++- .../application/NextcloudTalkApplication.kt | 8 ++++- .../ConversationsListActivity.kt | 5 ---- app/src/main/res/values-v28/arrays.xml | 2 +- app/src/main/res/values/arrays.xml | 2 +- 6 files changed, 40 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/activities/BaseActivity.kt b/app/src/main/java/com/nextcloud/talk/activities/BaseActivity.kt index 70e20f7af23..f2ba84170fd 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/BaseActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/activities/BaseActivity.kt @@ -15,6 +15,7 @@ import android.content.Intent import android.os.Build import android.os.Bundle import android.text.TextUtils +import android.text.format.DateUtils import android.util.Log import android.view.View import android.view.ViewGroup @@ -97,11 +98,22 @@ open class BaseActivity : AppCompatActivity() { fun lockScreenIfConditionsApply() { val keyguardManager = getSystemService(KEYGUARD_SERVICE) as KeyguardManager - if (!keyguardManager.isKeyguardSecure || !appPreferences.isScreenLocked) return + val isKeyguardSecure = keyguardManager.isKeyguardSecure + val isScreenLocked = appPreferences.isScreenLocked + Log.d(TAG, "lockScreenIfConditionsApply: isKeyguardSecure=$isKeyguardSecure isScreenLocked=$isScreenLocked") + if (!isKeyguardSecure || !isScreenLocked) return try { val timeoutSeconds = SecurityUtils.getIntegerFromStringTimeout(appPreferences.screenLockTimeout) - val elapsedSeconds = (System.currentTimeMillis() - appPreferences.lockTimestamp) / 1000 - if (elapsedSeconds >= timeoutSeconds) { + val lockTimestamp = appPreferences.lockTimestamp + val elapsedSeconds = (System.currentTimeMillis() - lockTimestamp) / DateUtils.SECOND_IN_MILLIS + Log.d( + TAG, + "lockScreenIfConditionsApply: " + + "timeoutSeconds=$timeoutSeconds " + + "lockTimestamp=$lockTimestamp " + + "elapsedSeconds=$elapsedSeconds" + ) + if (timeoutSeconds == 0 || elapsedSeconds >= timeoutSeconds) { startActivity(Intent(this, LockedActivity::class.java)) } } catch (e: Exception) { @@ -122,8 +134,20 @@ open class BaseActivity : AppCompatActivity() { eventBus.register(this) } + protected open val skipLockCheckOnResume: Boolean = false + public override fun onResume() { super.onResume() + Log.d( + TAG, + "onResume: " + + "pendingLockCheck=${NextcloudTalkApplication.pendingLockCheck} " + + "activity=${this.javaClass.simpleName}" + ) + if (!skipLockCheckOnResume && NextcloudTalkApplication.pendingLockCheck) { + NextcloudTalkApplication.pendingLockCheck = false + lockScreenIfConditionsApply() + } if (appPreferences.isKeyboardIncognito) { val viewGroup = (findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup diff --git a/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt b/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt index 29f3b76bb3d..1c0e68bd103 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt @@ -58,6 +58,10 @@ class MainActivity : @Inject lateinit var userManager: UserManager + // MainActivity only routes to ConversationsListActivity or ChatActivity and is never + // visible to the user. The lock check must run in the actual destination activity. + override val skipLockCheckOnResume: Boolean = true + private val disposables = CompositeDisposable() private val onBackPressedCallback = object : OnBackPressedCallback(true) { @@ -108,7 +112,6 @@ class MainActivity : override fun onStart() { Log.d(TAG, "onStart: Activity: " + System.identityHashCode(this).toString()) super.onStart() - lockScreenIfConditionsApply() } override fun onResume() { diff --git a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt index fefa53d474e..cb4d5dc8762 100644 --- a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt +++ b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt @@ -171,7 +171,10 @@ class NextcloudTalkApplication : ProcessLifecycleOwner.get().lifecycle.addObserver(object : DefaultLifecycleObserver { override fun onStop(owner: LifecycleOwner) { - appPreferences.setLockTimestamp(System.currentTimeMillis()) + val ts = System.currentTimeMillis() + Log.d(TAG, "ProcessLifecycle onStop: saving lockTimestamp=$ts") + appPreferences.setLockTimestamp(ts) + pendingLockCheck = true } }) @@ -270,6 +273,9 @@ class NextcloudTalkApplication : var sharedApplication: NextcloudTalkApplication? = null protected set + + @Volatile + var pendingLockCheck = true //endregion //region Setters diff --git a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt index 4784b0293a9..fd3c2546ef6 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt @@ -373,11 +373,6 @@ class ConversationsListActivity : BaseActivity() { } } - override fun onStart() { - super.onStart() - lockScreenIfConditionsApply() - } - override fun onResume() { super.onResume() scrollPositionRestored = false diff --git a/app/src/main/res/values-v28/arrays.xml b/app/src/main/res/values-v28/arrays.xml index baf10f3536c..6d4a8d328b0 100644 --- a/app/src/main/res/values-v28/arrays.xml +++ b/app/src/main/res/values-v28/arrays.xml @@ -42,7 +42,7 @@ - 1 + 0 30 60 300 diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index d2f5c3c33a9..00c1a43ac7c 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -61,7 +61,7 @@ - 1 + 0 30 60 300