From 9ec32ea53490bbdcdf01be28a6e2fa56e69d2e68 Mon Sep 17 00:00:00 2001 From: Neil Fuller Date: Thu, 24 Sep 2020 17:25:24 +0100 Subject: [PATCH] System API annotation and API .txt changes New APIs are being exposed for use by SetUp Wizard, which requires System APIs. The APIs enable the calling app to determine the capabilities for / config of the current user that affect time zone detection and then alter them. This commit also contains changes to the Shell package needed for the CTS tests being added to test the new APIs. See the associated CTS commit for details. The primary usecase: The rules for who can do what and when for time zone detection are becoming more complicated, and device and user capabilities will be affected by compile time constants, device config (resources) and device hardware. By exposing this API, the complex logic can be encoded in one place (the system server), rather than duplicating them in multiple client apps. These APIs are also intended for use by SettingsUI (and the various form factor versions of that), but settings apps do not require them to be marked with @SystemApi. Bug: 159891384 Test: atest CtsTimeTestCases Change-Id: I1eb6a68a74217106f81cb9525ad9370c805eecf2 --- api/system-current.txt | 52 +++++++++++++++++++ core/java/android/app/time/TimeManager.java | 3 +- .../app/time/TimeZoneCapabilities.java | 3 +- .../time/TimeZoneCapabilitiesAndConfig.java | 3 +- .../app/time/TimeZoneConfiguration.java | 5 +- core/res/AndroidManifest.xml | 2 +- non-updatable-api/system-current.txt | 52 +++++++++++++++++++ 7 files changed, 114 insertions(+), 6 deletions(-) diff --git a/api/system-current.txt b/api/system-current.txt index 949a54a781dbc..2e618020049b7 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -125,6 +125,7 @@ package android { field public static final String MANAGE_SENSOR_PRIVACY = "android.permission.MANAGE_SENSOR_PRIVACY"; field public static final String MANAGE_SOUND_TRIGGER = "android.permission.MANAGE_SOUND_TRIGGER"; field public static final String MANAGE_SUBSCRIPTION_PLANS = "android.permission.MANAGE_SUBSCRIPTION_PLANS"; + field public static final String MANAGE_TIME_AND_ZONE_DETECTION = "android.permission.MANAGE_TIME_AND_ZONE_DETECTION"; field public static final String MANAGE_USB = "android.permission.MANAGE_USB"; field public static final String MANAGE_USERS = "android.permission.MANAGE_USERS"; field public static final String MANAGE_USER_OEM_UNLOCK_STATE = "android.permission.MANAGE_USER_OEM_UNLOCK_STATE"; @@ -1389,6 +1390,57 @@ package android.app.role { } +package android.app.time { + + public final class TimeManager { + method @RequiresPermission(android.Manifest.permission.MANAGE_TIME_AND_ZONE_DETECTION) public void addTimeZoneDetectorListener(@NonNull java.util.concurrent.Executor, @NonNull android.app.time.TimeManager.TimeZoneDetectorListener); + method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_TIME_AND_ZONE_DETECTION) public android.app.time.TimeZoneCapabilitiesAndConfig getTimeZoneCapabilitiesAndConfig(); + method @RequiresPermission(android.Manifest.permission.MANAGE_TIME_AND_ZONE_DETECTION) public void removeTimeZoneDetectorListener(@NonNull android.app.time.TimeManager.TimeZoneDetectorListener); + method @RequiresPermission(android.Manifest.permission.MANAGE_TIME_AND_ZONE_DETECTION) public boolean updateTimeZoneConfiguration(@NonNull android.app.time.TimeZoneConfiguration); + } + + @java.lang.FunctionalInterface public static interface TimeManager.TimeZoneDetectorListener { + method public void onChange(); + } + + public final class TimeZoneCapabilities implements android.os.Parcelable { + method public int describeContents(); + method public int getConfigureAutoDetectionEnabledCapability(); + method public int getConfigureGeoDetectionEnabledCapability(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field public static final int CAPABILITY_NOT_ALLOWED = 20; // 0x14 + field public static final int CAPABILITY_NOT_APPLICABLE = 30; // 0x1e + field public static final int CAPABILITY_NOT_SUPPORTED = 10; // 0xa + field public static final int CAPABILITY_POSSESSED = 40; // 0x28 + field @NonNull public static final android.os.Parcelable.Creator CREATOR; + } + + public final class TimeZoneCapabilitiesAndConfig implements android.os.Parcelable { + method public int describeContents(); + method @NonNull public android.app.time.TimeZoneCapabilities getCapabilities(); + method @NonNull public android.app.time.TimeZoneConfiguration getConfiguration(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator CREATOR; + } + + public final class TimeZoneConfiguration implements android.os.Parcelable { + method public int describeContents(); + method public boolean isAutoDetectionEnabled(); + method public boolean isGeoDetectionEnabled(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator CREATOR; + } + + public static final class TimeZoneConfiguration.Builder { + ctor public TimeZoneConfiguration.Builder(); + ctor public TimeZoneConfiguration.Builder(@NonNull android.app.time.TimeZoneConfiguration); + method @NonNull public android.app.time.TimeZoneConfiguration build(); + method @NonNull public android.app.time.TimeZoneConfiguration.Builder setAutoDetectionEnabled(boolean); + method @NonNull public android.app.time.TimeZoneConfiguration.Builder setGeoDetectionEnabled(boolean); + } + +} + package android.app.usage { public final class CacheQuotaHint implements android.os.Parcelable { diff --git a/core/java/android/app/time/TimeManager.java b/core/java/android/app/time/TimeManager.java index 9864afba534af..4796d8db3e96c 100644 --- a/core/java/android/app/time/TimeManager.java +++ b/core/java/android/app/time/TimeManager.java @@ -18,6 +18,7 @@ package android.app.time; import android.annotation.NonNull; import android.annotation.RequiresPermission; +import android.annotation.SystemApi; import android.annotation.SystemService; import android.app.timezonedetector.ITimeZoneDetectorService; import android.content.Context; @@ -36,7 +37,7 @@ import java.util.concurrent.Executor; * * @hide */ -// @SystemApi +@SystemApi @SystemService(Context.TIME_MANAGER) public final class TimeManager { private static final String TAG = "time.TimeManager"; diff --git a/core/java/android/app/time/TimeZoneCapabilities.java b/core/java/android/app/time/TimeZoneCapabilities.java index c62c2b34f35d4..df89c285d5bdd 100644 --- a/core/java/android/app/time/TimeZoneCapabilities.java +++ b/core/java/android/app/time/TimeZoneCapabilities.java @@ -19,6 +19,7 @@ package android.app.time; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.SystemApi; import android.app.timezonedetector.ManualTimeZoneSuggestion; import android.app.timezonedetector.TimeZoneDetector; import android.os.Parcel; @@ -50,7 +51,7 @@ import java.util.Objects; * * @hide */ -// @SystemApi +@SystemApi public final class TimeZoneCapabilities implements Parcelable { /** @hide */ diff --git a/core/java/android/app/time/TimeZoneCapabilitiesAndConfig.java b/core/java/android/app/time/TimeZoneCapabilitiesAndConfig.java index 6a04f3f277edb..b339e53b8be3a 100644 --- a/core/java/android/app/time/TimeZoneCapabilitiesAndConfig.java +++ b/core/java/android/app/time/TimeZoneCapabilitiesAndConfig.java @@ -17,6 +17,7 @@ package android.app.time; import android.annotation.NonNull; +import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; @@ -27,7 +28,7 @@ import java.util.Objects; * * @hide */ -// @SystemApi +@SystemApi public final class TimeZoneCapabilitiesAndConfig implements Parcelable { public static final @NonNull Creator CREATOR = diff --git a/core/java/android/app/time/TimeZoneConfiguration.java b/core/java/android/app/time/TimeZoneConfiguration.java index 488818a528efa..c0a0c21b546da 100644 --- a/core/java/android/app/time/TimeZoneConfiguration.java +++ b/core/java/android/app/time/TimeZoneConfiguration.java @@ -18,6 +18,7 @@ package android.app.time; import android.annotation.NonNull; import android.annotation.StringDef; +import android.annotation.SystemApi; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; @@ -41,7 +42,7 @@ import java.util.Objects; * * @hide */ -// @SystemApi +@SystemApi public final class TimeZoneConfiguration implements Parcelable { public static final @NonNull Creator CREATOR = @@ -188,7 +189,7 @@ public final class TimeZoneConfiguration implements Parcelable { * * @hide */ - // @SystemApi + @SystemApi public static final class Builder { private final Bundle mBundle = new Bundle(); diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index cc75dbb2e85a8..60de8bdcd3350 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -2690,7 +2690,7 @@ diff --git a/non-updatable-api/system-current.txt b/non-updatable-api/system-current.txt index 916e21f43f615..6fc1dbf56384a 100644 --- a/non-updatable-api/system-current.txt +++ b/non-updatable-api/system-current.txt @@ -125,6 +125,7 @@ package android { field public static final String MANAGE_SENSOR_PRIVACY = "android.permission.MANAGE_SENSOR_PRIVACY"; field public static final String MANAGE_SOUND_TRIGGER = "android.permission.MANAGE_SOUND_TRIGGER"; field public static final String MANAGE_SUBSCRIPTION_PLANS = "android.permission.MANAGE_SUBSCRIPTION_PLANS"; + field public static final String MANAGE_TIME_AND_ZONE_DETECTION = "android.permission.MANAGE_TIME_AND_ZONE_DETECTION"; field public static final String MANAGE_USB = "android.permission.MANAGE_USB"; field public static final String MANAGE_USERS = "android.permission.MANAGE_USERS"; field public static final String MANAGE_USER_OEM_UNLOCK_STATE = "android.permission.MANAGE_USER_OEM_UNLOCK_STATE"; @@ -1329,6 +1330,57 @@ package android.app.role { } +package android.app.time { + + public final class TimeManager { + method @RequiresPermission(android.Manifest.permission.MANAGE_TIME_AND_ZONE_DETECTION) public void addTimeZoneDetectorListener(@NonNull java.util.concurrent.Executor, @NonNull android.app.time.TimeManager.TimeZoneDetectorListener); + method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_TIME_AND_ZONE_DETECTION) public android.app.time.TimeZoneCapabilitiesAndConfig getTimeZoneCapabilitiesAndConfig(); + method @RequiresPermission(android.Manifest.permission.MANAGE_TIME_AND_ZONE_DETECTION) public void removeTimeZoneDetectorListener(@NonNull android.app.time.TimeManager.TimeZoneDetectorListener); + method @RequiresPermission(android.Manifest.permission.MANAGE_TIME_AND_ZONE_DETECTION) public boolean updateTimeZoneConfiguration(@NonNull android.app.time.TimeZoneConfiguration); + } + + @java.lang.FunctionalInterface public static interface TimeManager.TimeZoneDetectorListener { + method public void onChange(); + } + + public final class TimeZoneCapabilities implements android.os.Parcelable { + method public int describeContents(); + method public int getConfigureAutoDetectionEnabledCapability(); + method public int getConfigureGeoDetectionEnabledCapability(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field public static final int CAPABILITY_NOT_ALLOWED = 20; // 0x14 + field public static final int CAPABILITY_NOT_APPLICABLE = 30; // 0x1e + field public static final int CAPABILITY_NOT_SUPPORTED = 10; // 0xa + field public static final int CAPABILITY_POSSESSED = 40; // 0x28 + field @NonNull public static final android.os.Parcelable.Creator CREATOR; + } + + public final class TimeZoneCapabilitiesAndConfig implements android.os.Parcelable { + method public int describeContents(); + method @NonNull public android.app.time.TimeZoneCapabilities getCapabilities(); + method @NonNull public android.app.time.TimeZoneConfiguration getConfiguration(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator CREATOR; + } + + public final class TimeZoneConfiguration implements android.os.Parcelable { + method public int describeContents(); + method public boolean isAutoDetectionEnabled(); + method public boolean isGeoDetectionEnabled(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator CREATOR; + } + + public static final class TimeZoneConfiguration.Builder { + ctor public TimeZoneConfiguration.Builder(); + ctor public TimeZoneConfiguration.Builder(@NonNull android.app.time.TimeZoneConfiguration); + method @NonNull public android.app.time.TimeZoneConfiguration build(); + method @NonNull public android.app.time.TimeZoneConfiguration.Builder setAutoDetectionEnabled(boolean); + method @NonNull public android.app.time.TimeZoneConfiguration.Builder setGeoDetectionEnabled(boolean); + } + +} + package android.app.usage { public final class CacheQuotaHint implements android.os.Parcelable {