Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d8aa23e1 authored by Neil Fuller's avatar Neil Fuller Committed by Gerrit Code Review
Browse files

Merge "Remove some duplication of validation logic"

parents 43146165 ab4706bc
Loading
Loading
Loading
Loading
+46 −38
Original line number Diff line number Diff line
@@ -114,16 +114,10 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
    }

    @Override
    public synchronized void suggestManualTime(ManualTimeSuggestion suggestion) {
    public synchronized void suggestManualTime(@NonNull ManualTimeSuggestion suggestion) {
        final TimestampedValue<Long> newUtcTime = suggestion.getUtcTime();

        // We can validate the suggestion against the reference time clock.
        long elapsedRealtimeMillis = mCallback.elapsedRealtimeMillis();
        if (elapsedRealtimeMillis < newUtcTime.getReferenceTimeMillis()) {
            // elapsedRealtime clock went backwards?
            Slog.w(LOG_TAG, "New reference time is in the future? Ignoring."
                    + " elapsedRealtimeMillis=" + elapsedRealtimeMillis
                    + ", timeSuggestion=" + suggestion);
        if (!validateSuggestionTime(newUtcTime, suggestion)) {
            return;
        }

@@ -202,62 +196,76 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
    }

    @GuardedBy("this")
    private boolean validateAndStorePhoneSuggestion(@NonNull PhoneTimeSuggestion timeSuggestion) {
        if (timeSuggestion.getUtcTime().getValue() == null) {
            Slog.w(LOG_TAG, "Suggestion utcTime contains null value"
                    + " timeSuggestion=" + timeSuggestion);
    private boolean validateAndStorePhoneSuggestion(@NonNull PhoneTimeSuggestion suggestion) {
        TimestampedValue<Long> newUtcTime = suggestion.getUtcTime();
        if (!validateSuggestionTime(newUtcTime, suggestion)) {
            // There's probably nothing useful we can do: elsewhere we assume that reference
            // times are in the past so just stop here.
            return false;
        }

        int phoneId = timeSuggestion.getPhoneId();
        int phoneId = suggestion.getPhoneId();
        LinkedList<PhoneTimeSuggestion> phoneSuggestions = mSuggestionByPhoneId.get(phoneId);
        if (phoneSuggestions == null) {
            // The first time we've seen this phoneId.
            phoneSuggestions = new LinkedList<>();
            mSuggestionByPhoneId.put(phoneId, phoneSuggestions);
        } else if (phoneSuggestions.isEmpty()) {
            Slog.w(LOG_TAG, "Suggestions unexpectedly empty when adding"
                    + " timeSuggestion=" + timeSuggestion);
            Slog.w(LOG_TAG, "Suggestions unexpectedly empty when adding suggestion=" + suggestion);
        }

        if (!phoneSuggestions.isEmpty()) {
            PhoneTimeSuggestion previousSuggestion = phoneSuggestions.getFirst();

            // We can log / discard suggestions with obvious issues with the reference time clock.
            long elapsedRealtimeMillis = mCallback.elapsedRealtimeMillis();
            TimestampedValue<Long> newTime = timeSuggestion.getUtcTime();
            if (elapsedRealtimeMillis < newTime.getReferenceTimeMillis()) {
                // elapsedRealtime clock went backwards?
                Slog.w(LOG_TAG, "New reference time is in the future?"
                        + " elapsedRealtimeMillis=" + elapsedRealtimeMillis
                        + ", timeSuggestion=" + timeSuggestion);
                // There's probably nothing useful we can do: elsewhere we assume that reference
                // times are in the past so just stop here.
            PhoneTimeSuggestion previousSuggestion = phoneSuggestions.getFirst();
            if (previousSuggestion == null
                    || previousSuggestion.getUtcTime() == null
                    || previousSuggestion.getUtcTime().getValue() == null) {
                // This should be impossible given we only store validated suggestions.
                Slog.w(LOG_TAG, "Previous suggestion is null or has a null time."
                        + " previousSuggestion=" + previousSuggestion
                        + ", suggestion=" + suggestion);
                return false;
            }

            if (previousSuggestion.getUtcTime() != null) {
            long referenceTimeDifference = TimestampedValue.referenceTimeDifference(
                        timeSuggestion.getUtcTime(), previousSuggestion.getUtcTime());
                    newUtcTime, previousSuggestion.getUtcTime());
            if (referenceTimeDifference < 0) {
                // The reference time is before the previously received suggestion. Ignore it.
                Slog.w(LOG_TAG, "Out of order phone suggestion received."
                        + " referenceTimeDifference=" + referenceTimeDifference
                            + " lastSuggestion=" + previousSuggestion
                            + " newSuggestion=" + timeSuggestion);
                        + " previousSuggestion=" + previousSuggestion
                        + " suggestion=" + suggestion);
                return false;
            }
        }
        }

        // Store the latest suggestion.
        phoneSuggestions.addFirst(timeSuggestion);
        phoneSuggestions.addFirst(suggestion);
        if (phoneSuggestions.size() > KEEP_SUGGESTION_HISTORY_SIZE) {
            phoneSuggestions.removeLast();
        }
        return true;
    }

    private boolean validateSuggestionTime(
            @NonNull TimestampedValue<Long> newUtcTime, @NonNull Object suggestion) {
        if (newUtcTime.getValue() == null) {
            Slog.w(LOG_TAG, "Suggested time value is null. suggestion=" + suggestion);
            return false;
        }

        // We can validate the suggestion against the reference time clock.
        long elapsedRealtimeMillis = mCallback.elapsedRealtimeMillis();
        if (elapsedRealtimeMillis < newUtcTime.getReferenceTimeMillis()) {
            // elapsedRealtime clock went backwards?
            Slog.w(LOG_TAG, "New reference time is in the future? Ignoring."
                    + " elapsedRealtimeMillis=" + elapsedRealtimeMillis
                    + ", suggestion=" + suggestion);
            return false;
        }
        return true;
    }

    @GuardedBy("this")
    private void doAutoTimeDetection(@NonNull String detectionReason) {
        if (!mCallback.isAutoTimeDetectionEnabled()) {