blob: 0f4367dddc6e4ad7e9b8d8c53ce2f7fa17bb5527 [file] [log] [blame]
/*
* Copyright (C) 2021 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.server.timezonedetector.location;
import static com.android.server.timezonedetector.location.LocationTimeZoneManagerService.infoLog;
import android.annotation.NonNull;
import com.android.i18n.timezone.ZoneInfoDb;
/**
* {@link TimeZoneProviderEventPreProcessor} implementation which makes validations against
* {@link ZoneInfoDb}.
*/
public class ZoneInfoDbTimeZoneProviderEventPreProcessor
implements TimeZoneProviderEventPreProcessor {
/**
* Returns uncertain event if {@code event} has at least one unsupported time zone ID.
*/
@Override
public TimeZoneProviderEvent preProcess(@NonNull TimeZoneProviderEvent event) {
if (event.getSuggestion() == null || event.getSuggestion().getTimeZoneIds().isEmpty()) {
return event;
}
// If the provider has made a suggestion with unknown time zone IDs it cannot be used to set
// the device's time zone. This logic prevents bad time zone IDs entering the time zone
// detection logic from third party code.
//
// An event containing an unknown time zone ID could occur if the provider is using a
// different TZDB version than the device. Provider developers are expected to take steps to
// avoid version skew problem, e.g. by ensuring atomic updates with the platform time zone
// rules, or providing IDs based on the device's TZDB version, so this is not considered a
// common case.
//
// Treating a suggestion containing unknown time zone IDs as "uncertain" in the primary
// enables immediate failover to a secondary provider, one that might provide valid IDs for
// the same location, which should provide better behavior than just ignoring the event.
if (hasInvalidZones(event)) {
return TimeZoneProviderEvent.createUncertainEvent();
}
return event;
}
private static boolean hasInvalidZones(TimeZoneProviderEvent event) {
for (String timeZone : event.getSuggestion().getTimeZoneIds()) {
if (!ZoneInfoDb.getInstance().hasTimeZone(timeZone)) {
infoLog("event=" + event + " has unsupported zone(" + timeZone + ")");
return true;
}
}
return false;
}
}