blob: 7f85786e35035ea017505c77eb5190d42dae2e40 [file] [log] [blame]
/*
* Copyright 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.internal.telephony.nitz;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.timedetector.TelephonyTimeSuggestion;
import android.app.timedetector.TimeDetector;
import android.app.timezonedetector.TelephonyTimeZoneSuggestion;
import android.app.timezonedetector.TimeZoneDetector;
import android.content.Context;
import android.os.SystemClock;
import android.os.TimestampedValue;
import android.util.LocalLog;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.metrics.TelephonyMetrics;
import com.android.internal.util.IndentingPrintWriter;
import java.io.PrintWriter;
import java.util.Objects;
/**
* The real implementation of {@link TimeServiceHelper}.
*/
public final class TimeServiceHelperImpl implements TimeServiceHelper {
private final int mSlotIndex;
private final TimeDetector mTimeDetector;
private final TimeZoneDetector mTimeZoneDetector;
private final LocalLog mTimeZoneLog = new LocalLog(30, false /* mUseLocalTimestamps */);
private final LocalLog mTimeLog = new LocalLog(30, false /* mUseLocalTimestamps */);
/**
* Records the last time zone suggestion made. Used to avoid sending duplicate suggestions to
* the time zone service. The value can be {@code null} to indicate no previous suggestion has
* been made.
*/
@NonNull
private TelephonyTimeZoneSuggestion mLastSuggestedTimeZone;
public TimeServiceHelperImpl(@NonNull Phone phone) {
mSlotIndex = phone.getPhoneId();
Context context = Objects.requireNonNull(phone.getContext());
mTimeDetector = Objects.requireNonNull(context.getSystemService(TimeDetector.class));
mTimeZoneDetector =
Objects.requireNonNull(context.getSystemService(TimeZoneDetector.class));
}
@Override
public void suggestDeviceTime(@NonNull TelephonyTimeSuggestion timeSuggestion) {
mTimeLog.log("Sending time suggestion: " + timeSuggestion);
Objects.requireNonNull(timeSuggestion);
if (timeSuggestion.getUtcTime() != null) {
TimestampedValue<Long> utcTime = timeSuggestion.getUtcTime();
TelephonyMetrics.getInstance().writeNITZEvent(mSlotIndex, utcTime.getValue());
}
mTimeDetector.suggestTelephonyTime(timeSuggestion);
}
@Override
public void maybeSuggestDeviceTimeZone(@NonNull TelephonyTimeZoneSuggestion newSuggestion) {
Objects.requireNonNull(newSuggestion);
TelephonyTimeZoneSuggestion oldSuggestion = mLastSuggestedTimeZone;
if (shouldSendNewTimeZoneSuggestion(oldSuggestion, newSuggestion)) {
mTimeZoneLog.log("Suggesting time zone update: " + newSuggestion);
mTimeZoneDetector.suggestTelephonyTimeZone(newSuggestion);
mLastSuggestedTimeZone = newSuggestion;
}
}
private static boolean shouldSendNewTimeZoneSuggestion(
@Nullable TelephonyTimeZoneSuggestion oldSuggestion,
@NonNull TelephonyTimeZoneSuggestion newSuggestion) {
if (oldSuggestion == null) {
// No previous suggestion.
return true;
}
// This code relies on PhoneTimeZoneSuggestion.equals() to only check meaningful fields.
return !Objects.equals(newSuggestion, oldSuggestion);
}
@Override
public void dumpLogs(IndentingPrintWriter ipw) {
ipw.println("TimeServiceHelperImpl:");
ipw.increaseIndent();
ipw.println("SystemClock.elapsedRealtime()=" + SystemClock.elapsedRealtime());
ipw.println("System.currentTimeMillis()=" + System.currentTimeMillis());
ipw.println("Time Logs:");
ipw.increaseIndent();
mTimeLog.dump(ipw);
ipw.decreaseIndent();
ipw.println("Time zone Logs:");
ipw.increaseIndent();
mTimeZoneLog.dump(ipw);
ipw.decreaseIndent();
ipw.decreaseIndent();
}
@Override
public void dumpState(PrintWriter pw) {
pw.println(" TimeServiceHelperImpl.mLastSuggestedTimeZone=" + mLastSuggestedTimeZone);
}
}