Loading services/core/java/com/android/server/timedetector/TimeDetectorStrategyImpl.java +50 −43 Original line number Diff line number Diff line Loading @@ -300,6 +300,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy { } @Override @NonNull public synchronized TimeState getTimeState() { boolean userShouldConfirmTime = mEnvironment.systemClockConfidence() < TIME_CONFIDENCE_HIGH; UnixEpochTime unixEpochTime = new UnixEpochTime( Loading Loading @@ -330,38 +331,33 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy { public synchronized boolean confirmTime(@NonNull UnixEpochTime confirmationTime) { Objects.requireNonNull(confirmationTime); @TimeConfidence int newTimeConfidence = TIME_CONFIDENCE_HIGH; @TimeConfidence int currentTimeConfidence = mEnvironment.systemClockConfidence(); boolean timeNeedsConfirmation = currentTimeConfidence < newTimeConfidence; // All system clock calculation take place under a wake lock. mEnvironment.acquireWakeLock(); try { // Check if the specified time matches the current system clock time (closely // enough) to raise the confidence. long elapsedRealtimeMillis = mEnvironment.elapsedRealtimeMillis(); long actualSystemClockMillis = mEnvironment.systemClockMillis(); long adjustedAutoDetectedUnixEpochMillis = confirmationTime.at(elapsedRealtimeMillis).getUnixEpochTimeMillis(); long absTimeDifferenceMillis = Math.abs(adjustedAutoDetectedUnixEpochMillis - actualSystemClockMillis); int confidenceUpgradeThresholdMillis = mCurrentConfigurationInternal.getSystemClockConfidenceThresholdMillis(); boolean timeConfirmed = absTimeDifferenceMillis <= confidenceUpgradeThresholdMillis; boolean updateConfidenceRequired = timeNeedsConfirmation && timeConfirmed; if (updateConfidenceRequired) { long currentElapsedRealtimeMillis = mEnvironment.elapsedRealtimeMillis(); long currentSystemClockMillis = mEnvironment.systemClockMillis(); boolean timeConfirmed = isTimeWithinConfidenceThreshold( confirmationTime, currentElapsedRealtimeMillis, currentSystemClockMillis); if (timeConfirmed) { @TimeConfidence int newTimeConfidence = TIME_CONFIDENCE_HIGH; @TimeConfidence int currentTimeConfidence = mEnvironment.systemClockConfidence(); boolean confidenceUpgradeRequired = currentTimeConfidence < newTimeConfidence; if (confidenceUpgradeRequired) { String logMsg = "Confirm system clock time." + " confirmationTime=" + confirmationTime + " newTimeConfidence=" + newTimeConfidence + " elapsedRealtimeMillis=" + elapsedRealtimeMillis + " (old) actualSystemClockMillis=" + actualSystemClockMillis + " currentTimeConfidence=" + currentTimeConfidence; + " currentElapsedRealtimeMillis=" + currentElapsedRealtimeMillis + " currentSystemClockMillis=" + currentSystemClockMillis + " (old) currentTimeConfidence=" + currentTimeConfidence; if (DBG) { Slog.d(LOG_TAG, logMsg); } mEnvironment.setSystemClockConfidence(newTimeConfidence, logMsg); } } return timeConfirmed; } finally { mEnvironment.releaseWakeLock(); Loading Loading @@ -470,8 +466,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy { } @GuardedBy("this") private boolean storeTelephonySuggestion( @NonNull TelephonyTimeSuggestion suggestion) { private boolean storeTelephonySuggestion(@NonNull TelephonyTimeSuggestion suggestion) { UnixEpochTime newUnixEpochTime = suggestion.getUnixEpochTime(); int slotIndex = suggestion.getSlotIndex(); Loading Loading @@ -712,7 +707,8 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy { } private static int scoreTelephonySuggestion( long elapsedRealtimeMillis, @NonNull TelephonyTimeSuggestion timeSuggestion) { @ElapsedRealtimeLong long elapsedRealtimeMillis, @NonNull TelephonyTimeSuggestion timeSuggestion) { // Validate first. UnixEpochTime unixEpochTime = timeSuggestion.getUnixEpochTime(); Loading Loading @@ -845,10 +841,12 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy { @GuardedBy("this") private void upgradeSystemClockConfidenceIfRequired( @NonNull UnixEpochTime autoDetectedUnixEpochTime, @NonNull String cause) { // Fast path: No need to upgrade confidence if confidence is already high. @TimeConfidence int newTimeConfidence = TIME_CONFIDENCE_HIGH; @TimeConfidence int currentTimeConfidence = mEnvironment.systemClockConfidence(); boolean timeNeedsConfirmation = currentTimeConfidence < newTimeConfidence; if (!timeNeedsConfirmation) { boolean confidenceUpgradeRequired = currentTimeConfidence < newTimeConfidence; if (!confidenceUpgradeRequired) { return; } Loading @@ -857,23 +855,18 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy { try { // Check if the specified time matches the current system clock time (closely // enough) to raise the confidence. long elapsedRealtimeMillis = mEnvironment.elapsedRealtimeMillis(); long actualSystemClockMillis = mEnvironment.systemClockMillis(); long adjustedAutoDetectedUnixEpochMillis = autoDetectedUnixEpochTime.at(elapsedRealtimeMillis).getUnixEpochTimeMillis(); long absTimeDifferenceMillis = Math.abs(adjustedAutoDetectedUnixEpochMillis - actualSystemClockMillis); int confidenceUpgradeThresholdMillis = mCurrentConfigurationInternal.getSystemClockConfidenceThresholdMillis(); boolean updateConfidenceRequired = absTimeDifferenceMillis <= confidenceUpgradeThresholdMillis; long currentElapsedRealtimeMillis = mEnvironment.elapsedRealtimeMillis(); long currentSystemClockMillis = mEnvironment.systemClockMillis(); boolean updateConfidenceRequired = isTimeWithinConfidenceThreshold( autoDetectedUnixEpochTime, currentElapsedRealtimeMillis, currentSystemClockMillis); if (updateConfidenceRequired) { String logMsg = "Upgrade system clock confidence." + " autoDetectedUnixEpochTime=" + autoDetectedUnixEpochTime + " newTimeConfidence=" + newTimeConfidence + " cause=" + cause + " elapsedRealtimeMillis=" + elapsedRealtimeMillis + " (old) actualSystemClockMillis=" + actualSystemClockMillis + " currentElapsedRealtimeMillis=" + currentElapsedRealtimeMillis + " currentSystemClockMillis=" + currentSystemClockMillis + " currentTimeConfidence=" + currentTimeConfidence; if (DBG) { Slog.d(LOG_TAG, logMsg); Loading @@ -890,6 +883,19 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy { return origin != ORIGIN_MANUAL; } @GuardedBy("this") private boolean isTimeWithinConfidenceThreshold(@NonNull UnixEpochTime timeToCheck, @ElapsedRealtimeLong long currentElapsedRealtimeMillis, @CurrentTimeMillisLong long currentSystemClockMillis) { long adjustedAutoDetectedUnixEpochMillis = timeToCheck.at(currentElapsedRealtimeMillis).getUnixEpochTimeMillis(); long absTimeDifferenceMillis = Math.abs(adjustedAutoDetectedUnixEpochMillis - currentSystemClockMillis); int confidenceUpgradeThresholdMillis = mCurrentConfigurationInternal.getSystemClockConfidenceThresholdMillis(); return absTimeDifferenceMillis <= confidenceUpgradeThresholdMillis; } @GuardedBy("this") private boolean setSystemClockAndConfidenceUnderWakeLock( @Origin int origin, @NonNull UnixEpochTime newTime, Loading Loading @@ -1066,7 +1072,8 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy { } private static boolean validateSuggestionUnixEpochTime( long currentElapsedRealtimeMillis, UnixEpochTime unixEpochTime) { @ElapsedRealtimeLong long currentElapsedRealtimeMillis, @NonNull UnixEpochTime unixEpochTime) { long suggestionElapsedRealtimeMillis = unixEpochTime.getElapsedRealtimeMillis(); if (suggestionElapsedRealtimeMillis > currentElapsedRealtimeMillis) { // Future elapsed realtimes are ignored. They imply the elapsed realtime was wrong, or Loading Loading
services/core/java/com/android/server/timedetector/TimeDetectorStrategyImpl.java +50 −43 Original line number Diff line number Diff line Loading @@ -300,6 +300,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy { } @Override @NonNull public synchronized TimeState getTimeState() { boolean userShouldConfirmTime = mEnvironment.systemClockConfidence() < TIME_CONFIDENCE_HIGH; UnixEpochTime unixEpochTime = new UnixEpochTime( Loading Loading @@ -330,38 +331,33 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy { public synchronized boolean confirmTime(@NonNull UnixEpochTime confirmationTime) { Objects.requireNonNull(confirmationTime); @TimeConfidence int newTimeConfidence = TIME_CONFIDENCE_HIGH; @TimeConfidence int currentTimeConfidence = mEnvironment.systemClockConfidence(); boolean timeNeedsConfirmation = currentTimeConfidence < newTimeConfidence; // All system clock calculation take place under a wake lock. mEnvironment.acquireWakeLock(); try { // Check if the specified time matches the current system clock time (closely // enough) to raise the confidence. long elapsedRealtimeMillis = mEnvironment.elapsedRealtimeMillis(); long actualSystemClockMillis = mEnvironment.systemClockMillis(); long adjustedAutoDetectedUnixEpochMillis = confirmationTime.at(elapsedRealtimeMillis).getUnixEpochTimeMillis(); long absTimeDifferenceMillis = Math.abs(adjustedAutoDetectedUnixEpochMillis - actualSystemClockMillis); int confidenceUpgradeThresholdMillis = mCurrentConfigurationInternal.getSystemClockConfidenceThresholdMillis(); boolean timeConfirmed = absTimeDifferenceMillis <= confidenceUpgradeThresholdMillis; boolean updateConfidenceRequired = timeNeedsConfirmation && timeConfirmed; if (updateConfidenceRequired) { long currentElapsedRealtimeMillis = mEnvironment.elapsedRealtimeMillis(); long currentSystemClockMillis = mEnvironment.systemClockMillis(); boolean timeConfirmed = isTimeWithinConfidenceThreshold( confirmationTime, currentElapsedRealtimeMillis, currentSystemClockMillis); if (timeConfirmed) { @TimeConfidence int newTimeConfidence = TIME_CONFIDENCE_HIGH; @TimeConfidence int currentTimeConfidence = mEnvironment.systemClockConfidence(); boolean confidenceUpgradeRequired = currentTimeConfidence < newTimeConfidence; if (confidenceUpgradeRequired) { String logMsg = "Confirm system clock time." + " confirmationTime=" + confirmationTime + " newTimeConfidence=" + newTimeConfidence + " elapsedRealtimeMillis=" + elapsedRealtimeMillis + " (old) actualSystemClockMillis=" + actualSystemClockMillis + " currentTimeConfidence=" + currentTimeConfidence; + " currentElapsedRealtimeMillis=" + currentElapsedRealtimeMillis + " currentSystemClockMillis=" + currentSystemClockMillis + " (old) currentTimeConfidence=" + currentTimeConfidence; if (DBG) { Slog.d(LOG_TAG, logMsg); } mEnvironment.setSystemClockConfidence(newTimeConfidence, logMsg); } } return timeConfirmed; } finally { mEnvironment.releaseWakeLock(); Loading Loading @@ -470,8 +466,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy { } @GuardedBy("this") private boolean storeTelephonySuggestion( @NonNull TelephonyTimeSuggestion suggestion) { private boolean storeTelephonySuggestion(@NonNull TelephonyTimeSuggestion suggestion) { UnixEpochTime newUnixEpochTime = suggestion.getUnixEpochTime(); int slotIndex = suggestion.getSlotIndex(); Loading Loading @@ -712,7 +707,8 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy { } private static int scoreTelephonySuggestion( long elapsedRealtimeMillis, @NonNull TelephonyTimeSuggestion timeSuggestion) { @ElapsedRealtimeLong long elapsedRealtimeMillis, @NonNull TelephonyTimeSuggestion timeSuggestion) { // Validate first. UnixEpochTime unixEpochTime = timeSuggestion.getUnixEpochTime(); Loading Loading @@ -845,10 +841,12 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy { @GuardedBy("this") private void upgradeSystemClockConfidenceIfRequired( @NonNull UnixEpochTime autoDetectedUnixEpochTime, @NonNull String cause) { // Fast path: No need to upgrade confidence if confidence is already high. @TimeConfidence int newTimeConfidence = TIME_CONFIDENCE_HIGH; @TimeConfidence int currentTimeConfidence = mEnvironment.systemClockConfidence(); boolean timeNeedsConfirmation = currentTimeConfidence < newTimeConfidence; if (!timeNeedsConfirmation) { boolean confidenceUpgradeRequired = currentTimeConfidence < newTimeConfidence; if (!confidenceUpgradeRequired) { return; } Loading @@ -857,23 +855,18 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy { try { // Check if the specified time matches the current system clock time (closely // enough) to raise the confidence. long elapsedRealtimeMillis = mEnvironment.elapsedRealtimeMillis(); long actualSystemClockMillis = mEnvironment.systemClockMillis(); long adjustedAutoDetectedUnixEpochMillis = autoDetectedUnixEpochTime.at(elapsedRealtimeMillis).getUnixEpochTimeMillis(); long absTimeDifferenceMillis = Math.abs(adjustedAutoDetectedUnixEpochMillis - actualSystemClockMillis); int confidenceUpgradeThresholdMillis = mCurrentConfigurationInternal.getSystemClockConfidenceThresholdMillis(); boolean updateConfidenceRequired = absTimeDifferenceMillis <= confidenceUpgradeThresholdMillis; long currentElapsedRealtimeMillis = mEnvironment.elapsedRealtimeMillis(); long currentSystemClockMillis = mEnvironment.systemClockMillis(); boolean updateConfidenceRequired = isTimeWithinConfidenceThreshold( autoDetectedUnixEpochTime, currentElapsedRealtimeMillis, currentSystemClockMillis); if (updateConfidenceRequired) { String logMsg = "Upgrade system clock confidence." + " autoDetectedUnixEpochTime=" + autoDetectedUnixEpochTime + " newTimeConfidence=" + newTimeConfidence + " cause=" + cause + " elapsedRealtimeMillis=" + elapsedRealtimeMillis + " (old) actualSystemClockMillis=" + actualSystemClockMillis + " currentElapsedRealtimeMillis=" + currentElapsedRealtimeMillis + " currentSystemClockMillis=" + currentSystemClockMillis + " currentTimeConfidence=" + currentTimeConfidence; if (DBG) { Slog.d(LOG_TAG, logMsg); Loading @@ -890,6 +883,19 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy { return origin != ORIGIN_MANUAL; } @GuardedBy("this") private boolean isTimeWithinConfidenceThreshold(@NonNull UnixEpochTime timeToCheck, @ElapsedRealtimeLong long currentElapsedRealtimeMillis, @CurrentTimeMillisLong long currentSystemClockMillis) { long adjustedAutoDetectedUnixEpochMillis = timeToCheck.at(currentElapsedRealtimeMillis).getUnixEpochTimeMillis(); long absTimeDifferenceMillis = Math.abs(adjustedAutoDetectedUnixEpochMillis - currentSystemClockMillis); int confidenceUpgradeThresholdMillis = mCurrentConfigurationInternal.getSystemClockConfidenceThresholdMillis(); return absTimeDifferenceMillis <= confidenceUpgradeThresholdMillis; } @GuardedBy("this") private boolean setSystemClockAndConfidenceUnderWakeLock( @Origin int origin, @NonNull UnixEpochTime newTime, Loading Loading @@ -1066,7 +1072,8 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy { } private static boolean validateSuggestionUnixEpochTime( long currentElapsedRealtimeMillis, UnixEpochTime unixEpochTime) { @ElapsedRealtimeLong long currentElapsedRealtimeMillis, @NonNull UnixEpochTime unixEpochTime) { long suggestionElapsedRealtimeMillis = unixEpochTime.getElapsedRealtimeMillis(); if (suggestionElapsedRealtimeMillis > currentElapsedRealtimeMillis) { // Future elapsed realtimes are ignored. They imply the elapsed realtime was wrong, or Loading