Răsfoiți Sursa

PassCodeManager: use abstracted Clock implementation rather than system clock directly

Improves testability

Signed-off-by: Álvaro Brey Vilas <alvaro.brey@nextcloud.com>
Álvaro Brey Vilas 3 ani în urmă
părinte
comite
df3c98a0c4

+ 1 - 0
src/main/java/com/nextcloud/client/core/Clock.kt

@@ -25,5 +25,6 @@ import java.util.TimeZone
 interface Clock {
     val currentTime: Long
     val currentDate: Date
+    val millisSinceBoot: Long
     val tz: TimeZone
 }

+ 6 - 6
src/main/java/com/nextcloud/client/core/ClockImpl.kt

@@ -19,19 +19,19 @@
  */
 package com.nextcloud.client.core
 
+import android.os.SystemClock
 import java.util.Date
 import java.util.TimeZone
 
 class ClockImpl : Clock {
     override val currentTime: Long
-        get() {
-            return System.currentTimeMillis()
-        }
+        get() = System.currentTimeMillis()
 
     override val currentDate: Date
-        get() {
-            return Date(currentTime)
-        }
+        get() = Date(currentTime)
+
+    override val millisSinceBoot: Long
+        get() = SystemClock.elapsedRealtime()
 
     override val tz: TimeZone
         get() = TimeZone.getDefault()

+ 2 - 2
src/main/java/com/nextcloud/client/di/AppModule.java

@@ -242,7 +242,7 @@ class AppModule {
 
     @Provides
     @Singleton
-    PassCodeManager passCodeManager(AppPreferences preferences) {
-        return new PassCodeManager(preferences);
+    PassCodeManager passCodeManager(AppPreferences preferences, Clock clock) {
+        return new PassCodeManager(preferences, clock);
     }
 }

+ 0 - 1
src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java

@@ -676,7 +676,6 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
         onlyAdd = intent.getBooleanExtra(KEY_ONLY_ADD, false) || checkIfViaSSO(intent);
 
         // Passcode
-        PassCodeManager passCodeManager = new PassCodeManager(preferences);
         passCodeManager.onActivityStarted(this);
 
         Uri data = intent.getData();

+ 4 - 4
src/main/java/com/owncloud/android/authentication/PassCodeManager.kt

@@ -23,8 +23,8 @@ import android.app.Activity
 import android.content.Context
 import android.content.Intent
 import android.os.PowerManager
-import android.os.SystemClock
 import android.view.WindowManager
+import com.nextcloud.client.core.Clock
 import com.nextcloud.client.preferences.AppPreferences
 import com.owncloud.android.MainApp
 import com.owncloud.android.ui.activity.PassCodeActivity
@@ -34,7 +34,7 @@ import com.owncloud.android.utils.DeviceCredentialUtils
 import kotlin.math.abs
 
 @Suppress("TooManyFunctions")
-class PassCodeManager(private val preferences: AppPreferences) {
+class PassCodeManager(private val preferences: AppPreferences, private val clock: Clock) {
     companion object {
         private val exemptOfPasscodeActivities = setOf(
             PassCodeActivity::class.java,
@@ -118,14 +118,14 @@ class PassCodeManager(private val preferences: AppPreferences) {
     }
 
     fun updateLockTimestamp() {
-        preferences.lockTimestamp = SystemClock.elapsedRealtime()
+        preferences.lockTimestamp = clock.millisSinceBoot
     }
 
     /**
      * `true` if the time elapsed since last unlock is longer than [PASS_CODE_TIMEOUT] and no activities are visible
      */
     private fun shouldBeLocked(timestamp: Long) =
-        abs(SystemClock.elapsedRealtime() - timestamp) > PASS_CODE_TIMEOUT &&
+        abs(clock.millisSinceBoot - timestamp) > PASS_CODE_TIMEOUT &&
             visibleActivitiesCounter <= 0
 
     private fun passCodeShouldBeRequested(timestamp: Long): Boolean {