// Signature format: 2.0
package android.app.timedetector {

  public final class PhoneTimeSuggestion implements android.os.Parcelable {
    method public void addDebugInfo(@NonNull String);
    method public void addDebugInfo(@NonNull java.util.List<java.lang.String>);
    method public int describeContents();
    method @NonNull public java.util.List<java.lang.String> getDebugInfo();
    method public int getPhoneId();
    method @Nullable public android.os.TimestampedValue<java.lang.Long> getUtcTime();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.app.timedetector.PhoneTimeSuggestion> CREATOR;
  }

  public static final class PhoneTimeSuggestion.Builder {
    ctor public PhoneTimeSuggestion.Builder(int);
    method @NonNull public android.app.timedetector.PhoneTimeSuggestion.Builder addDebugInfo(@NonNull String);
    method @NonNull public android.app.timedetector.PhoneTimeSuggestion build();
    method @NonNull public android.app.timedetector.PhoneTimeSuggestion.Builder setUtcTime(@Nullable android.os.TimestampedValue<java.lang.Long>);
  }

  public interface TimeDetector {
    method @RequiresPermission("android.permission.SUGGEST_PHONE_TIME_AND_ZONE") public void suggestPhoneTime(@NonNull android.app.timedetector.PhoneTimeSuggestion);
  }

}

package android.app.timezonedetector {

  public final class PhoneTimeZoneSuggestion implements android.os.Parcelable {
    method public void addDebugInfo(@NonNull String);
    method public void addDebugInfo(@NonNull java.util.List<java.lang.String>);
    method @NonNull public static android.app.timezonedetector.PhoneTimeZoneSuggestion createEmptySuggestion(int, @NonNull String);
    method public int describeContents();
    method @NonNull public java.util.List<java.lang.String> getDebugInfo();
    method public int getMatchType();
    method public int getPhoneId();
    method public int getQuality();
    method @Nullable public String getZoneId();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.app.timezonedetector.PhoneTimeZoneSuggestion> CREATOR;
    field public static final int MATCH_TYPE_EMULATOR_ZONE_ID = 4; // 0x4
    field public static final int MATCH_TYPE_NA = 0; // 0x0
    field public static final int MATCH_TYPE_NETWORK_COUNTRY_AND_OFFSET = 3; // 0x3
    field public static final int MATCH_TYPE_NETWORK_COUNTRY_ONLY = 2; // 0x2
    field public static final int MATCH_TYPE_TEST_NETWORK_OFFSET_ONLY = 5; // 0x5
    field public static final int QUALITY_MULTIPLE_ZONES_WITH_DIFFERENT_OFFSETS = 3; // 0x3
    field public static final int QUALITY_MULTIPLE_ZONES_WITH_SAME_OFFSET = 2; // 0x2
    field public static final int QUALITY_NA = 0; // 0x0
    field public static final int QUALITY_SINGLE_ZONE = 1; // 0x1
  }

  public static final class PhoneTimeZoneSuggestion.Builder {
    ctor public PhoneTimeZoneSuggestion.Builder(int);
    method @NonNull public android.app.timezonedetector.PhoneTimeZoneSuggestion.Builder addDebugInfo(@NonNull String);
    method @NonNull public android.app.timezonedetector.PhoneTimeZoneSuggestion build();
    method @NonNull public android.app.timezonedetector.PhoneTimeZoneSuggestion.Builder setMatchType(int);
    method @NonNull public android.app.timezonedetector.PhoneTimeZoneSuggestion.Builder setQuality(int);
    method @NonNull public android.app.timezonedetector.PhoneTimeZoneSuggestion.Builder setZoneId(@Nullable String);
  }

  public interface TimeZoneDetector {
    method @RequiresPermission("android.permission.SUGGEST_PHONE_TIME_AND_ZONE") public void suggestPhoneTimeZone(@NonNull android.app.timezonedetector.PhoneTimeZoneSuggestion);
  }

}

package android.os {

  public final class TimestampedValue<T> implements android.os.Parcelable {
    ctor public TimestampedValue(long, @Nullable T);
    method public int describeContents();
    method public long getReferenceTimeMillis();
    method @Nullable public T getValue();
    method public static long referenceTimeDifference(@NonNull android.os.TimestampedValue<?>, @NonNull android.os.TimestampedValue<?>);
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.os.TimestampedValue<?>> CREATOR;
  }

}

package android.timezone {

  public final class CountryTimeZones {
    method @Nullable public android.icu.util.TimeZone getDefaultTimeZone();
    method @Nullable public String getDefaultTimeZoneId();
    method @NonNull public java.util.List<android.timezone.CountryTimeZones.TimeZoneMapping> getEffectiveTimeZoneMappingsAt(long);
    method public boolean hasUtcZone(long);
    method public boolean isDefaultTimeZoneBoosted();
    method public boolean isForCountryCode(@NonNull String);
    method @Nullable public android.timezone.CountryTimeZones.OffsetResult lookupByOffsetWithBias(int, @Nullable Boolean, @Nullable Integer, long, @Nullable android.icu.util.TimeZone);
  }

  public static final class CountryTimeZones.OffsetResult {
    ctor public CountryTimeZones.OffsetResult(@NonNull android.icu.util.TimeZone, boolean);
    method @NonNull public android.icu.util.TimeZone getTimeZone();
    method public boolean isOnlyMatch();
  }

  public static final class CountryTimeZones.TimeZoneMapping {
    method @Nullable public android.icu.util.TimeZone getTimeZone();
    method @NonNull public String getTimeZoneId();
  }

  public final class TelephonyLookup {
    method @NonNull public static android.timezone.TelephonyLookup getInstance();
    method @Nullable public android.timezone.TelephonyNetworkFinder getTelephonyNetworkFinder();
  }

  public final class TelephonyNetwork {
    method @NonNull public String getCountryIsoCode();
    method @NonNull public String getMcc();
    method @NonNull public String getMnc();
  }

  public final class TelephonyNetworkFinder {
    method @Nullable public android.timezone.TelephonyNetwork findNetworkByMccMnc(@NonNull String, @NonNull String);
  }

  public final class TimeZoneFinder {
    method @Nullable public String getIanaVersion();
    method @NonNull public static android.timezone.TimeZoneFinder getInstance();
    method @Nullable public android.timezone.CountryTimeZones lookupCountryTimeZones(@NonNull String);
  }

  public final class TzDataSetVersion {
    method public static int currentFormatMajorVersion();
    method public static int currentFormatMinorVersion();
    method public int getFormatMajorVersion();
    method public int getFormatMinorVersion();
    method public int getRevision();
    method @NonNull public String getRulesVersion();
    method public static boolean isCompatibleWithThisDevice(android.timezone.TzDataSetVersion);
    method @NonNull public static android.timezone.TzDataSetVersion read() throws java.io.IOException, android.timezone.TzDataSetVersion.TzDataSetException;
  }

  public static final class TzDataSetVersion.TzDataSetException extends java.lang.Exception {
    ctor public TzDataSetVersion.TzDataSetException(String);
    ctor public TzDataSetVersion.TzDataSetException(String, Throwable);
  }

  public final class ZoneInfoDb {
    method @NonNull public static android.timezone.ZoneInfoDb getInstance();
    method @NonNull public String getVersion();
  }

}

package android.util {

  public final class Log {
    method public static int logToRadioBuffer(int, @Nullable String, @Nullable String);
  }

}

