// 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 class 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 class 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 class TelephonyLookup {
    method @NonNull public static android.timezone.TelephonyLookup getInstance();
    method @Nullable public android.timezone.TelephonyNetworkFinder getTelephonyNetworkFinder();
  }

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

  public 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 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);
  }

}

