diff options
400 files changed, 5021 insertions, 6514 deletions
diff --git a/apct-tests/perftests/windowmanager/README.md b/apct-tests/perftests/windowmanager/README.md index 8b5292fd02a5..7a0019a0c23f 100644 --- a/apct-tests/perftests/windowmanager/README.md +++ b/apct-tests/perftests/windowmanager/README.md @@ -4,7 +4,7 @@ To reduce the variance of the test, if `perf-setup.sh` (platform_testing/scripts/perf-setup) is available, it is better to use the following instructions to lock CPU and GPU frequencies. ``` -m perf-setup.sh +m perf-setup PERF_SETUP_PATH=/data/local/tmp/perf-setup.sh adb push $OUT/$PERF_SETUP_PATH $PERF_SETUP_PATH adb shell chmod +x $PERF_SETUP_PATH diff --git a/apex/jobscheduler/framework/java/android/os/DeviceIdleManager.java b/apex/jobscheduler/framework/java/android/os/DeviceIdleManager.java index ada562ecebc6..752c36e53bf9 100644 --- a/apex/jobscheduler/framework/java/android/os/DeviceIdleManager.java +++ b/apex/jobscheduler/framework/java/android/os/DeviceIdleManager.java @@ -29,7 +29,6 @@ import android.content.Context; * * @hide */ -@TestApi @SystemApi @SystemService(Context.DEVICE_IDLE_CONTROLLER) public class DeviceIdleManager { diff --git a/apex/jobscheduler/framework/java/android/os/PowerWhitelistManager.java b/apex/jobscheduler/framework/java/android/os/PowerWhitelistManager.java index 16dcd0674809..ab8722286efc 100644 --- a/apex/jobscheduler/framework/java/android/os/PowerWhitelistManager.java +++ b/apex/jobscheduler/framework/java/android/os/PowerWhitelistManager.java @@ -21,7 +21,6 @@ import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.content.Context; import java.lang.annotation.Retention; @@ -39,7 +38,6 @@ import java.util.List; * @hide */ @SystemApi -@TestApi @SystemService(Context.POWER_WHITELIST_MANAGER) public class PowerWhitelistManager { private final Context mContext; diff --git a/api/current.txt b/api/current.txt index b20b861b0412..ce82b5ec8cba 100644 --- a/api/current.txt +++ b/api/current.txt @@ -2851,6 +2851,7 @@ package android.accessibilityservice { method public int describeContents(); method public int getDisplayId(); method public int getGestureId(); + method @NonNull public java.util.List<android.view.MotionEvent> getMotionEvents(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.accessibilityservice.AccessibilityGestureEvent> CREATOR; } @@ -2932,6 +2933,7 @@ package android.accessibilityservice { field public static final int GESTURE_SWIPE_UP_AND_DOWN = 7; // 0x7 field public static final int GESTURE_SWIPE_UP_AND_LEFT = 13; // 0xd field public static final int GESTURE_SWIPE_UP_AND_RIGHT = 14; // 0xe + field public static final int GESTURE_UNKNOWN = 0; // 0x0 field public static final int GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS = 14; // 0xe field public static final int GLOBAL_ACTION_ACCESSIBILITY_BUTTON = 11; // 0xb field public static final int GLOBAL_ACTION_ACCESSIBILITY_BUTTON_CHOOSER = 12; // 0xc @@ -3047,6 +3049,7 @@ package android.accessibilityservice { field public static final int FLAG_REQUEST_SHORTCUT_WARNING_DIALOG_SPOKEN_FEEDBACK = 1024; // 0x400 field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4 field public static final int FLAG_RETRIEVE_INTERACTIVE_WINDOWS = 64; // 0x40 + field public static final int FLAG_SEND_MOTION_EVENTS = 16384; // 0x4000 field public static final int FLAG_SERVICE_HANDLES_DOUBLE_TAP = 2048; // 0x800 field public int eventTypes; field public int feedbackType; @@ -31853,6 +31856,7 @@ package android.net.wifi.aware { method public int getMaxServiceNameLength(); method public int getMaxServiceSpecificInfoLength(); method public int getSupportedCipherSuites(); + method public boolean isInstantCommunicationModeSupported(); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.aware.Characteristics> CREATOR; field public static final int WIFI_AWARE_CIPHER_SUITE_NCS_SK_128 = 1; // 0x1 @@ -31951,6 +31955,7 @@ package android.net.wifi.aware { method public android.net.wifi.aware.Characteristics getCharacteristics(); method public boolean isAvailable(); method public boolean isDeviceAttached(); + method public boolean isInstantCommunicationModeEnabled(); field public static final String ACTION_WIFI_AWARE_STATE_CHANGED = "android.net.wifi.aware.action.WIFI_AWARE_STATE_CHANGED"; field public static final int WIFI_AWARE_DATA_PATH_ROLE_INITIATOR = 0; // 0x0 field public static final int WIFI_AWARE_DATA_PATH_ROLE_RESPONDER = 1; // 0x1 diff --git a/api/system-current.txt b/api/system-current.txt index ff84613dd75e..1da8c29996f9 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5210,12 +5210,45 @@ package android.media.tv.tuner.filter { public class AvSettings extends android.media.tv.tuner.filter.Settings { method @NonNull public static android.media.tv.tuner.filter.AvSettings.Builder builder(int, boolean); + method public int getAudioStreamType(); + method public int getVideoStreamType(); method public boolean isPassthrough(); + field public static final int AUDIO_STREAM_TYPE_AAC = 6; // 0x6 + field public static final int AUDIO_STREAM_TYPE_AC3 = 7; // 0x7 + field public static final int AUDIO_STREAM_TYPE_AC4 = 9; // 0x9 + field public static final int AUDIO_STREAM_TYPE_DRA = 15; // 0xf + field public static final int AUDIO_STREAM_TYPE_DTS = 10; // 0xa + field public static final int AUDIO_STREAM_TYPE_DTS_HD = 11; // 0xb + field public static final int AUDIO_STREAM_TYPE_EAC3 = 8; // 0x8 + field public static final int AUDIO_STREAM_TYPE_MP3 = 2; // 0x2 + field public static final int AUDIO_STREAM_TYPE_MPEG1 = 3; // 0x3 + field public static final int AUDIO_STREAM_TYPE_MPEG2 = 4; // 0x4 + field public static final int AUDIO_STREAM_TYPE_MPEGH = 5; // 0x5 + field public static final int AUDIO_STREAM_TYPE_OPUS = 13; // 0xd + field public static final int AUDIO_STREAM_TYPE_PCM = 1; // 0x1 + field public static final int AUDIO_STREAM_TYPE_UNDEFINED = 0; // 0x0 + field public static final int AUDIO_STREAM_TYPE_VORBIS = 14; // 0xe + field public static final int AUDIO_STREAM_TYPE_WMA = 12; // 0xc + field public static final int VIDEO_STREAM_TYPE_AV1 = 10; // 0xa + field public static final int VIDEO_STREAM_TYPE_AVC = 5; // 0x5 + field public static final int VIDEO_STREAM_TYPE_AVS = 11; // 0xb + field public static final int VIDEO_STREAM_TYPE_AVS2 = 12; // 0xc + field public static final int VIDEO_STREAM_TYPE_HEVC = 6; // 0x6 + field public static final int VIDEO_STREAM_TYPE_MPEG1 = 2; // 0x2 + field public static final int VIDEO_STREAM_TYPE_MPEG2 = 3; // 0x3 + field public static final int VIDEO_STREAM_TYPE_MPEG4P2 = 4; // 0x4 + field public static final int VIDEO_STREAM_TYPE_RESERVED = 1; // 0x1 + field public static final int VIDEO_STREAM_TYPE_UNDEFINED = 0; // 0x0 + field public static final int VIDEO_STREAM_TYPE_VC1 = 7; // 0x7 + field public static final int VIDEO_STREAM_TYPE_VP8 = 8; // 0x8 + field public static final int VIDEO_STREAM_TYPE_VP9 = 9; // 0x9 } public static class AvSettings.Builder { method @NonNull public android.media.tv.tuner.filter.AvSettings build(); + method @NonNull public android.media.tv.tuner.filter.AvSettings.Builder setAudioStreamType(int); method @NonNull public android.media.tv.tuner.filter.AvSettings.Builder setPassthrough(boolean); + method @NonNull public android.media.tv.tuner.filter.AvSettings.Builder setVideoStreamType(int); } public class DownloadEvent extends android.media.tv.tuner.filter.FilterEvent { @@ -8040,6 +8073,10 @@ package android.net.wifi.aware { method @Deprecated public android.net.NetworkSpecifier createNetworkSpecifierPmk(@NonNull android.net.wifi.aware.PeerHandle, @NonNull byte[]); } + public class WifiAwareManager { + method public void enableInstantCommunicationMode(boolean); + } + public class WifiAwareSession implements java.lang.AutoCloseable { method public android.net.NetworkSpecifier createNetworkSpecifierPmk(int, @NonNull byte[], @NonNull byte[]); } diff --git a/api/test-current.txt b/api/test-current.txt index d61526a93e8a..7dc74716b9d5 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -81,21 +81,14 @@ package android.app { public class ActivityManager { method @RequiresPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER) public void addHomeVisibilityListener(@NonNull java.util.concurrent.Executor, @NonNull android.app.HomeVisibilityListener); - method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void addOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener, int); method public void alwaysShowUnsupportedCompileSdkWarning(android.content.ComponentName); - method @RequiresPermission(android.Manifest.permission.FORCE_STOP_PACKAGES) public void forceStopPackage(String); - method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getPackageImportance(String); method public long getTotalRam(); - method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getUidImportance(int); method @RequiresPermission(android.Manifest.permission.INJECT_EVENTS) public void holdLock(int); method public static boolean isHighEndGfx(); - method @RequiresPermission(android.Manifest.permission.FORCE_STOP_PACKAGES) public void killProcessesWhenImperceptible(@NonNull int[], @NonNull String); method @RequiresPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER) public void removeHomeVisibilityListener(@NonNull android.app.HomeVisibilityListener); - method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener); method @RequiresPermission(android.Manifest.permission.RESET_APP_ERRORS) public void resetAppErrors(); method public static void resumeAppSwitches() throws android.os.RemoteException; method @RequiresPermission(android.Manifest.permission.CHANGE_CONFIGURATION) public void scheduleApplicationInfoChanged(java.util.List<java.lang.String>, int); - method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean switchUser(@NonNull android.os.UserHandle); field public static final int PROCESS_CAPABILITY_ALL = 7; // 0x7 field public static final int PROCESS_CAPABILITY_ALL_EXPLICIT = 1; // 0x1 field public static final int PROCESS_CAPABILITY_ALL_IMPLICIT = 6; // 0x6 @@ -105,10 +98,6 @@ package android.app { field public static final int PROCESS_CAPABILITY_NONE = 0; // 0x0 } - public static interface ActivityManager.OnUidImportanceListener { - method public void onUidImportance(int, int); - } - public static class ActivityManager.RunningAppProcessInfo implements android.os.Parcelable { field public static final int IMPORTANCE_CANT_SAVE_STATE_PRE_26 = 170; // 0xaa } @@ -204,15 +193,10 @@ package android.app { public class AppOpsManager { method @RequiresPermission("android.permission.MANAGE_APPOPS") public void addHistoricalOps(@NonNull android.app.AppOpsManager.HistoricalOps); method @RequiresPermission("android.permission.MANAGE_APPOPS") public void clearHistory(); - method @Nullable @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public android.app.RuntimeAppOpAccessMessage collectRuntimeAppOpAccessMessage(); - method @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public void getHistoricalOps(@NonNull android.app.AppOpsManager.HistoricalOpsRequest, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<android.app.AppOpsManager.HistoricalOps>); method @RequiresPermission("android.permission.MANAGE_APPOPS") public void getHistoricalOpsFromDiskRaw(@NonNull android.app.AppOpsManager.HistoricalOpsRequest, @Nullable java.util.concurrent.Executor, @NonNull java.util.function.Consumer<android.app.AppOpsManager.HistoricalOps>); method public static int getNumOps(); - method public static String[] getOpStrs(); - method @NonNull @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public java.util.List<android.app.AppOpsManager.PackageOps> getOpsForPackage(int, @NonNull String, @Nullable java.lang.String...); method public boolean isOperationActive(int, int, String); method @RequiresPermission("android.permission.MANAGE_APPOPS") public void offsetHistory(long); - method public static int opToDefaultMode(@NonNull String); method public static String opToPermission(int); method public static int permissionToOpCode(String); method @RequiresPermission("android.permission.MANAGE_APPOPS") public void rebootHistory(long); @@ -220,8 +204,6 @@ package android.app { method @RequiresPermission("android.permission.MANAGE_APPOPS") public void resetHistoryParameters(); method @RequiresPermission("android.permission.MANAGE_APPOPS") public void setHistoryParameters(int, long, int); method @RequiresPermission("android.permission.MANAGE_APP_OPS_MODES") public void setMode(int, int, String, int); - method @RequiresPermission("android.permission.MANAGE_APP_OPS_MODES") public void setMode(@NonNull String, int, @Nullable String, int); - method @RequiresPermission("android.permission.MANAGE_APP_OPS_MODES") public void setUidMode(@NonNull String, int, int); method public static int strOpToOp(@NonNull String); field public static final int HISTORICAL_MODE_DISABLED = 0; // 0x0 field public static final int HISTORICAL_MODE_ENABLED_ACTIVE = 1; // 0x1 @@ -229,225 +211,19 @@ package android.app { field public static final String KEY_BG_STATE_SETTLE_TIME = "bg_state_settle_time"; field public static final String KEY_FG_SERVICE_STATE_SETTLE_TIME = "fg_service_state_settle_time"; field public static final String KEY_TOP_STATE_SETTLE_TIME = "top_state_settle_time"; - field public static final String OPSTR_ACCEPT_HANDOVER = "android:accept_handover"; - field public static final String OPSTR_ACCESS_NOTIFICATIONS = "android:access_notifications"; - field public static final String OPSTR_ACTIVATE_VPN = "android:activate_vpn"; - field public static final String OPSTR_ASSIST_SCREENSHOT = "android:assist_screenshot"; - field public static final String OPSTR_ASSIST_STRUCTURE = "android:assist_structure"; - field public static final String OPSTR_AUDIO_ACCESSIBILITY_VOLUME = "android:audio_accessibility_volume"; - field public static final String OPSTR_AUDIO_ALARM_VOLUME = "android:audio_alarm_volume"; - field public static final String OPSTR_AUDIO_BLUETOOTH_VOLUME = "android:audio_bluetooth_volume"; - field public static final String OPSTR_AUDIO_MASTER_VOLUME = "android:audio_master_volume"; - field public static final String OPSTR_AUDIO_MEDIA_VOLUME = "android:audio_media_volume"; - field public static final String OPSTR_AUDIO_NOTIFICATION_VOLUME = "android:audio_notification_volume"; - field public static final String OPSTR_AUDIO_RING_VOLUME = "android:audio_ring_volume"; - field public static final String OPSTR_AUDIO_VOICE_VOLUME = "android:audio_voice_volume"; - field public static final String OPSTR_BIND_ACCESSIBILITY_SERVICE = "android:bind_accessibility_service"; - field public static final String OPSTR_CHANGE_WIFI_STATE = "android:change_wifi_state"; - field public static final String OPSTR_GET_ACCOUNTS = "android:get_accounts"; - field public static final String OPSTR_GPS = "android:gps"; - field public static final String OPSTR_INSTANT_APP_START_FOREGROUND = "android:instant_app_start_foreground"; - field public static final String OPSTR_LEGACY_STORAGE = "android:legacy_storage"; - field public static final String OPSTR_MANAGE_EXTERNAL_STORAGE = "android:manage_external_storage"; - field public static final String OPSTR_MANAGE_IPSEC_TUNNELS = "android:manage_ipsec_tunnels"; - field public static final String OPSTR_MUTE_MICROPHONE = "android:mute_microphone"; - field public static final String OPSTR_NEIGHBORING_CELLS = "android:neighboring_cells"; - field public static final String OPSTR_PLAY_AUDIO = "android:play_audio"; - field public static final String OPSTR_POST_NOTIFICATION = "android:post_notification"; - field public static final String OPSTR_PROJECT_MEDIA = "android:project_media"; - field public static final String OPSTR_READ_CLIPBOARD = "android:read_clipboard"; - field public static final String OPSTR_READ_ICC_SMS = "android:read_icc_sms"; - field public static final String OPSTR_READ_MEDIA_AUDIO = "android:read_media_audio"; - field public static final String OPSTR_READ_MEDIA_IMAGES = "android:read_media_images"; - field public static final String OPSTR_READ_MEDIA_VIDEO = "android:read_media_video"; - field public static final String OPSTR_RECEIVE_EMERGENCY_BROADCAST = "android:receive_emergency_broadcast"; - field public static final String OPSTR_REQUEST_DELETE_PACKAGES = "android:request_delete_packages"; - field public static final String OPSTR_REQUEST_INSTALL_PACKAGES = "android:request_install_packages"; - field public static final String OPSTR_RUN_ANY_IN_BACKGROUND = "android:run_any_in_background"; - field public static final String OPSTR_RUN_IN_BACKGROUND = "android:run_in_background"; - field public static final String OPSTR_START_FOREGROUND = "android:start_foreground"; - field public static final String OPSTR_TAKE_AUDIO_FOCUS = "android:take_audio_focus"; - field public static final String OPSTR_TAKE_MEDIA_BUTTONS = "android:take_media_buttons"; - field public static final String OPSTR_TOAST_WINDOW = "android:toast_window"; - field public static final String OPSTR_TURN_SCREEN_ON = "android:turn_screen_on"; - field public static final String OPSTR_VIBRATE = "android:vibrate"; - field public static final String OPSTR_WAKE_LOCK = "android:wake_lock"; - field public static final String OPSTR_WIFI_SCAN = "android:wifi_scan"; - field public static final String OPSTR_WRITE_CLIPBOARD = "android:write_clipboard"; - field public static final String OPSTR_WRITE_ICC_SMS = "android:write_icc_sms"; - field public static final String OPSTR_WRITE_MEDIA_AUDIO = "android:write_media_audio"; - field public static final String OPSTR_WRITE_MEDIA_IMAGES = "android:write_media_images"; - field public static final String OPSTR_WRITE_MEDIA_VIDEO = "android:write_media_video"; - field public static final String OPSTR_WRITE_SMS = "android:write_sms"; - field public static final String OPSTR_WRITE_WALLPAPER = "android:write_wallpaper"; field public static final int OP_COARSE_LOCATION = 0; // 0x0 - field public static final int OP_FLAGS_ALL = 31; // 0x1f - field public static final int OP_FLAG_SELF = 1; // 0x1 - field public static final int OP_FLAG_TRUSTED_PROXIED = 8; // 0x8 - field public static final int OP_FLAG_TRUSTED_PROXY = 2; // 0x2 - field public static final int OP_FLAG_UNTRUSTED_PROXIED = 16; // 0x10 - field public static final int OP_FLAG_UNTRUSTED_PROXY = 4; // 0x4 field public static final int OP_RECORD_AUDIO = 27; // 0x1b field public static final int OP_START_FOREGROUND = 76; // 0x4c field public static final int OP_SYSTEM_ALERT_WINDOW = 24; // 0x18 field public static final long SECURITY_EXCEPTION_ON_INVALID_ATTRIBUTION_TAG_CHANGE = 151105954L; // 0x901b1a2L - field public static final int UID_STATE_BACKGROUND = 600; // 0x258 - field public static final int UID_STATE_CACHED = 700; // 0x2bc - field public static final int UID_STATE_FOREGROUND = 500; // 0x1f4 - field public static final int UID_STATE_FOREGROUND_SERVICE = 400; // 0x190 - field @Deprecated public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 300; // 0x12c - field public static final int UID_STATE_PERSISTENT = 100; // 0x64 - field public static final int UID_STATE_TOP = 200; // 0xc8 - } - - public static final class AppOpsManager.AttributedHistoricalOps implements android.os.Parcelable { - method public int describeContents(); - method @Nullable public android.app.AppOpsManager.HistoricalOp getOp(@NonNull String); - method @NonNull public android.app.AppOpsManager.HistoricalOp getOpAt(@IntRange(from=0) int); - method @IntRange(from=0) public int getOpCount(); - method @Nullable public String getTag(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.AttributedHistoricalOps> CREATOR; - } - - public static final class AppOpsManager.AttributedOpEntry implements android.os.Parcelable { - method public int describeContents(); - method public long getLastAccessBackgroundTime(int); - method public long getLastAccessForegroundTime(int); - method public long getLastAccessTime(int); - method public long getLastAccessTime(int, int, int); - method public long getLastBackgroundDuration(int); - method @Nullable public android.app.AppOpsManager.OpEventProxyInfo getLastBackgroundProxyInfo(int); - method public long getLastDuration(int); - method public long getLastDuration(int, int, int); - method public long getLastForegroundDuration(int); - method @Nullable public android.app.AppOpsManager.OpEventProxyInfo getLastForegroundProxyInfo(int); - method @Nullable public android.app.AppOpsManager.OpEventProxyInfo getLastProxyInfo(int); - method @Nullable public android.app.AppOpsManager.OpEventProxyInfo getLastProxyInfo(int, int, int); - method public long getLastRejectBackgroundTime(int); - method public long getLastRejectForegroundTime(int); - method public long getLastRejectTime(int); - method public long getLastRejectTime(int, int, int); - method public boolean isRunning(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.AttributedOpEntry> CREATOR; - } - - public static final class AppOpsManager.HistoricalOp implements android.os.Parcelable { - method public int describeContents(); - method public long getAccessCount(int, int, int); - method public long getAccessDuration(int, int, int); - method public long getBackgroundAccessCount(int); - method public long getBackgroundAccessDuration(int); - method public long getBackgroundRejectCount(int); - method public long getForegroundAccessCount(int); - method public long getForegroundAccessDuration(int); - method public long getForegroundRejectCount(int); - method @NonNull public String getOpName(); - method public long getRejectCount(int, int, int); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalOp> CREATOR; } public static final class AppOpsManager.HistoricalOps implements android.os.Parcelable { ctor public AppOpsManager.HistoricalOps(long, long); - method public int describeContents(); - method public long getBeginTimeMillis(); - method public long getEndTimeMillis(); - method @IntRange(from=0) public int getUidCount(); - method @Nullable public android.app.AppOpsManager.HistoricalUidOps getUidOps(int); - method @NonNull public android.app.AppOpsManager.HistoricalUidOps getUidOpsAt(@IntRange(from=0) int); method public void increaseAccessCount(int, int, @NonNull String, @Nullable String, int, int, long); method public void increaseAccessDuration(int, int, @NonNull String, @Nullable String, int, int, long); method public void increaseRejectCount(int, int, @NonNull String, @Nullable String, int, int, long); method public void offsetBeginAndEndTime(long); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalOps> CREATOR; - } - - public static final class AppOpsManager.HistoricalOpsRequest { - } - - public static final class AppOpsManager.HistoricalOpsRequest.Builder { - ctor public AppOpsManager.HistoricalOpsRequest.Builder(long, long); - method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest build(); - method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setAttributionTag(@Nullable String); - method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setFlags(int); - method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setOpNames(@Nullable java.util.List<java.lang.String>); - method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setPackageName(@Nullable String); - method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setUid(int); - } - - public static final class AppOpsManager.HistoricalPackageOps implements android.os.Parcelable { - method public int describeContents(); - method @Nullable public android.app.AppOpsManager.AttributedHistoricalOps getAttributedOps(@NonNull String); - method @NonNull public android.app.AppOpsManager.AttributedHistoricalOps getAttributedOpsAt(@IntRange(from=0) int); - method @IntRange(from=0) public int getAttributedOpsCount(); - method @Nullable public android.app.AppOpsManager.HistoricalOp getOp(@NonNull String); - method @NonNull public android.app.AppOpsManager.HistoricalOp getOpAt(@IntRange(from=0) int); - method @IntRange(from=0) public int getOpCount(); - method @NonNull public String getPackageName(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalPackageOps> CREATOR; - } - - public static final class AppOpsManager.HistoricalUidOps implements android.os.Parcelable { - method public int describeContents(); - method @IntRange(from=0) public int getPackageCount(); - method @Nullable public android.app.AppOpsManager.HistoricalPackageOps getPackageOps(@NonNull String); - method @NonNull public android.app.AppOpsManager.HistoricalPackageOps getPackageOpsAt(@IntRange(from=0) int); - method public int getUid(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalUidOps> CREATOR; - } - - public static final class AppOpsManager.OpEntry implements android.os.Parcelable { - method public int describeContents(); - method @NonNull public java.util.Map<java.lang.String,android.app.AppOpsManager.AttributedOpEntry> getAttributedOpEntries(); - method @Deprecated public long getDuration(); - method public long getLastAccessBackgroundTime(int); - method public long getLastAccessForegroundTime(int); - method public long getLastAccessTime(int); - method public long getLastAccessTime(int, int, int); - method public long getLastBackgroundDuration(int); - method @Nullable public android.app.AppOpsManager.OpEventProxyInfo getLastBackgroundProxyInfo(int); - method public long getLastDuration(int); - method public long getLastDuration(int, int, int); - method public long getLastForegroundDuration(int); - method @Nullable public android.app.AppOpsManager.OpEventProxyInfo getLastForegroundProxyInfo(int); - method @Nullable public android.app.AppOpsManager.OpEventProxyInfo getLastProxyInfo(int); - method @Nullable public android.app.AppOpsManager.OpEventProxyInfo getLastProxyInfo(int, int, int); - method public long getLastRejectBackgroundTime(int); - method public long getLastRejectForegroundTime(int); - method public long getLastRejectTime(int); - method public long getLastRejectTime(int, int, int); - method public int getMode(); - method @NonNull public String getOpStr(); - method @Deprecated @Nullable public String getProxyPackageName(); - method @Deprecated @Nullable public String getProxyPackageName(int, int); - method @Deprecated public int getProxyUid(); - method @Deprecated public int getProxyUid(int, int); - method public boolean isRunning(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.OpEntry> CREATOR; - } - - public static final class AppOpsManager.OpEventProxyInfo implements android.os.Parcelable { - method public int describeContents(); - method @Nullable public String getAttributionTag(); - method @Nullable public String getPackageName(); - method @IntRange(from=0) public int getUid(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.OpEventProxyInfo> CREATOR; - } - - public static final class AppOpsManager.PackageOps implements android.os.Parcelable { - method public int describeContents(); - method @NonNull public java.util.List<android.app.AppOpsManager.OpEntry> getOps(); - method @NonNull public String getPackageName(); - method public int getUid(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.PackageOps> CREATOR; } public class DownloadManager { @@ -472,7 +248,6 @@ package android.app { method public boolean isImportanceLockedByCriticalDeviceFunction(); method public boolean isImportanceLockedByOEM(); method public void lockFields(int); - method public void setBlockable(boolean); method public void setDeleted(boolean); method public void setDemoted(boolean); method public void setFgServiceShown(boolean); @@ -480,7 +255,6 @@ package android.app { method public void setImportanceLockedByOEM(boolean); method public void setImportantConversation(boolean); method public void setOriginalImportance(int); - field public static final int USER_LOCKED_SOUND = 32; // 0x20 } public final class NotificationChannelGroup implements android.os.Parcelable { @@ -492,14 +266,8 @@ package android.app { public class NotificationManager { method public void allowAssistantAdjustment(String); method public void disallowAssistantAdjustment(String); - method @NonNull public java.util.List<java.lang.String> getAllowedAssistantAdjustments(); - method @Nullable public android.content.ComponentName getAllowedNotificationAssistant(); method public android.content.ComponentName getEffectsSuppressor(); - method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_NOTIFICATION_LISTENERS) public java.util.List<android.content.ComponentName> getEnabledNotificationListeners(); - method public boolean isNotificationAssistantAccessGranted(@NonNull android.content.ComponentName); method public boolean matchesCallFilter(android.os.Bundle); - method public void setNotificationAssistantAccessGranted(@Nullable android.content.ComponentName, boolean); - method @RequiresPermission(android.Manifest.permission.MANAGE_NOTIFICATION_LISTENERS) public void setNotificationListenerAccessGranted(@NonNull android.content.ComponentName, boolean); method public void updateNotificationChannel(@NonNull String, int, @NonNull android.app.NotificationChannel); } @@ -509,36 +277,12 @@ package android.app { method public android.graphics.Rect getSourceRectHint(); } - public final class RuntimeAppOpAccessMessage implements android.os.Parcelable { - ctor public RuntimeAppOpAccessMessage(@IntRange(from=0L) int, @IntRange(from=0L) int, @NonNull String, @Nullable String, @NonNull String, int); - method public int describeContents(); - method @Nullable public String getAttributionTag(); - method @NonNull public String getMessage(); - method @NonNull public String getOp(); - method @NonNull public String getPackageName(); - method public int getSamplingStrategy(); - method @IntRange(from=0L) public int getUid(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.RuntimeAppOpAccessMessage> CREATOR; - } - public class StatusBarManager { method public void collapsePanels(); method public void expandNotificationsPanel(); - method @NonNull @RequiresPermission(android.Manifest.permission.STATUS_BAR) public android.app.StatusBarManager.DisableInfo getDisableInfo(); - method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void setDisabledForSetup(boolean); method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void setExpansionDisabledForSimNetworkLock(boolean); } - public static final class StatusBarManager.DisableInfo { - method public boolean areAllComponentsEnabled(); - method public boolean isNavigateToHomeDisabled(); - method public boolean isNotificationPeekingDisabled(); - method public boolean isRecentsDisabled(); - method public boolean isSearchDisabled(); - method public boolean isStatusBarExpansionDisabled(); - } - public class TaskInfo { method @NonNull public android.content.res.Configuration getConfiguration(); method @NonNull public android.window.WindowContainerToken getToken(); @@ -557,14 +301,12 @@ package android.app { } public class UiModeManager { - method @RequiresPermission(android.Manifest.permission.ENTER_CAR_MODE_PRIORITIZED) public void enableCarMode(@IntRange(from=0) int, int); method public boolean isNightModeLocked(); method public boolean isUiModeLocked(); } public class WallpaperManager { method @Nullable public android.graphics.Bitmap getBitmap(); - method @RequiresPermission(android.Manifest.permission.SET_WALLPAPER_COMPONENT) public boolean setWallpaperComponent(android.content.ComponentName); method public boolean shouldEnableWideColorGamut(); method @RequiresPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) public boolean wallpaperSupportsWcg(int); } @@ -609,18 +351,13 @@ package android.app { package android.app.admin { public class DevicePolicyManager { - method @Nullable public CharSequence getDeviceOwnerOrganizationName(); method public long getLastBugReportRequestTime(); method public long getLastNetworkLogRetrievalTime(); method public long getLastSecurityLogRetrievalTime(); method public java.util.List<java.lang.String> getOwnerInstalledCaCerts(@NonNull android.os.UserHandle); method public boolean isCurrentInputMethodSetByOwner(); - method public boolean isDeviceManaged(); method public boolean isFactoryResetProtectionPolicySupported(); - field public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_ALLOWED"; - field public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_DISALLOWED"; field public static final String ACTION_DATA_SHARING_RESTRICTION_APPLIED = "android.app.action.DATA_SHARING_RESTRICTION_APPLIED"; - field public static final String EXTRA_RESTRICTION = "android.app.extra.RESTRICTION"; } public static final class SecurityLog.SecurityEvent implements android.os.Parcelable { @@ -629,26 +366,6 @@ package android.app.admin { } -package android.app.assist { - - public static class AssistStructure.ViewNode { - ctor public AssistStructure.ViewNode(); - } - -} - -package android.app.backup { - - public class BackupManager { - method @RequiresPermission(android.Manifest.permission.BACKUP) public android.content.Intent getConfigurationIntent(String); - method @RequiresPermission(android.Manifest.permission.BACKUP) public android.content.Intent getDataManagementIntent(String); - method @Nullable @RequiresPermission(android.Manifest.permission.BACKUP) public CharSequence getDataManagementIntentLabel(@NonNull String); - method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.BACKUP) public String getDataManagementLabel(@NonNull String); - method @RequiresPermission(android.Manifest.permission.BACKUP) public String getDestinationString(String); - } - -} - package android.app.blob { public class BlobStoreManager { @@ -671,150 +388,27 @@ package android.app.blob { package android.app.prediction { - public final class AppPredictionContext implements android.os.Parcelable { - method public int describeContents(); - method @Nullable public android.os.Bundle getExtras(); - method @NonNull public String getPackageName(); - method @IntRange(from=0) public int getPredictedTargetCount(); - method @NonNull public String getUiSurface(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.prediction.AppPredictionContext> CREATOR; - } - - public static final class AppPredictionContext.Builder { - ctor public AppPredictionContext.Builder(@NonNull android.content.Context); - method @NonNull public android.app.prediction.AppPredictionContext build(); - method @NonNull public android.app.prediction.AppPredictionContext.Builder setExtras(@Nullable android.os.Bundle); - method @NonNull public android.app.prediction.AppPredictionContext.Builder setPredictedTargetCount(@IntRange(from=0) int); - method @NonNull public android.app.prediction.AppPredictionContext.Builder setUiSurface(@NonNull String); - } - - public final class AppPredictionManager { - method @NonNull public android.app.prediction.AppPredictor createAppPredictionSession(@NonNull android.app.prediction.AppPredictionContext); - } - - public final class AppPredictionSessionId implements android.os.Parcelable { - method public int describeContents(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.prediction.AppPredictionSessionId> CREATOR; - } - public final class AppPredictor { - method public void destroy(); method public android.app.prediction.AppPredictionSessionId getSessionId(); - method public void notifyAppTargetEvent(@NonNull android.app.prediction.AppTargetEvent); - method public void notifyLaunchLocationShown(@NonNull String, @NonNull java.util.List<android.app.prediction.AppTargetId>); - method public void registerPredictionUpdates(@NonNull java.util.concurrent.Executor, @NonNull android.app.prediction.AppPredictor.Callback); - method public void requestPredictionUpdate(); - method @Nullable public void sortTargets(@NonNull java.util.List<android.app.prediction.AppTarget>, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.util.List<android.app.prediction.AppTarget>>); - method public void unregisterPredictionUpdates(@NonNull android.app.prediction.AppPredictor.Callback); - } - - public static interface AppPredictor.Callback { - method public void onTargetsAvailable(@NonNull java.util.List<android.app.prediction.AppTarget>); - } - - public final class AppTarget implements android.os.Parcelable { - method public int describeContents(); - method @Nullable public String getClassName(); - method @NonNull public android.app.prediction.AppTargetId getId(); - method @NonNull public String getPackageName(); - method @IntRange(from=0) public int getRank(); - method @Nullable public android.content.pm.ShortcutInfo getShortcutInfo(); - method @NonNull public android.os.UserHandle getUser(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.prediction.AppTarget> CREATOR; - } - - public static final class AppTarget.Builder { - ctor public AppTarget.Builder(@NonNull android.app.prediction.AppTargetId, @NonNull String, @NonNull android.os.UserHandle); - ctor public AppTarget.Builder(@NonNull android.app.prediction.AppTargetId, @NonNull android.content.pm.ShortcutInfo); - method @NonNull public android.app.prediction.AppTarget build(); - method @NonNull public android.app.prediction.AppTarget.Builder setClassName(@NonNull String); - method @NonNull public android.app.prediction.AppTarget.Builder setRank(@IntRange(from=0) int); - } - - public final class AppTargetEvent implements android.os.Parcelable { - method public int describeContents(); - method public int getAction(); - method @Nullable public String getLaunchLocation(); - method @Nullable public android.app.prediction.AppTarget getTarget(); - method public void writeToParcel(android.os.Parcel, int); - field public static final int ACTION_DISMISS = 2; // 0x2 - field public static final int ACTION_LAUNCH = 1; // 0x1 - field public static final int ACTION_PIN = 3; // 0x3 - field public static final int ACTION_UNPIN = 4; // 0x4 - field @NonNull public static final android.os.Parcelable.Creator<android.app.prediction.AppTargetEvent> CREATOR; - } - - public static final class AppTargetEvent.Builder { - ctor public AppTargetEvent.Builder(@Nullable android.app.prediction.AppTarget, int); - method @NonNull public android.app.prediction.AppTargetEvent build(); - method @NonNull public android.app.prediction.AppTargetEvent.Builder setLaunchLocation(@Nullable String); - } - - public final class AppTargetId implements android.os.Parcelable { - ctor public AppTargetId(@NonNull String); - method public int describeContents(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.prediction.AppTargetId> CREATOR; } } package android.app.role { - public interface OnRoleHoldersChangedListener { - method public void onRoleHoldersChanged(@NonNull String, @NonNull android.os.UserHandle); - } - public class RoleControllerManager { method @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public void isApplicationVisibleForRole(@NonNull String, @NonNull String, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>); method @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public void isRoleVisible(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>); } public final class RoleManager { - method @RequiresPermission(android.Manifest.permission.OBSERVE_ROLE_HOLDERS) public void addOnRoleHoldersChangedListenerAsUser(@NonNull java.util.concurrent.Executor, @NonNull android.app.role.OnRoleHoldersChangedListener, @NonNull android.os.UserHandle); - method @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public void addRoleHolderAsUser(@NonNull String, @NonNull String, int, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>); - method @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public boolean addRoleHolderFromController(@NonNull String, @NonNull String); - method @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public void clearRoleHoldersAsUser(@NonNull String, int, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>); - method @NonNull @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public java.util.List<java.lang.String> getHeldRolesFromController(@NonNull String); - method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public java.util.List<java.lang.String> getRoleHolders(@NonNull String); - method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public java.util.List<java.lang.String> getRoleHoldersAsUser(@NonNull String, @NonNull android.os.UserHandle); method @Nullable public String getSmsRoleHolder(int); - method @RequiresPermission(android.Manifest.permission.OBSERVE_ROLE_HOLDERS) public void removeOnRoleHoldersChangedListenerAsUser(@NonNull android.app.role.OnRoleHoldersChangedListener, @NonNull android.os.UserHandle); - method @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public void removeRoleHolderAsUser(@NonNull String, @NonNull String, int, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>); - method @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public boolean removeRoleHolderFromController(@NonNull String, @NonNull String); - method @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public void setRoleNamesFromController(@NonNull java.util.List<java.lang.String>); - field public static final int MANAGE_HOLDERS_FLAG_DONT_KILL_APP = 1; // 0x1 } } package android.app.usage { - public final class CacheQuotaHint implements android.os.Parcelable { - ctor public CacheQuotaHint(@NonNull android.app.usage.CacheQuotaHint.Builder); - method public int describeContents(); - method public long getQuota(); - method public int getUid(); - method @Nullable public android.app.usage.UsageStats getUsageStats(); - method @Nullable public String getVolumeUuid(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.usage.CacheQuotaHint> CREATOR; - field public static final long QUOTA_NOT_SET = -1L; // 0xffffffffffffffffL - } - - public static final class CacheQuotaHint.Builder { - ctor public CacheQuotaHint.Builder(); - ctor public CacheQuotaHint.Builder(@NonNull android.app.usage.CacheQuotaHint); - method @NonNull public android.app.usage.CacheQuotaHint build(); - method @NonNull public android.app.usage.CacheQuotaHint.Builder setQuota(long); - method @NonNull public android.app.usage.CacheQuotaHint.Builder setUid(int); - method @NonNull public android.app.usage.CacheQuotaHint.Builder setUsageStats(@Nullable android.app.usage.UsageStats); - method @NonNull public android.app.usage.CacheQuotaHint.Builder setVolumeUuid(@Nullable String); - } - public class NetworkStatsManager { method public void setPollForce(boolean); } @@ -845,23 +439,8 @@ package android.bluetooth { } -package android.companion { - - public final class CompanionDeviceManager { - method @RequiresPermission("android.permission.MANAGE_COMPANION_DEVICES") public boolean isDeviceAssociatedForWifiConnection(@NonNull String, @NonNull android.net.MacAddress, @NonNull android.os.UserHandle); - } - -} - package android.content { - public class ApexEnvironment { - method @NonNull public static android.content.ApexEnvironment getApexEnvironment(@NonNull String); - method @NonNull public java.io.File getCredentialProtectedDataDirForUser(@NonNull android.os.UserHandle); - method @NonNull public java.io.File getDeviceProtectedDataDir(); - method @NonNull public java.io.File getDeviceProtectedDataDirForUser(@NonNull android.os.UserHandle); - } - public final class AutofillOptions implements android.os.Parcelable { ctor public AutofillOptions(int, boolean); method public int describeContents(); @@ -897,36 +476,21 @@ package android.content { method @NonNull public static android.os.UserHandle getUserHandleFromUri(@NonNull android.net.Uri); } - public class ContentProviderClient implements java.lang.AutoCloseable { - method @RequiresPermission(android.Manifest.permission.REMOVE_TASKS) public void setDetectNotResponding(long); - } - public abstract class ContentResolver { - method @NonNull public static android.net.Uri decodeFromFile(@NonNull java.io.File); - method @NonNull public static java.io.File encodeToFile(@NonNull android.net.Uri); method public static String[] getSyncAdapterPackagesForAuthorityAsUser(String, int); } public abstract class Context { - method @NonNull public android.content.Context createContextAsUser(@NonNull android.os.UserHandle, int); - method @NonNull public android.content.Context createPackageContextAsUser(@NonNull String, int, @NonNull android.os.UserHandle) throws android.content.pm.PackageManager.NameNotFoundException; method @NonNull public java.io.File getCrateDir(@NonNull String); method public abstract int getDisplayId(); method public android.os.UserHandle getUser(); method public int getUserId(); method public void setAutofillOptions(@Nullable android.content.AutofillOptions); method public void setContentCaptureOptions(@Nullable android.content.ContentCaptureOptions); - method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public void startActivityAsUser(@NonNull @RequiresPermission android.content.Intent, @NonNull android.os.UserHandle); - field public static final String APP_INTEGRITY_SERVICE = "app_integrity"; - field public static final String BUGREPORT_SERVICE = "bugreport"; field public static final String CONTENT_CAPTURE_MANAGER_SERVICE = "content_capture"; field public static final String DEVICE_IDLE_CONTROLLER = "deviceidle"; field public static final String DREAM_SERVICE = "dream"; - field public static final String ETHERNET_SERVICE = "ethernet"; - field public static final String PERMISSION_SERVICE = "permission"; field public static final String POWER_WHITELIST_MANAGER = "power_whitelist"; - field public static final String ROLLBACK_SERVICE = "rollback"; - field public static final String STATUS_BAR_SERVICE = "statusbar"; field public static final String TEST_NETWORK_SERVICE = "test_network"; } @@ -934,75 +498,13 @@ package android.content { method public int getDisplayId(); } - public class Intent implements java.lang.Cloneable android.os.Parcelable { - field @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public static final String ACTION_MANAGE_DEFAULT_APP = "android.intent.action.MANAGE_DEFAULT_APP"; - field public static final String ACTION_ROLLBACK_COMMITTED = "android.intent.action.ROLLBACK_COMMITTED"; - field public static final String EXTRA_ORIGINATING_UID = "android.intent.extra.ORIGINATING_UID"; - field public static final String EXTRA_ROLE_NAME = "android.intent.extra.ROLE_NAME"; - } - } package android.content.integrity { public class AppIntegrityManager { method @NonNull public android.content.integrity.RuleSet getCurrentRuleSet(); - method @NonNull public String getCurrentRuleSetProvider(); - method @NonNull public String getCurrentRuleSetVersion(); method @NonNull public java.util.List<java.lang.String> getWhitelistedRuleProviders(); - method public void updateRuleSet(@NonNull android.content.integrity.RuleSet, @NonNull android.content.IntentSender); - field public static final String EXTRA_STATUS = "android.content.integrity.extra.STATUS"; - field public static final int STATUS_FAILURE = 1; // 0x1 - field public static final int STATUS_SUCCESS = 0; // 0x0 - } - - public abstract class IntegrityFormula { - method @NonNull public static android.content.integrity.IntegrityFormula all(@NonNull android.content.integrity.IntegrityFormula...); - method @NonNull public static android.content.integrity.IntegrityFormula any(@NonNull android.content.integrity.IntegrityFormula...); - method @NonNull public static android.content.integrity.IntegrityFormula not(@NonNull android.content.integrity.IntegrityFormula); - } - - public static final class IntegrityFormula.Application { - method @NonNull public static android.content.integrity.IntegrityFormula certificatesContain(@NonNull String); - method @NonNull public static android.content.integrity.IntegrityFormula isPreInstalled(); - method @NonNull public static android.content.integrity.IntegrityFormula packageNameEquals(@NonNull String); - method @NonNull public static android.content.integrity.IntegrityFormula versionCodeEquals(@NonNull long); - method @NonNull public static android.content.integrity.IntegrityFormula versionCodeGreaterThan(@NonNull long); - method @NonNull public static android.content.integrity.IntegrityFormula versionCodeGreaterThanOrEqualTo(@NonNull long); - } - - public static final class IntegrityFormula.Installer { - method @NonNull public static android.content.integrity.IntegrityFormula certificatesContain(@NonNull String); - method @NonNull public static android.content.integrity.IntegrityFormula notAllowedByManifest(); - method @NonNull public static android.content.integrity.IntegrityFormula packageNameEquals(@NonNull String); - } - - public static final class IntegrityFormula.SourceStamp { - method @NonNull public static android.content.integrity.IntegrityFormula notTrusted(); - method @NonNull public static android.content.integrity.IntegrityFormula stampCertificateHashEquals(@NonNull String); - } - - public final class Rule implements android.os.Parcelable { - ctor public Rule(@NonNull android.content.integrity.IntegrityFormula, int); - method public int describeContents(); - method public int getEffect(); - method @NonNull public android.content.integrity.IntegrityFormula getFormula(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.content.integrity.Rule> CREATOR; - field public static final int DENY = 0; // 0x0 - field public static final int FORCE_ALLOW = 1; // 0x1 - } - - public class RuleSet { - method @NonNull public java.util.List<android.content.integrity.Rule> getRules(); - method @NonNull public String getVersion(); - } - - public static class RuleSet.Builder { - ctor public RuleSet.Builder(); - method @NonNull public android.content.integrity.RuleSet.Builder addRules(@NonNull java.util.List<android.content.integrity.Rule>); - method @NonNull public android.content.integrity.RuleSet build(); - method @NonNull public android.content.integrity.RuleSet.Builder setVersion(@NonNull String); } } @@ -1019,95 +521,38 @@ package android.content.pm { method public boolean isSystemApp(); field public static final int PRIVATE_FLAG_PRIVILEGED = 8; // 0x8 field public int privateFlags; - field public int targetSandboxVersion; } public class LauncherApps { ctor public LauncherApps(android.content.Context); } - public static class PackageInstaller.SessionInfo implements android.os.Parcelable { - method public int getAutoRevokePermissionsMode(); - method public int getRollbackDataPolicy(); - method @NonNull public java.util.Set<java.lang.String> getWhitelistedRestrictedPermissions(); - } - public static class PackageInstaller.SessionParams implements android.os.Parcelable { - method public void setEnableRollback(boolean); - method public void setEnableRollback(boolean, int); - method @RequiresPermission(android.Manifest.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS) public void setGrantedRuntimePermissions(String[]); - method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setInstallAsApex(); - method public void setInstallAsInstantApp(boolean); method public void setInstallerPackageName(@Nullable String); - method public void setRequestDowngrade(boolean); - method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setStaged(); } public abstract class PackageManager { - method @RequiresPermission("android.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS") public abstract void addOnPermissionsChangeListener(@NonNull android.content.pm.PackageManager.OnPermissionsChangedListener); - method public abstract boolean arePermissionsIndividuallyControlled(); method @Nullable public String getContentCaptureServicePackageName(); - method @Nullable @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public abstract String getDefaultBrowserPackageNameAsUser(int); method @Nullable public String getDefaultTextClassifierPackageName(); - method @Nullable public String getIncidentReportApproverPackageName(); method public abstract int getInstallReason(@NonNull String, @NonNull android.os.UserHandle); method @NonNull public abstract java.util.List<android.content.pm.ApplicationInfo> getInstalledApplicationsAsUser(int, int); - method @NonNull @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public abstract java.util.List<android.content.pm.PackageInfo> getInstalledPackagesAsUser(int, int); method @Nullable public abstract String[] getNamesForUids(int[]); method @NonNull public abstract String getPermissionControllerPackageName(); - method @android.content.pm.PackageManager.PermissionFlags @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS, android.Manifest.permission.GET_RUNTIME_PERMISSIONS}) public abstract int getPermissionFlags(@NonNull String, @NonNull String, @NonNull android.os.UserHandle); method @NonNull public abstract String getServicesSystemSharedLibraryPackageName(); method @NonNull public abstract String getSharedSystemSharedLibraryPackageName(); method @Nullable public String getSystemTextClassifierPackageName(); method @Nullable public String getWellbeingPackageName(); - method @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS) public abstract void grantRuntimePermission(@NonNull String, @NonNull String, @NonNull android.os.UserHandle); method @RequiresPermission(android.Manifest.permission.INJECT_EVENTS) public void holdLock(int); - method @RequiresPermission("android.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS") public abstract void removeOnPermissionsChangeListener(@NonNull android.content.pm.PackageManager.OnPermissionsChangedListener); - method @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) public abstract void revokeRuntimePermission(@NonNull String, @NonNull String, @NonNull android.os.UserHandle); - method @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) public void revokeRuntimePermission(@NonNull String, @NonNull String, @NonNull android.os.UserHandle, @NonNull String); - method @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS}) public abstract void updatePermissionFlags(@NonNull String, @NonNull String, @android.content.pm.PackageManager.PermissionFlags int, @android.content.pm.PackageManager.PermissionFlags int, @NonNull android.os.UserHandle); field public static final String FEATURE_ADOPTABLE_STORAGE = "android.software.adoptable_storage"; field public static final String FEATURE_FILE_BASED_ENCRYPTION = "android.software.file_based_encryption"; - field public static final int FLAG_PERMISSION_APPLY_RESTRICTION = 16384; // 0x4000 - field public static final int FLAG_PERMISSION_GRANTED_BY_DEFAULT = 32; // 0x20 - field public static final int FLAG_PERMISSION_GRANTED_BY_ROLE = 32768; // 0x8000 - field public static final int FLAG_PERMISSION_ONE_TIME = 65536; // 0x10000 - field public static final int FLAG_PERMISSION_POLICY_FIXED = 4; // 0x4 - field public static final int FLAG_PERMISSION_RESTRICTION_INSTALLER_EXEMPT = 2048; // 0x800 - field public static final int FLAG_PERMISSION_RESTRICTION_ROLE_EXEMPT = 262144; // 0x40000 - field public static final int FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT = 4096; // 0x1000 - field public static final int FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT = 8192; // 0x2000 - field public static final int FLAG_PERMISSION_REVIEW_REQUIRED = 64; // 0x40 - field public static final int FLAG_PERMISSION_REVOKED_COMPAT = 8; // 0x8 - field @Deprecated public static final int FLAG_PERMISSION_REVOKE_ON_UPGRADE = 8; // 0x8 field public static final int FLAG_PERMISSION_REVOKE_WHEN_REQUESTED = 128; // 0x80 - field public static final int FLAG_PERMISSION_SYSTEM_FIXED = 16; // 0x10 - field public static final int FLAG_PERMISSION_USER_FIXED = 2; // 0x2 - field public static final int FLAG_PERMISSION_USER_SET = 1; // 0x1 - field public static final int MATCH_FACTORY_ONLY = 2097152; // 0x200000 field public static final int MATCH_KNOWN_PACKAGES = 4202496; // 0x402000 - field public static final int MODULE_APEX_NAME = 1; // 0x1 field public static final String SYSTEM_SHARED_LIBRARY_SERVICES = "android.ext.services"; field public static final String SYSTEM_SHARED_LIBRARY_SHARED = "android.ext.shared"; } - public static interface PackageManager.OnPermissionsChangedListener { - method public void onPermissionsChanged(int); - } - public class PermissionInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable { - field public static final int FLAG_REMOVED = 2; // 0x2 - field public static final int PROTECTION_FLAG_APP_PREDICTOR = 2097152; // 0x200000 - field public static final int PROTECTION_FLAG_COMPANION = 8388608; // 0x800000 - field public static final int PROTECTION_FLAG_CONFIGURATOR = 524288; // 0x80000 - field public static final int PROTECTION_FLAG_DOCUMENTER = 262144; // 0x40000 - field public static final int PROTECTION_FLAG_INCIDENT_REPORT_APPROVER = 1048576; // 0x100000 - field public static final int PROTECTION_FLAG_OEM = 16384; // 0x4000 - field public static final int PROTECTION_FLAG_RETAIL_DEMO = 16777216; // 0x1000000 - field public static final int PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER = 65536; // 0x10000 field public static final int PROTECTION_FLAG_VENDOR_PRIVILEGED = 32768; // 0x8000 - field public static final int PROTECTION_FLAG_WELLBEING = 131072; // 0x20000 - field @Nullable public final String backgroundPermission; } public final class ProviderInfoList implements android.os.Parcelable { @@ -1146,40 +591,11 @@ package android.content.res { package android.content.rollback { - public final class PackageRollbackInfo implements android.os.Parcelable { - method public int describeContents(); - method @NonNull public String getPackageName(); - method @NonNull public android.content.pm.VersionedPackage getVersionRolledBackFrom(); - method @NonNull public android.content.pm.VersionedPackage getVersionRolledBackTo(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.content.rollback.PackageRollbackInfo> CREATOR; - } - - public final class RollbackInfo implements android.os.Parcelable { - method public int describeContents(); - method @NonNull public java.util.List<android.content.pm.VersionedPackage> getCausePackages(); - method public int getCommittedSessionId(); - method @NonNull public java.util.List<android.content.rollback.PackageRollbackInfo> getPackages(); - method public int getRollbackId(); - method public boolean isStaged(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.content.rollback.RollbackInfo> CREATOR; - } - public final class RollbackManager { method @RequiresPermission(android.Manifest.permission.TEST_MANAGE_ROLLBACKS) public void blockRollbackManager(long); - method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, android.Manifest.permission.TEST_MANAGE_ROLLBACKS}) public void commitRollback(int, @NonNull java.util.List<android.content.pm.VersionedPackage>, @NonNull android.content.IntentSender); method @RequiresPermission(android.Manifest.permission.TEST_MANAGE_ROLLBACKS) public void expireRollbackForPackage(@NonNull String); - method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, android.Manifest.permission.TEST_MANAGE_ROLLBACKS}) public java.util.List<android.content.rollback.RollbackInfo> getAvailableRollbacks(); - method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, android.Manifest.permission.TEST_MANAGE_ROLLBACKS}) public java.util.List<android.content.rollback.RollbackInfo> getRecentlyCommittedRollbacks(); method @RequiresPermission(android.Manifest.permission.TEST_MANAGE_ROLLBACKS) public void reloadPersistedData(); - field public static final String EXTRA_STATUS = "android.content.rollback.extra.STATUS"; - field public static final String EXTRA_STATUS_MESSAGE = "android.content.rollback.extra.STATUS_MESSAGE"; field public static final String PROPERTY_ROLLBACK_LIFETIME_MILLIS = "rollback_lifetime_in_millis"; - field public static final int STATUS_FAILURE = 1; // 0x1 - field public static final int STATUS_FAILURE_INSTALL = 3; // 0x3 - field public static final int STATUS_FAILURE_ROLLBACK_UNAVAILABLE = 2; // 0x2 - field public static final int STATUS_SUCCESS = 0; // 0x0 } } @@ -1272,8 +688,8 @@ package android.hardware.biometrics { method @RequiresPermission(android.Manifest.permission.TEST_BIOMETRIC) public void cleanupInternalState(int); method @RequiresPermission(android.Manifest.permission.TEST_BIOMETRIC) public void close(); method @RequiresPermission(android.Manifest.permission.TEST_BIOMETRIC) public void finishEnroll(int); - method @RequiresPermission(android.Manifest.permission.TEST_BIOMETRIC) public void notifyAcquired(int); - method @RequiresPermission(android.Manifest.permission.TEST_BIOMETRIC) public void notifyError(int); + method @RequiresPermission(android.Manifest.permission.TEST_BIOMETRIC) public void notifyAcquired(int, int); + method @RequiresPermission(android.Manifest.permission.TEST_BIOMETRIC) public void notifyError(int, int); method @RequiresPermission(android.Manifest.permission.TEST_BIOMETRIC) public void rejectAuthentication(int); method @RequiresPermission(android.Manifest.permission.TEST_BIOMETRIC) public void startEnroll(int); } @@ -1290,13 +706,6 @@ package android.hardware.biometrics { package android.hardware.camera2 { - public abstract class CameraDevice implements java.lang.AutoCloseable { - method @Deprecated public abstract void createCustomCaptureSession(android.hardware.camera2.params.InputConfiguration, @NonNull java.util.List<android.hardware.camera2.params.OutputConfiguration>, int, @NonNull android.hardware.camera2.CameraCaptureSession.StateCallback, @Nullable android.os.Handler) throws android.hardware.camera2.CameraAccessException; - field public static final int SESSION_OPERATION_MODE_CONSTRAINED_HIGH_SPEED = 1; // 0x1 - field public static final int SESSION_OPERATION_MODE_NORMAL = 0; // 0x0 - field public static final int SESSION_OPERATION_MODE_VENDOR_START = 32768; // 0x8000 - } - public final class CameraManager { method public String[] getCameraIdListNoLazy() throws android.hardware.camera2.CameraAccessException; } @@ -1305,15 +714,6 @@ package android.hardware.camera2 { package android.hardware.display { - public final class AmbientBrightnessDayStats implements android.os.Parcelable { - method public int describeContents(); - method public float[] getBucketBoundaries(); - method public java.time.LocalDate getLocalDate(); - method public float[] getStats(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.hardware.display.AmbientBrightnessDayStats> CREATOR; - } - public class AmbientDisplayConfiguration { ctor public AmbientDisplayConfiguration(android.content.Context); method public boolean alwaysOnAvailable(); @@ -1321,70 +721,8 @@ package android.hardware.display { method public boolean alwaysOnEnabled(int); } - public final class BrightnessChangeEvent implements android.os.Parcelable { - method public int describeContents(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.hardware.display.BrightnessChangeEvent> CREATOR; - field public final float batteryLevel; - field public final float brightness; - field public final long colorSampleDuration; - field public final int colorTemperature; - field @Nullable public final long[] colorValueBuckets; - field public final boolean isDefaultBrightnessConfig; - field public final boolean isUserSetBrightness; - field public final float lastBrightness; - field public final long[] luxTimestamps; - field public final float[] luxValues; - field public final boolean nightMode; - field public final String packageName; - field public final float powerBrightnessFactor; - field public final long timeStamp; - } - - public final class BrightnessConfiguration implements android.os.Parcelable { - method public int describeContents(); - method @Nullable public android.hardware.display.BrightnessCorrection getCorrectionByCategory(int); - method @Nullable public android.hardware.display.BrightnessCorrection getCorrectionByPackageName(@NonNull String); - method public android.util.Pair<float[],float[]> getCurve(); - method public float getShortTermModelLowerLuxMultiplier(); - method public long getShortTermModelTimeoutMillis(); - method public float getShortTermModelUpperLuxMultiplier(); - method public boolean shouldCollectColorSamples(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.hardware.display.BrightnessConfiguration> CREATOR; - field public static final long SHORT_TERM_TIMEOUT_UNSET = -1L; // 0xffffffffffffffffL - } - - public static class BrightnessConfiguration.Builder { - ctor public BrightnessConfiguration.Builder(float[], float[]); - method @NonNull public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByCategory(int, @NonNull android.hardware.display.BrightnessCorrection); - method @NonNull public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByPackageName(@NonNull String, @NonNull android.hardware.display.BrightnessCorrection); - method @NonNull public android.hardware.display.BrightnessConfiguration build(); - method public int getMaxCorrectionsByCategory(); - method public int getMaxCorrectionsByPackageName(); - method @NonNull public android.hardware.display.BrightnessConfiguration.Builder setDescription(@Nullable String); - method @NonNull public android.hardware.display.BrightnessConfiguration.Builder setShortTermModelLowerLuxMultiplier(@FloatRange(from=0.0f) float); - method @NonNull public android.hardware.display.BrightnessConfiguration.Builder setShortTermModelTimeoutMillis(long); - method @NonNull public android.hardware.display.BrightnessConfiguration.Builder setShortTermModelUpperLuxMultiplier(@FloatRange(from=0.0f) float); - method @NonNull public android.hardware.display.BrightnessConfiguration.Builder setShouldCollectColorSamples(boolean); - } - - public final class BrightnessCorrection implements android.os.Parcelable { - method @FloatRange(from=0.0) public float apply(@FloatRange(from=0.0) float); - method @NonNull public static android.hardware.display.BrightnessCorrection createScaleAndTranslateLog(float, float); - method public int describeContents(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.hardware.display.BrightnessCorrection> CREATOR; - } - public final class DisplayManager { - method @RequiresPermission(android.Manifest.permission.ACCESS_AMBIENT_LIGHT_STATS) public java.util.List<android.hardware.display.AmbientBrightnessDayStats> getAmbientBrightnessStats(); - method @RequiresPermission(android.Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) public android.hardware.display.BrightnessConfiguration getBrightnessConfiguration(); - method @RequiresPermission(android.Manifest.permission.BRIGHTNESS_SLIDER_USAGE) public java.util.List<android.hardware.display.BrightnessChangeEvent> getBrightnessEvents(); - method @Nullable @RequiresPermission(android.Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) public android.hardware.display.BrightnessConfiguration getDefaultBrightnessConfiguration(); - method public android.graphics.Point getStableDisplaySize(); method public boolean isMinimalPostProcessingRequested(int); - method @RequiresPermission(android.Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) public void setBrightnessConfiguration(android.hardware.display.BrightnessConfiguration); method @RequiresPermission(android.Manifest.permission.OVERRIDE_DISPLAY_MODE_REQUESTS) public void setShouldAlwaysRespectAppRequestedMode(boolean); method @RequiresPermission(android.Manifest.permission.OVERRIDE_DISPLAY_MODE_REQUESTS) public boolean shouldAlwaysRespectAppRequestedMode(); field public static final int VIRTUAL_DISPLAY_FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS = 512; // 0x200 @@ -1404,97 +742,6 @@ package android.hardware.fingerprint { package android.hardware.hdmi { - public final class HdmiControlManager { - method @Nullable public android.hardware.hdmi.HdmiSwitchClient getSwitchClient(); - method @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void setStandbyMode(boolean); - field public static final String ACTION_OSD_MESSAGE = "android.hardware.hdmi.action.OSD_MESSAGE"; - field public static final int AVR_VOLUME_MUTED = 101; // 0x65 - field public static final int CLEAR_TIMER_STATUS_CEC_DISABLE = 162; // 0xa2 - field public static final int CLEAR_TIMER_STATUS_CHECK_RECORDER_CONNECTION = 160; // 0xa0 - field public static final int CLEAR_TIMER_STATUS_FAIL_TO_CLEAR_SELECTED_SOURCE = 161; // 0xa1 - field public static final int CLEAR_TIMER_STATUS_TIMER_CLEARED = 128; // 0x80 - field public static final int CLEAR_TIMER_STATUS_TIMER_NOT_CLEARED_NO_INFO_AVAILABLE = 2; // 0x2 - field public static final int CLEAR_TIMER_STATUS_TIMER_NOT_CLEARED_NO_MATCHING = 1; // 0x1 - field public static final int CLEAR_TIMER_STATUS_TIMER_NOT_CLEARED_RECORDING = 0; // 0x0 - field public static final int CONTROL_STATE_CHANGED_REASON_SETTING = 1; // 0x1 - field public static final int CONTROL_STATE_CHANGED_REASON_STANDBY = 3; // 0x3 - field public static final int CONTROL_STATE_CHANGED_REASON_START = 0; // 0x0 - field public static final int CONTROL_STATE_CHANGED_REASON_WAKEUP = 2; // 0x2 - field public static final int DEVICE_EVENT_ADD_DEVICE = 1; // 0x1 - field public static final int DEVICE_EVENT_REMOVE_DEVICE = 2; // 0x2 - field public static final int DEVICE_EVENT_UPDATE_DEVICE = 3; // 0x3 - field public static final String EXTRA_MESSAGE_EXTRA_PARAM1 = "android.hardware.hdmi.extra.MESSAGE_EXTRA_PARAM1"; - field public static final String EXTRA_MESSAGE_ID = "android.hardware.hdmi.extra.MESSAGE_ID"; - field public static final int ONE_TOUCH_RECORD_ALREADY_RECORDING = 18; // 0x12 - field public static final int ONE_TOUCH_RECORD_CEC_DISABLED = 51; // 0x33 - field public static final int ONE_TOUCH_RECORD_CHECK_RECORDER_CONNECTION = 49; // 0x31 - field public static final int ONE_TOUCH_RECORD_DISALLOW_TO_COPY = 13; // 0xd - field public static final int ONE_TOUCH_RECORD_DISALLOW_TO_FUTHER_COPIES = 14; // 0xe - field public static final int ONE_TOUCH_RECORD_FAIL_TO_RECORD_DISPLAYED_SCREEN = 50; // 0x32 - field public static final int ONE_TOUCH_RECORD_INVALID_EXTERNAL_PHYSICAL_ADDRESS = 10; // 0xa - field public static final int ONE_TOUCH_RECORD_INVALID_EXTERNAL_PLUG_NUMBER = 9; // 0x9 - field public static final int ONE_TOUCH_RECORD_MEDIA_PROBLEM = 21; // 0x15 - field public static final int ONE_TOUCH_RECORD_MEDIA_PROTECTED = 19; // 0x13 - field public static final int ONE_TOUCH_RECORD_NOT_ENOUGH_SPACE = 22; // 0x16 - field public static final int ONE_TOUCH_RECORD_NO_MEDIA = 16; // 0x10 - field public static final int ONE_TOUCH_RECORD_NO_OR_INSUFFICIENT_CA_ENTITLEMENTS = 12; // 0xc - field public static final int ONE_TOUCH_RECORD_NO_SOURCE_SIGNAL = 20; // 0x14 - field public static final int ONE_TOUCH_RECORD_OTHER_REASON = 31; // 0x1f - field public static final int ONE_TOUCH_RECORD_PARENT_LOCK_ON = 23; // 0x17 - field public static final int ONE_TOUCH_RECORD_PLAYING = 17; // 0x11 - field public static final int ONE_TOUCH_RECORD_PREVIOUS_RECORDING_IN_PROGRESS = 48; // 0x30 - field public static final int ONE_TOUCH_RECORD_RECORDING_ALREADY_TERMINATED = 27; // 0x1b - field public static final int ONE_TOUCH_RECORD_RECORDING_ANALOGUE_SERVICE = 3; // 0x3 - field public static final int ONE_TOUCH_RECORD_RECORDING_CURRENTLY_SELECTED_SOURCE = 1; // 0x1 - field public static final int ONE_TOUCH_RECORD_RECORDING_DIGITAL_SERVICE = 2; // 0x2 - field public static final int ONE_TOUCH_RECORD_RECORDING_EXTERNAL_INPUT = 4; // 0x4 - field public static final int ONE_TOUCH_RECORD_RECORDING_TERMINATED_NORMALLY = 26; // 0x1a - field public static final int ONE_TOUCH_RECORD_UNABLE_ANALOGUE_SERVICE = 6; // 0x6 - field public static final int ONE_TOUCH_RECORD_UNABLE_DIGITAL_SERVICE = 5; // 0x5 - field public static final int ONE_TOUCH_RECORD_UNABLE_SELECTED_SERVICE = 7; // 0x7 - field public static final int ONE_TOUCH_RECORD_UNSUPPORTED_CA = 11; // 0xb - field public static final int OSD_MESSAGE_ARC_CONNECTED_INVALID_PORT = 1; // 0x1 - field public static final int OSD_MESSAGE_AVR_VOLUME_CHANGED = 2; // 0x2 - field public static final int POWER_STATUS_ON = 0; // 0x0 - field public static final int POWER_STATUS_STANDBY = 1; // 0x1 - field public static final int POWER_STATUS_TRANSIENT_TO_ON = 2; // 0x2 - field public static final int POWER_STATUS_TRANSIENT_TO_STANDBY = 3; // 0x3 - field public static final int POWER_STATUS_UNKNOWN = -1; // 0xffffffff - field @Deprecated public static final int RESULT_ALREADY_IN_PROGRESS = 4; // 0x4 - field public static final int RESULT_COMMUNICATION_FAILED = 7; // 0x7 - field public static final int RESULT_EXCEPTION = 5; // 0x5 - field public static final int RESULT_INCORRECT_MODE = 6; // 0x6 - field public static final int RESULT_SOURCE_NOT_AVAILABLE = 2; // 0x2 - field public static final int RESULT_SUCCESS = 0; // 0x0 - field public static final int RESULT_TARGET_NOT_AVAILABLE = 3; // 0x3 - field public static final int RESULT_TIMEOUT = 1; // 0x1 - field public static final int TIMER_RECORDING_RESULT_EXTRA_CEC_DISABLED = 3; // 0x3 - field public static final int TIMER_RECORDING_RESULT_EXTRA_CHECK_RECORDER_CONNECTION = 1; // 0x1 - field public static final int TIMER_RECORDING_RESULT_EXTRA_FAIL_TO_RECORD_SELECTED_SOURCE = 2; // 0x2 - field public static final int TIMER_RECORDING_RESULT_EXTRA_NO_ERROR = 0; // 0x0 - field public static final int TIMER_RECORDING_TYPE_ANALOGUE = 2; // 0x2 - field public static final int TIMER_RECORDING_TYPE_DIGITAL = 1; // 0x1 - field public static final int TIMER_RECORDING_TYPE_EXTERNAL = 3; // 0x3 - field public static final int TIMER_STATUS_MEDIA_INFO_NOT_PRESENT = 2; // 0x2 - field public static final int TIMER_STATUS_MEDIA_INFO_PRESENT_NOT_PROTECTED = 0; // 0x0 - field public static final int TIMER_STATUS_MEDIA_INFO_PRESENT_PROTECTED = 1; // 0x1 - field public static final int TIMER_STATUS_NOT_PROGRAMMED_CA_NOT_SUPPORTED = 6; // 0x6 - field public static final int TIMER_STATUS_NOT_PROGRAMMED_CLOCK_FAILURE = 10; // 0xa - field public static final int TIMER_STATUS_NOT_PROGRAMMED_DATE_OUT_OF_RANGE = 2; // 0x2 - field public static final int TIMER_STATUS_NOT_PROGRAMMED_DUPLICATED = 14; // 0xe - field public static final int TIMER_STATUS_NOT_PROGRAMMED_INVALID_EXTERNAL_PHYSICAL_NUMBER = 5; // 0x5 - field public static final int TIMER_STATUS_NOT_PROGRAMMED_INVALID_EXTERNAL_PLUG_NUMBER = 4; // 0x4 - field public static final int TIMER_STATUS_NOT_PROGRAMMED_INVALID_SEQUENCE = 3; // 0x3 - field public static final int TIMER_STATUS_NOT_PROGRAMMED_NO_CA_ENTITLEMENTS = 7; // 0x7 - field public static final int TIMER_STATUS_NOT_PROGRAMMED_NO_FREE_TIME = 1; // 0x1 - field public static final int TIMER_STATUS_NOT_PROGRAMMED_PARENTAL_LOCK_ON = 9; // 0x9 - field public static final int TIMER_STATUS_NOT_PROGRAMMED_UNSUPPORTED_RESOLUTION = 8; // 0x8 - field public static final int TIMER_STATUS_PROGRAMMED_INFO_ENOUGH_SPACE = 8; // 0x8 - field public static final int TIMER_STATUS_PROGRAMMED_INFO_MIGHT_NOT_ENOUGH_SPACE = 11; // 0xb - field public static final int TIMER_STATUS_PROGRAMMED_INFO_NOT_ENOUGH_SPACE = 9; // 0x9 - field public static final int TIMER_STATUS_PROGRAMMED_INFO_NO_MEDIA_INFO = 10; // 0xa - } - public final class HdmiControlServiceWrapper { ctor public HdmiControlServiceWrapper(); method @NonNull public android.hardware.hdmi.HdmiControlManager createHdmiControlManager(); @@ -1503,25 +750,6 @@ package android.hardware.hdmi { field public static final int DEVICE_PURE_CEC_SWITCH = 6; // 0x6 } - public final class HdmiPortInfo implements android.os.Parcelable { - ctor public HdmiPortInfo(int, int, int, boolean, boolean, boolean); - method public int describeContents(); - method public int getAddress(); - method public int getId(); - method public int getType(); - method public boolean isArcSupported(); - method public boolean isCecSupported(); - method public boolean isMhlSupported(); - field @NonNull public static final android.os.Parcelable.Creator<android.hardware.hdmi.HdmiPortInfo> CREATOR; - field public static final int PORT_INPUT = 0; // 0x0 - field public static final int PORT_OUTPUT = 1; // 0x1 - } - - public class HdmiSwitchClient extends android.hardware.hdmi.HdmiClient { - method public int getDeviceType(); - method @NonNull public java.util.List<android.hardware.hdmi.HdmiPortInfo> getPortInfo(); - } - } package android.hardware.input { @@ -1538,43 +766,8 @@ package android.hardware.input { package android.hardware.lights { - public final class Light implements android.os.Parcelable { - method public int describeContents(); - method public int getId(); - method public int getOrdinal(); - method public int getType(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.hardware.lights.Light> CREATOR; - } - - public final class LightState implements android.os.Parcelable { - ctor public LightState(@ColorInt int); - method public int describeContents(); - method @ColorInt public int getColor(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.hardware.lights.LightState> CREATOR; - } - public final class LightsManager { method @NonNull @RequiresPermission(android.Manifest.permission.CONTROL_DEVICE_LIGHTS) public android.hardware.lights.LightState getLightState(@NonNull android.hardware.lights.Light); - method @NonNull @RequiresPermission(android.Manifest.permission.CONTROL_DEVICE_LIGHTS) public java.util.List<android.hardware.lights.Light> getLights(); - method @NonNull @RequiresPermission(android.Manifest.permission.CONTROL_DEVICE_LIGHTS) public android.hardware.lights.LightsManager.LightsSession openSession(); - field public static final int LIGHT_TYPE_MICROPHONE = 8; // 0x8 - } - - public final class LightsManager.LightsSession implements java.lang.AutoCloseable { - method @RequiresPermission(android.Manifest.permission.CONTROL_DEVICE_LIGHTS) public void close(); - method @RequiresPermission(android.Manifest.permission.CONTROL_DEVICE_LIGHTS) public void requestLights(@NonNull android.hardware.lights.LightsRequest); - } - - public final class LightsRequest { - } - - public static final class LightsRequest.Builder { - ctor public LightsRequest.Builder(); - method @NonNull public android.hardware.lights.LightsRequest build(); - method @NonNull public android.hardware.lights.LightsRequest.Builder clearLight(@NonNull android.hardware.lights.Light); - method @NonNull public android.hardware.lights.LightsRequest.Builder setLight(@NonNull android.hardware.lights.Light, @NonNull android.hardware.lights.LightState); } } @@ -1605,84 +798,16 @@ package android.hardware.soundtrigger { field @NonNull public static final android.os.Parcelable.Creator<android.hardware.soundtrigger.KeyphraseMetadata> CREATOR; } - public class SoundTrigger { - field public static final int RECOGNITION_MODE_GENERIC = 8; // 0x8 - field public static final int RECOGNITION_MODE_USER_AUTHENTICATION = 4; // 0x4 - field public static final int RECOGNITION_MODE_USER_IDENTIFICATION = 2; // 0x2 - field public static final int RECOGNITION_MODE_VOICE_TRIGGER = 1; // 0x1 - field public static final int STATUS_OK = 0; // 0x0 - } - - public static final class SoundTrigger.Keyphrase implements android.os.Parcelable { - ctor public SoundTrigger.Keyphrase(int, int, @NonNull java.util.Locale, @NonNull String, @Nullable int[]); - method public int getId(); - method @NonNull public java.util.Locale getLocale(); - method public int getRecognitionModes(); - method @NonNull public String getText(); - method @NonNull public int[] getUsers(); - method @NonNull public static android.hardware.soundtrigger.SoundTrigger.Keyphrase readFromParcel(@NonNull android.os.Parcel); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.hardware.soundtrigger.SoundTrigger.Keyphrase> CREATOR; - } - - public static final class SoundTrigger.KeyphraseSoundModel extends android.hardware.soundtrigger.SoundTrigger.SoundModel implements android.os.Parcelable { - ctor public SoundTrigger.KeyphraseSoundModel(@NonNull java.util.UUID, @NonNull java.util.UUID, @Nullable byte[], @Nullable android.hardware.soundtrigger.SoundTrigger.Keyphrase[], int); - ctor public SoundTrigger.KeyphraseSoundModel(@NonNull java.util.UUID, @NonNull java.util.UUID, @Nullable byte[], @Nullable android.hardware.soundtrigger.SoundTrigger.Keyphrase[]); - method @NonNull public android.hardware.soundtrigger.SoundTrigger.Keyphrase[] getKeyphrases(); - method @NonNull public static android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel readFromParcel(@NonNull android.os.Parcel); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel> CREATOR; - } - public static final class SoundTrigger.ModelParamRange implements android.os.Parcelable { ctor public SoundTrigger.ModelParamRange(int, int); - method public int getEnd(); - method public int getStart(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.hardware.soundtrigger.SoundTrigger.ModelParamRange> CREATOR; } public static final class SoundTrigger.ModuleProperties implements android.os.Parcelable { ctor public SoundTrigger.ModuleProperties(int, @NonNull String, @NonNull String, @NonNull String, int, @NonNull String, int, int, int, int, boolean, int, boolean, int, boolean, int); - method public int describeContents(); - method public int getAudioCapabilities(); - method @NonNull public String getDescription(); - method public int getId(); - method @NonNull public String getImplementor(); - method public int getMaxBufferMillis(); - method public int getMaxKeyphrases(); - method public int getMaxSoundModels(); - method public int getMaxUsers(); - method public int getPowerConsumptionMw(); - method public int getRecognitionModes(); - method @NonNull public String getSupportedModelArch(); - method @NonNull public java.util.UUID getUuid(); - method public int getVersion(); - method public boolean isCaptureTransitionSupported(); - method public boolean isConcurrentCaptureSupported(); - method public boolean isTriggerReturnedInEvent(); - method public void writeToParcel(android.os.Parcel, int); - field public static final int AUDIO_CAPABILITY_ECHO_CANCELLATION = 1; // 0x1 - field public static final int AUDIO_CAPABILITY_NOISE_SUPPRESSION = 2; // 0x2 - field @NonNull public static final android.os.Parcelable.Creator<android.hardware.soundtrigger.SoundTrigger.ModuleProperties> CREATOR; } public static class SoundTrigger.RecognitionEvent { ctor public SoundTrigger.RecognitionEvent(int, int, boolean, int, int, int, boolean, @NonNull android.media.AudioFormat, @Nullable byte[]); - method @Nullable public android.media.AudioFormat getCaptureFormat(); - method public int getCaptureSession(); - method public byte[] getData(); - method public boolean isCaptureAvailable(); - } - - public static class SoundTrigger.SoundModel { - method @NonNull public byte[] getData(); - method public int getType(); - method @NonNull public java.util.UUID getUuid(); - method @NonNull public java.util.UUID getVendorUuid(); - method public int getVersion(); - field public static final int TYPE_GENERIC_SOUND = 1; // 0x1 - field public static final int TYPE_KEYPHRASE = 0; // 0x0 } } @@ -1781,59 +906,17 @@ package android.location { method public void setType(int); } - public class Location implements android.os.Parcelable { - method public void makeComplete(); - field @Deprecated public static final String EXTRA_NO_GPS_LOCATION = "noGPSLocation"; - } - public class LocationManager { method @NonNull public String[] getBackgroundThrottlingWhitelist(); - method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void getCurrentLocation(@NonNull android.location.LocationRequest, @Nullable android.os.CancellationSignal, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<android.location.Location>); method @NonNull public String[] getIgnoreSettingsWhitelist(); method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public java.util.List<java.lang.String> getProviderPackages(@NonNull String); - method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@Nullable android.location.LocationRequest, @NonNull android.location.LocationListener, @Nullable android.os.Looper); - method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@Nullable android.location.LocationRequest, @NonNull java.util.concurrent.Executor, @NonNull android.location.LocationListener); - method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@Nullable android.location.LocationRequest, @NonNull android.app.PendingIntent); - method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void setLocationEnabledForUser(boolean, @NonNull android.os.UserHandle); field public static final String FUSED_PROVIDER = "fused"; } - public final class LocationRequest implements android.os.Parcelable { - method @NonNull public android.os.WorkSource getWorkSource(); - method public boolean isHiddenFromAppOps(); - method public boolean isLocationSettingsIgnored(); - method public boolean isLowPower(); - field @Deprecated public static final int ACCURACY_BLOCK = 102; // 0x66 - field @Deprecated public static final int ACCURACY_CITY = 104; // 0x68 - field @Deprecated public static final int ACCURACY_FINE = 100; // 0x64 - field @Deprecated public static final int POWER_HIGH = 203; // 0xcb - field @Deprecated public static final int POWER_LOW = 201; // 0xc9 - } - - public static final class LocationRequest.Builder { - method @NonNull @RequiresPermission(android.Manifest.permission.UPDATE_APP_OPS_STATS) public android.location.LocationRequest.Builder setHiddenFromAppOps(boolean); - method @NonNull @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public android.location.LocationRequest.Builder setLocationSettingsIgnored(boolean); - method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.location.LocationRequest.Builder setLowPower(boolean); - method @NonNull @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public android.location.LocationRequest.Builder setWorkSource(@Nullable android.os.WorkSource); - } - } package android.media { - public final class AudioFocusInfo implements android.os.Parcelable { - method public int describeContents(); - method @NonNull public android.media.AudioAttributes getAttributes(); - method @NonNull public String getClientId(); - method public int getClientUid(); - method public int getFlags(); - method public int getGainRequest(); - method public int getLossReceived(); - method @NonNull public String getPackageName(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.media.AudioFocusInfo> CREATOR; - } - public final class AudioFocusRequest { method @Nullable public android.media.AudioManager.OnAudioFocusChangeListener getOnAudioFocusChangeListener(); } @@ -1846,13 +929,7 @@ package android.media { } public class AudioManager { - method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int dispatchAudioFocusChange(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy); method public boolean hasRegisteredDynamicPolicy(); - method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int registerAudioPolicy(@NonNull android.media.audiopolicy.AudioPolicy); - method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setFocusRequestResult(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy); - method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void unregisterAudioPolicy(@NonNull android.media.audiopolicy.AudioPolicy); - method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void unregisterAudioPolicyAsync(@NonNull android.media.audiopolicy.AudioPolicy); - field public static final int SUCCESS = 0; // 0x0 } public static final class AudioRecord.MetricsConstants { @@ -1908,68 +985,6 @@ package android.media { method @NonNull public String getOriginalId(); } - public final class MediaTranscodeManager { - method @NonNull public android.media.MediaTranscodeManager.TranscodingJob enqueueRequest(@NonNull android.media.MediaTranscodeManager.TranscodingRequest, @NonNull java.util.concurrent.Executor, @NonNull android.media.MediaTranscodeManager.OnTranscodingFinishedListener) throws java.io.FileNotFoundException, android.media.MediaTranscodingException.ServiceNotAvailableException; - field public static final int PRIORITY_REALTIME = 1; // 0x1 - field public static final int TRANSCODING_TYPE_VIDEO = 1; // 0x1 - } - - @java.lang.FunctionalInterface public static interface MediaTranscodeManager.OnTranscodingFinishedListener { - method public void onTranscodingFinished(@NonNull android.media.MediaTranscodeManager.TranscodingJob); - } - - public static final class MediaTranscodeManager.TranscodingJob { - method public void cancel(); - method public int getJobId(); - method @IntRange(from=0, to=100) public int getProgress(); - method public int getResult(); - method public int getStatus(); - method public void setOnProgressUpdateListener(@NonNull java.util.concurrent.Executor, @Nullable android.media.MediaTranscodeManager.TranscodingJob.OnProgressUpdateListener); - method public void setOnProgressUpdateListener(int, @NonNull java.util.concurrent.Executor, @Nullable android.media.MediaTranscodeManager.TranscodingJob.OnProgressUpdateListener); - field public static final int RESULT_CANCELED = 4; // 0x4 - field public static final int RESULT_ERROR = 3; // 0x3 - field public static final int RESULT_NONE = 1; // 0x1 - field public static final int RESULT_SUCCESS = 2; // 0x2 - field public static final int STATUS_FINISHED = 3; // 0x3 - field public static final int STATUS_PAUSED = 4; // 0x4 - field public static final int STATUS_PENDING = 1; // 0x1 - field public static final int STATUS_RUNNING = 2; // 0x2 - } - - @java.lang.FunctionalInterface public static interface MediaTranscodeManager.TranscodingJob.OnProgressUpdateListener { - method public void onProgressUpdate(@NonNull android.media.MediaTranscodeManager.TranscodingJob, @IntRange(from=0, to=100) int); - } - - public static final class MediaTranscodeManager.TranscodingRequest { - method public int getClientPid(); - method public int getClientUid(); - method @NonNull public android.net.Uri getDestinationUri(); - method public int getPriority(); - method @NonNull public android.net.Uri getSourceUri(); - method public int getType(); - method @Nullable public android.media.MediaFormat getVideoTrackFormat(); - } - - public static final class MediaTranscodeManager.TranscodingRequest.Builder { - ctor public MediaTranscodeManager.TranscodingRequest.Builder(); - method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest build(); - method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setClientPid(int); - method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setClientUid(int); - method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setDestinationUri(@NonNull android.net.Uri); - method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setPriority(int); - method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setSourceUri(@NonNull android.net.Uri); - method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setType(int); - method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setVideoTrackFormat(@NonNull android.media.MediaFormat); - } - - public static class MediaTranscodeManager.TranscodingRequest.MediaFormatResolver { - ctor public MediaTranscodeManager.TranscodingRequest.MediaFormatResolver(); - method @Nullable public android.media.MediaFormat resolveVideoFormat(); - method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.MediaFormatResolver setSourceVideoFormatHint(@NonNull android.media.MediaFormat); - method public boolean shouldTranscode(); - field public static final String CAPS_SUPPORTS_HEVC = "support-hevc"; - } - public final class PlaybackParams implements android.os.Parcelable { method public int getAudioStretchMode(); method public android.media.PlaybackParams setAudioStretchMode(int); @@ -2018,141 +1033,8 @@ package android.media.audiofx { package android.media.audiopolicy { - public class AudioMix { - method public int getMixState(); - field public static final int MIX_STATE_DISABLED = -1; // 0xffffffff - field public static final int MIX_STATE_IDLE = 0; // 0x0 - field public static final int MIX_STATE_MIXING = 1; // 0x1 - field public static final int ROUTE_FLAG_LOOP_BACK = 2; // 0x2 - field public static final int ROUTE_FLAG_RENDER = 1; // 0x1 - } - - public static class AudioMix.Builder { - ctor public AudioMix.Builder(android.media.audiopolicy.AudioMixingRule) throws java.lang.IllegalArgumentException; - method public android.media.audiopolicy.AudioMix build() throws java.lang.IllegalArgumentException; - method public android.media.audiopolicy.AudioMix.Builder setDevice(@NonNull android.media.AudioDeviceInfo) throws java.lang.IllegalArgumentException; - method public android.media.audiopolicy.AudioMix.Builder setFormat(android.media.AudioFormat) throws java.lang.IllegalArgumentException; - method public android.media.audiopolicy.AudioMix.Builder setRouteFlags(int) throws java.lang.IllegalArgumentException; - } - - public class AudioMixingRule { - field public static final int RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET = 2; // 0x2 - field public static final int RULE_MATCH_ATTRIBUTE_USAGE = 1; // 0x1 - field public static final int RULE_MATCH_UID = 4; // 0x4 - field public static final int RULE_MATCH_USERID = 8; // 0x8 - } - - public static class AudioMixingRule.Builder { - ctor public AudioMixingRule.Builder(); - method public android.media.audiopolicy.AudioMixingRule.Builder addMixRule(int, Object) throws java.lang.IllegalArgumentException; - method public android.media.audiopolicy.AudioMixingRule.Builder addRule(android.media.AudioAttributes, int) throws java.lang.IllegalArgumentException; - method @NonNull public android.media.audiopolicy.AudioMixingRule.Builder allowPrivilegedPlaybackCapture(boolean); - method public android.media.audiopolicy.AudioMixingRule build(); - method public android.media.audiopolicy.AudioMixingRule.Builder excludeMixRule(int, Object) throws java.lang.IllegalArgumentException; - method public android.media.audiopolicy.AudioMixingRule.Builder excludeRule(android.media.AudioAttributes, int) throws java.lang.IllegalArgumentException; - } - - public class AudioPolicy { - method public int attachMixes(@NonNull java.util.List<android.media.audiopolicy.AudioMix>); - method public android.media.AudioRecord createAudioRecordSink(android.media.audiopolicy.AudioMix) throws java.lang.IllegalArgumentException; - method public android.media.AudioTrack createAudioTrackSource(android.media.audiopolicy.AudioMix) throws java.lang.IllegalArgumentException; - method public int detachMixes(@NonNull java.util.List<android.media.audiopolicy.AudioMix>); - method public int getFocusDuckingBehavior(); - method public int getStatus(); - method public boolean removeUidDeviceAffinity(int); - method public boolean removeUserIdDeviceAffinity(int); - method public int setFocusDuckingBehavior(int) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException; - method public void setRegistration(String); - method public boolean setUidDeviceAffinity(int, @NonNull java.util.List<android.media.AudioDeviceInfo>); - method public boolean setUserIdDeviceAffinity(int, @NonNull java.util.List<android.media.AudioDeviceInfo>); - method public String toLogFriendlyString(); - field public static final int FOCUS_POLICY_DUCKING_DEFAULT = 0; // 0x0 - field public static final int FOCUS_POLICY_DUCKING_IN_APP = 0; // 0x0 - field public static final int FOCUS_POLICY_DUCKING_IN_POLICY = 1; // 0x1 - field public static final int POLICY_STATUS_REGISTERED = 2; // 0x2 - field public static final int POLICY_STATUS_UNREGISTERED = 1; // 0x1 - } - - public abstract static class AudioPolicy.AudioPolicyFocusListener { - ctor public AudioPolicy.AudioPolicyFocusListener(); - method public void onAudioFocusAbandon(android.media.AudioFocusInfo); - method public void onAudioFocusGrant(android.media.AudioFocusInfo, int); - method public void onAudioFocusLoss(android.media.AudioFocusInfo, boolean); - method public void onAudioFocusRequest(android.media.AudioFocusInfo, int); - } - - public abstract static class AudioPolicy.AudioPolicyStatusListener { - ctor public AudioPolicy.AudioPolicyStatusListener(); - method public void onMixStateUpdate(android.media.audiopolicy.AudioMix); - method public void onStatusChange(); - } - - public abstract static class AudioPolicy.AudioPolicyVolumeCallback { - ctor public AudioPolicy.AudioPolicyVolumeCallback(); - method public void onVolumeAdjustment(int); - } - public static class AudioPolicy.Builder { - ctor public AudioPolicy.Builder(android.content.Context); - method @NonNull public android.media.audiopolicy.AudioPolicy.Builder addMix(@NonNull android.media.audiopolicy.AudioMix) throws java.lang.IllegalArgumentException; - method @NonNull public android.media.audiopolicy.AudioPolicy build(); - method public void setAudioPolicyFocusListener(android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener); - method public void setAudioPolicyStatusListener(android.media.audiopolicy.AudioPolicy.AudioPolicyStatusListener); - method @NonNull public android.media.audiopolicy.AudioPolicy.Builder setAudioPolicyVolumeCallback(@NonNull android.media.audiopolicy.AudioPolicy.AudioPolicyVolumeCallback); - method @NonNull public android.media.audiopolicy.AudioPolicy.Builder setIsAudioFocusPolicy(boolean); method @NonNull public android.media.audiopolicy.AudioPolicy.Builder setIsTestFocusPolicy(boolean); - method @NonNull public android.media.audiopolicy.AudioPolicy.Builder setLooper(@NonNull android.os.Looper) throws java.lang.IllegalArgumentException; - } - -} - -package android.media.musicrecognition { - - public class MusicRecognitionManager { - field public static final int RECOGNITION_FAILED_AUDIO_UNAVAILABLE = 7; // 0x7 - field public static final int RECOGNITION_FAILED_NOT_FOUND = 1; // 0x1 - field public static final int RECOGNITION_FAILED_NO_CONNECTIVITY = 2; // 0x2 - field public static final int RECOGNITION_FAILED_SERVICE_KILLED = 5; // 0x5 - field public static final int RECOGNITION_FAILED_SERVICE_UNAVAILABLE = 3; // 0x3 - field public static final int RECOGNITION_FAILED_TIMEOUT = 6; // 0x6 - field public static final int RECOGNITION_FAILED_UNKNOWN = -1; // 0xffffffff - } - - public static interface MusicRecognitionManager.RecognitionCallback { - method public void onAudioStreamClosed(); - method public void onRecognitionFailed(@NonNull android.media.musicrecognition.RecognitionRequest, int); - method public void onRecognitionSucceeded(@NonNull android.media.musicrecognition.RecognitionRequest, @NonNull android.media.MediaMetadata, @Nullable android.os.Bundle); - } - - public abstract class MusicRecognitionService extends android.app.Service { - ctor public MusicRecognitionService(); - method public abstract void onRecognize(@NonNull android.os.ParcelFileDescriptor, @NonNull android.media.AudioFormat, @NonNull android.media.musicrecognition.MusicRecognitionService.Callback); - } - - public static interface MusicRecognitionService.Callback { - method public void onRecognitionFailed(int); - method public void onRecognitionSucceeded(@NonNull android.media.MediaMetadata, @Nullable android.os.Bundle); - } - - public final class RecognitionRequest implements android.os.Parcelable { - method public int describeContents(); - method @NonNull public android.media.AudioAttributes getAudioAttributes(); - method @NonNull public android.media.AudioFormat getAudioFormat(); - method public int getCaptureSession(); - method public int getIgnoreBeginningFrames(); - method public int getMaxAudioLengthSeconds(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.media.musicrecognition.RecognitionRequest> CREATOR; - } - - public static final class RecognitionRequest.Builder { - ctor public RecognitionRequest.Builder(); - method @NonNull public android.media.musicrecognition.RecognitionRequest build(); - method @NonNull public android.media.musicrecognition.RecognitionRequest.Builder setAudioAttributes(@NonNull android.media.AudioAttributes); - method @NonNull public android.media.musicrecognition.RecognitionRequest.Builder setAudioFormat(@NonNull android.media.AudioFormat); - method @NonNull public android.media.musicrecognition.RecognitionRequest.Builder setCaptureSession(int); - method @NonNull public android.media.musicrecognition.RecognitionRequest.Builder setIgnoreBeginningFrames(int); - method @NonNull public android.media.musicrecognition.RecognitionRequest.Builder setMaxAudioLengthSeconds(int); } } @@ -2171,242 +1053,33 @@ package android.media.tv.tuner { public final class TunerVersionChecker { method public static int getMajorVersion(int); method public static int getMinorVersion(int); - method public static int getTunerVersion(); method public static boolean isHigherOrEqualVersionTo(int); method public static boolean supportTunerVersion(int); - field public static final int TUNER_VERSION_1_0 = 65536; // 0x10000 - field public static final int TUNER_VERSION_1_1 = 65537; // 0x10001 - field public static final int TUNER_VERSION_UNKNOWN = 0; // 0x0 - } - -} - -package android.metrics { - - public class LogMaker { - ctor public LogMaker(int); - ctor public LogMaker(Object[]); - method public android.metrics.LogMaker addTaggedData(int, Object); - method public android.metrics.LogMaker clearCategory(); - method public android.metrics.LogMaker clearPackageName(); - method public android.metrics.LogMaker clearSubtype(); - method public android.metrics.LogMaker clearTaggedData(int); - method public android.metrics.LogMaker clearType(); - method public void deserialize(Object[]); - method public int getCategory(); - method public long getCounterBucket(); - method public String getCounterName(); - method public int getCounterValue(); - method public String getPackageName(); - method public int getProcessId(); - method public int getSubtype(); - method public Object getTaggedData(int); - method public long getTimestamp(); - method public int getType(); - method public int getUid(); - method public boolean isLongCounterBucket(); - method public boolean isSubsetOf(android.metrics.LogMaker); - method public boolean isValidValue(Object); - method public Object[] serialize(); - method public android.metrics.LogMaker setCategory(int); - method public android.metrics.LogMaker setPackageName(String); - method public android.metrics.LogMaker setSubtype(int); - method public android.metrics.LogMaker setType(int); - } - - public class MetricsReader { - ctor public MetricsReader(); - method public void checkpoint(); - method public boolean hasNext(); - method public android.metrics.LogMaker next(); - method public void read(long); - method public void reset(); } } package android.net { - public class CaptivePortal implements android.os.Parcelable { - method public void logEvent(int, @NonNull String); - method @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public void reevaluateNetwork(); - method public void useNetwork(); - field public static final int APP_REQUEST_REEVALUATION_REQUIRED = 100; // 0x64 - field public static final int APP_RETURN_DISMISSED = 0; // 0x0 - field public static final int APP_RETURN_UNWANTED = 1; // 0x1 - field public static final int APP_RETURN_WANTED_AS_IS = 2; // 0x2 - } - - public final class CaptivePortalData implements android.os.Parcelable { - method public int describeContents(); - method public long getByteLimit(); - method public long getExpiryTimeMillis(); - method public long getRefreshTimeMillis(); - method @Nullable public android.net.Uri getUserPortalUrl(); - method @Nullable public android.net.Uri getVenueInfoUrl(); - method public boolean isCaptive(); - method public boolean isSessionExtendable(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.net.CaptivePortalData> CREATOR; - } - - public static class CaptivePortalData.Builder { - ctor public CaptivePortalData.Builder(); - ctor public CaptivePortalData.Builder(@Nullable android.net.CaptivePortalData); - method @NonNull public android.net.CaptivePortalData build(); - method @NonNull public android.net.CaptivePortalData.Builder setBytesRemaining(long); - method @NonNull public android.net.CaptivePortalData.Builder setCaptive(boolean); - method @NonNull public android.net.CaptivePortalData.Builder setExpiryTime(long); - method @NonNull public android.net.CaptivePortalData.Builder setRefreshTime(long); - method @NonNull public android.net.CaptivePortalData.Builder setSessionExtendable(boolean); - method @NonNull public android.net.CaptivePortalData.Builder setUserPortalUrl(@Nullable android.net.Uri); - method @NonNull public android.net.CaptivePortalData.Builder setVenueInfoUrl(@Nullable android.net.Uri); - } - public class ConnectivityManager { method @RequiresPermission(anyOf={"android.permission.MANAGE_TEST_NETWORKS", android.Manifest.permission.NETWORK_STACK}) public void simulateDataStall(int, long, @NonNull android.net.Network, @NonNull android.os.PersistableBundle); - method @RequiresPermission(android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK) public void startCaptivePortalApp(@NonNull android.net.Network, @NonNull android.os.Bundle); - field public static final String EXTRA_CAPTIVE_PORTAL_PROBE_SPEC = "android.net.extra.CAPTIVE_PORTAL_PROBE_SPEC"; - field public static final String EXTRA_CAPTIVE_PORTAL_USER_AGENT = "android.net.extra.CAPTIVE_PORTAL_USER_AGENT"; } public class EthernetManager { - method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public android.net.EthernetManager.TetheredInterfaceRequest requestTetheredInterface(@NonNull java.util.concurrent.Executor, @NonNull android.net.EthernetManager.TetheredInterfaceCallback); method public void setIncludeTestInterfaces(boolean); } - public static interface EthernetManager.TetheredInterfaceCallback { - method public void onAvailable(@NonNull String); - method public void onUnavailable(); - } - - public static class EthernetManager.TetheredInterfaceRequest { - method public void release(); - } - - public final class IpPrefix implements android.os.Parcelable { - ctor public IpPrefix(@NonNull java.net.InetAddress, @IntRange(from=0, to=128) int); - ctor public IpPrefix(@NonNull String); - } - public final class IpSecManager { field public static final int INVALID_SECURITY_PARAMETER_INDEX = 0; // 0x0 } - public class LinkAddress implements android.os.Parcelable { - ctor public LinkAddress(@NonNull java.net.InetAddress, @IntRange(from=0, to=128) int, int, int); - ctor public LinkAddress(@NonNull java.net.InetAddress, @IntRange(from=0, to=128) int, int, int, long, long); - ctor public LinkAddress(@NonNull java.net.InetAddress, @IntRange(from=0, to=128) int); - ctor public LinkAddress(@NonNull String); - ctor public LinkAddress(@NonNull String, int, int); - method public long getDeprecationTime(); - method public long getExpirationTime(); - method public boolean isGlobalPreferred(); - method public boolean isIpv4(); - method public boolean isIpv6(); - method public boolean isSameAddressAs(@Nullable android.net.LinkAddress); - } - - public final class LinkProperties implements android.os.Parcelable { - ctor public LinkProperties(@Nullable android.net.LinkProperties); - ctor public LinkProperties(@Nullable android.net.LinkProperties, boolean); - method public boolean addDnsServer(@NonNull java.net.InetAddress); - method public boolean addLinkAddress(@NonNull android.net.LinkAddress); - method @Nullable public android.net.Uri getCaptivePortalApiUrl(); - method @Nullable public android.net.CaptivePortalData getCaptivePortalData(); - method @NonNull public java.util.List<java.net.InetAddress> getPcscfServers(); - method @Nullable public String getTcpBufferSizes(); - method @NonNull public java.util.List<java.net.InetAddress> getValidatedPrivateDnsServers(); - method public boolean hasGlobalIpv6Address(); - method public boolean hasIpv4Address(); - method public boolean hasIpv6DefaultRoute(); - method public boolean isIpv4Provisioned(); - method public boolean isIpv6Provisioned(); - method public boolean isProvisioned(); - method public boolean isReachable(@NonNull java.net.InetAddress); - method public boolean removeDnsServer(@NonNull java.net.InetAddress); - method public boolean removeLinkAddress(@NonNull android.net.LinkAddress); - method public boolean removeRoute(@NonNull android.net.RouteInfo); - method public void setCaptivePortalApiUrl(@Nullable android.net.Uri); - method public void setCaptivePortalData(@Nullable android.net.CaptivePortalData); - method public void setPcscfServers(@NonNull java.util.Collection<java.net.InetAddress>); - method public void setPrivateDnsServerName(@Nullable String); - method public void setTcpBufferSizes(@Nullable String); - method public void setUsePrivateDns(boolean); - method public void setValidatedPrivateDnsServers(@NonNull java.util.Collection<java.net.InetAddress>); - } - - public class Network implements android.os.Parcelable { - ctor public Network(@NonNull android.net.Network); - method public int getNetId(); - method @NonNull public android.net.Network getPrivateDnsBypassingCopy(); - } - public final class NetworkCapabilities implements android.os.Parcelable { - method @NonNull public int[] getAdministratorUids(); method public int[] getCapabilities(); - method @Nullable public String getSsid(); - method @NonNull public int[] getTransportTypes(); - method public boolean satisfiedByNetworkCapabilities(@Nullable android.net.NetworkCapabilities); field public static final int TRANSPORT_TEST = 7; // 0x7 } - public static final class NetworkCapabilities.Builder { - ctor public NetworkCapabilities.Builder(); - ctor public NetworkCapabilities.Builder(@NonNull android.net.NetworkCapabilities); - method @NonNull public android.net.NetworkCapabilities.Builder addCapability(int); - method @NonNull public android.net.NetworkCapabilities.Builder addTransportType(int); - method @NonNull public android.net.NetworkCapabilities build(); - method @NonNull public android.net.NetworkCapabilities.Builder removeCapability(int); - method @NonNull public android.net.NetworkCapabilities.Builder removeTransportType(int); - method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public android.net.NetworkCapabilities.Builder setAdministratorUids(@NonNull int[]); - method @NonNull public android.net.NetworkCapabilities.Builder setLinkDownstreamBandwidthKbps(int); - method @NonNull public android.net.NetworkCapabilities.Builder setLinkUpstreamBandwidthKbps(int); - method @NonNull public android.net.NetworkCapabilities.Builder setNetworkSpecifier(@Nullable android.net.NetworkSpecifier); - method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public android.net.NetworkCapabilities.Builder setOwnerUid(int); - method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public android.net.NetworkCapabilities.Builder setRequestorPackageName(@Nullable String); - method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public android.net.NetworkCapabilities.Builder setRequestorUid(int); - method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_SIGNAL_STRENGTH_WAKEUP) public android.net.NetworkCapabilities.Builder setSignalStrength(int); - method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public android.net.NetworkCapabilities.Builder setSsid(@Nullable String); - method @NonNull public android.net.NetworkCapabilities.Builder setTransportInfo(@Nullable android.net.TransportInfo); - } - public class NetworkStack { - method @Nullable public static android.os.IBinder getService(); method public static void setServiceForTest(@Nullable android.os.IBinder); - field public static final String PERMISSION_MAINLINE_NETWORK_STACK = "android.permission.MAINLINE_NETWORK_STACK"; - } - - public final class RouteInfo implements android.os.Parcelable { - ctor public RouteInfo(@Nullable android.net.IpPrefix, @Nullable java.net.InetAddress, @Nullable String, int); - method public int getType(); - field public static final int RTN_THROW = 9; // 0x9 - field public static final int RTN_UNICAST = 1; // 0x1 - field public static final int RTN_UNREACHABLE = 7; // 0x7 - } - - public final class StaticIpConfiguration implements android.os.Parcelable { - ctor public StaticIpConfiguration(); - ctor public StaticIpConfiguration(@Nullable android.net.StaticIpConfiguration); - method public void addDnsServer(@NonNull java.net.InetAddress); - method public void clear(); - method public int describeContents(); - method @NonNull public java.util.List<java.net.InetAddress> getDnsServers(); - method @Nullable public String getDomains(); - method @Nullable public java.net.InetAddress getGateway(); - method @Nullable public android.net.LinkAddress getIpAddress(); - method @NonNull public java.util.List<android.net.RouteInfo> getRoutes(@Nullable String); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.net.StaticIpConfiguration> CREATOR; - } - - public static final class StaticIpConfiguration.Builder { - ctor public StaticIpConfiguration.Builder(); - method @NonNull public android.net.StaticIpConfiguration build(); - method @NonNull public android.net.StaticIpConfiguration.Builder setDnsServers(@NonNull Iterable<java.net.InetAddress>); - method @NonNull public android.net.StaticIpConfiguration.Builder setDomains(@Nullable String); - method @NonNull public android.net.StaticIpConfiguration.Builder setGateway(@Nullable java.net.InetAddress); - method @NonNull public android.net.StaticIpConfiguration.Builder setIpAddress(@Nullable android.net.LinkAddress); } public final class TestNetworkInterface implements android.os.Parcelable { @@ -2434,228 +1107,8 @@ package android.net { } -package android.net.apf { - - public final class ApfCapabilities implements android.os.Parcelable { - ctor public ApfCapabilities(int, int, int); - method public int describeContents(); - method public static boolean getApfDrop8023Frames(); - method @NonNull public static int[] getApfEtherTypeBlackList(); - method public boolean hasDataAccess(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.net.apf.ApfCapabilities> CREATOR; - field public final int apfPacketFormat; - field public final int apfVersionSupported; - field public final int maximumApfProgramSize; - } - -} - -package android.net.metrics { - - public final class ApfProgramEvent implements android.net.metrics.IpConnectivityLog.Event { - } - - public static final class ApfProgramEvent.Builder { - ctor public ApfProgramEvent.Builder(); - method @NonNull public android.net.metrics.ApfProgramEvent build(); - method @NonNull public android.net.metrics.ApfProgramEvent.Builder setActualLifetime(long); - method @NonNull public android.net.metrics.ApfProgramEvent.Builder setCurrentRas(int); - method @NonNull public android.net.metrics.ApfProgramEvent.Builder setFilteredRas(int); - method @NonNull public android.net.metrics.ApfProgramEvent.Builder setFlags(boolean, boolean); - method @NonNull public android.net.metrics.ApfProgramEvent.Builder setLifetime(long); - method @NonNull public android.net.metrics.ApfProgramEvent.Builder setProgramLength(int); - } - - public final class ApfStats implements android.net.metrics.IpConnectivityLog.Event { - } - - public static final class ApfStats.Builder { - ctor public ApfStats.Builder(); - method @NonNull public android.net.metrics.ApfStats build(); - method @NonNull public android.net.metrics.ApfStats.Builder setDroppedRas(int); - method @NonNull public android.net.metrics.ApfStats.Builder setDurationMs(long); - method @NonNull public android.net.metrics.ApfStats.Builder setMatchingRas(int); - method @NonNull public android.net.metrics.ApfStats.Builder setMaxProgramSize(int); - method @NonNull public android.net.metrics.ApfStats.Builder setParseErrors(int); - method @NonNull public android.net.metrics.ApfStats.Builder setProgramUpdates(int); - method @NonNull public android.net.metrics.ApfStats.Builder setProgramUpdatesAll(int); - method @NonNull public android.net.metrics.ApfStats.Builder setProgramUpdatesAllowingMulticast(int); - method @NonNull public android.net.metrics.ApfStats.Builder setReceivedRas(int); - method @NonNull public android.net.metrics.ApfStats.Builder setZeroLifetimeRas(int); - } - - public final class DhcpClientEvent implements android.net.metrics.IpConnectivityLog.Event { - } - - public static final class DhcpClientEvent.Builder { - ctor public DhcpClientEvent.Builder(); - method @NonNull public android.net.metrics.DhcpClientEvent build(); - method @NonNull public android.net.metrics.DhcpClientEvent.Builder setDurationMs(int); - method @NonNull public android.net.metrics.DhcpClientEvent.Builder setMsg(String); - } - - public final class DhcpErrorEvent implements android.net.metrics.IpConnectivityLog.Event { - ctor public DhcpErrorEvent(int); - method public static int errorCodeWithOption(int, int); - field public static final int BOOTP_TOO_SHORT = 67174400; // 0x4010000 - field public static final int BUFFER_UNDERFLOW = 83951616; // 0x5010000 - field public static final int DHCP_BAD_MAGIC_COOKIE = 67239936; // 0x4020000 - field public static final int DHCP_ERROR = 4; // 0x4 - field public static final int DHCP_INVALID_OPTION_LENGTH = 67305472; // 0x4030000 - field public static final int DHCP_NO_COOKIE = 67502080; // 0x4060000 - field public static final int DHCP_NO_MSG_TYPE = 67371008; // 0x4040000 - field public static final int DHCP_UNKNOWN_MSG_TYPE = 67436544; // 0x4050000 - field public static final int L2_ERROR = 1; // 0x1 - field public static final int L2_TOO_SHORT = 16842752; // 0x1010000 - field public static final int L2_WRONG_ETH_TYPE = 16908288; // 0x1020000 - field public static final int L3_ERROR = 2; // 0x2 - field public static final int L3_INVALID_IP = 33751040; // 0x2030000 - field public static final int L3_NOT_IPV4 = 33685504; // 0x2020000 - field public static final int L3_TOO_SHORT = 33619968; // 0x2010000 - field public static final int L4_ERROR = 3; // 0x3 - field public static final int L4_NOT_UDP = 50397184; // 0x3010000 - field public static final int L4_WRONG_PORT = 50462720; // 0x3020000 - field public static final int MISC_ERROR = 5; // 0x5 - field public static final int PARSING_ERROR = 84082688; // 0x5030000 - field public static final int RECEIVE_ERROR = 84017152; // 0x5020000 - } - - public class IpConnectivityLog { - ctor public IpConnectivityLog(); - method public boolean log(long, @NonNull android.net.metrics.IpConnectivityLog.Event); - method public boolean log(@NonNull String, @NonNull android.net.metrics.IpConnectivityLog.Event); - method public boolean log(@NonNull android.net.Network, @NonNull int[], @NonNull android.net.metrics.IpConnectivityLog.Event); - method public boolean log(int, @NonNull int[], @NonNull android.net.metrics.IpConnectivityLog.Event); - method public boolean log(@NonNull android.net.metrics.IpConnectivityLog.Event); - } - - public static interface IpConnectivityLog.Event extends android.os.Parcelable { - } - - public final class IpManagerEvent implements android.net.metrics.IpConnectivityLog.Event { - ctor public IpManagerEvent(int, long); - field public static final int COMPLETE_LIFECYCLE = 3; // 0x3 - field public static final int ERROR_INTERFACE_NOT_FOUND = 8; // 0x8 - field public static final int ERROR_INVALID_PROVISIONING = 7; // 0x7 - field public static final int ERROR_STARTING_IPREACHABILITYMONITOR = 6; // 0x6 - field public static final int ERROR_STARTING_IPV4 = 4; // 0x4 - field public static final int ERROR_STARTING_IPV6 = 5; // 0x5 - field public static final int PROVISIONING_FAIL = 2; // 0x2 - field public static final int PROVISIONING_OK = 1; // 0x1 - } - - public final class IpReachabilityEvent implements android.net.metrics.IpConnectivityLog.Event { - ctor public IpReachabilityEvent(int); - field public static final int NUD_FAILED = 512; // 0x200 - field public static final int NUD_FAILED_ORGANIC = 1024; // 0x400 - field public static final int PROBE = 256; // 0x100 - field public static final int PROVISIONING_LOST = 768; // 0x300 - field public static final int PROVISIONING_LOST_ORGANIC = 1280; // 0x500 - } - - public final class NetworkEvent implements android.net.metrics.IpConnectivityLog.Event { - ctor public NetworkEvent(int, long); - ctor public NetworkEvent(int); - field public static final int NETWORK_CAPTIVE_PORTAL_FOUND = 4; // 0x4 - field public static final int NETWORK_CONNECTED = 1; // 0x1 - field public static final int NETWORK_CONSECUTIVE_DNS_TIMEOUT_FOUND = 12; // 0xc - field public static final int NETWORK_DISCONNECTED = 7; // 0x7 - field public static final int NETWORK_FIRST_VALIDATION_PORTAL_FOUND = 10; // 0xa - field public static final int NETWORK_FIRST_VALIDATION_SUCCESS = 8; // 0x8 - field public static final int NETWORK_LINGER = 5; // 0x5 - field public static final int NETWORK_PARTIAL_CONNECTIVITY = 13; // 0xd - field public static final int NETWORK_REVALIDATION_PORTAL_FOUND = 11; // 0xb - field public static final int NETWORK_REVALIDATION_SUCCESS = 9; // 0x9 - field public static final int NETWORK_UNLINGER = 6; // 0x6 - field public static final int NETWORK_VALIDATED = 2; // 0x2 - field public static final int NETWORK_VALIDATION_FAILED = 3; // 0x3 - } - - public final class RaEvent implements android.net.metrics.IpConnectivityLog.Event { - } - - public static final class RaEvent.Builder { - ctor public RaEvent.Builder(); - method @NonNull public android.net.metrics.RaEvent build(); - method @NonNull public android.net.metrics.RaEvent.Builder updateDnsslLifetime(long); - method @NonNull public android.net.metrics.RaEvent.Builder updatePrefixPreferredLifetime(long); - method @NonNull public android.net.metrics.RaEvent.Builder updatePrefixValidLifetime(long); - method @NonNull public android.net.metrics.RaEvent.Builder updateRdnssLifetime(long); - method @NonNull public android.net.metrics.RaEvent.Builder updateRouteInfoLifetime(long); - method @NonNull public android.net.metrics.RaEvent.Builder updateRouterLifetime(long); - } - - public final class ValidationProbeEvent implements android.net.metrics.IpConnectivityLog.Event { - method @NonNull public static String getProbeName(int); - field public static final int DNS_FAILURE = 0; // 0x0 - field public static final int DNS_SUCCESS = 1; // 0x1 - field public static final int PROBE_DNS = 0; // 0x0 - field public static final int PROBE_FALLBACK = 4; // 0x4 - field public static final int PROBE_HTTP = 1; // 0x1 - field public static final int PROBE_HTTPS = 2; // 0x2 - field public static final int PROBE_PAC = 3; // 0x3 - field public static final int PROBE_PRIVDNS = 5; // 0x5 - } - - public static final class ValidationProbeEvent.Builder { - ctor public ValidationProbeEvent.Builder(); - method @NonNull public android.net.metrics.ValidationProbeEvent build(); - method @NonNull public android.net.metrics.ValidationProbeEvent.Builder setDurationMs(long); - method @NonNull public android.net.metrics.ValidationProbeEvent.Builder setProbeType(int, boolean); - method @NonNull public android.net.metrics.ValidationProbeEvent.Builder setReturnCode(int); - } - -} - -package android.net.util { - - public final class SocketUtils { - method public static void bindSocketToInterface(@NonNull java.io.FileDescriptor, @NonNull String) throws android.system.ErrnoException; - method public static void closeSocket(@Nullable java.io.FileDescriptor) throws java.io.IOException; - method @NonNull public static java.net.SocketAddress makeNetlinkSocketAddress(int, int); - method @NonNull public static java.net.SocketAddress makePacketSocketAddress(int, int); - method @Deprecated @NonNull public static java.net.SocketAddress makePacketSocketAddress(int, @NonNull byte[]); - method @NonNull public static java.net.SocketAddress makePacketSocketAddress(int, int, @NonNull byte[]); - } - -} - package android.os { - public class BatteryManager { - method @RequiresPermission(android.Manifest.permission.POWER_SAVER) public boolean setChargingStateUpdateDelayMillis(int); - } - - public final class BugreportManager { - method @RequiresPermission(android.Manifest.permission.DUMP) public void cancelBugreport(); - method @RequiresPermission(android.Manifest.permission.DUMP) public void requestBugreport(@NonNull android.os.BugreportParams, @Nullable CharSequence, @Nullable CharSequence); - method @RequiresPermission(android.Manifest.permission.DUMP) public void startBugreport(@NonNull android.os.ParcelFileDescriptor, @Nullable android.os.ParcelFileDescriptor, @NonNull android.os.BugreportParams, @NonNull java.util.concurrent.Executor, @NonNull android.os.BugreportManager.BugreportCallback); - } - - public abstract static class BugreportManager.BugreportCallback { - ctor public BugreportManager.BugreportCallback(); - method public void onError(int); - method public void onFinished(); - method public void onProgress(@FloatRange(from=0.0f, to=100.0f) float); - field public static final int BUGREPORT_ERROR_ANOTHER_REPORT_IN_PROGRESS = 5; // 0x5 - field public static final int BUGREPORT_ERROR_INVALID_INPUT = 1; // 0x1 - field public static final int BUGREPORT_ERROR_RUNTIME = 2; // 0x2 - field public static final int BUGREPORT_ERROR_USER_CONSENT_TIMED_OUT = 4; // 0x4 - field public static final int BUGREPORT_ERROR_USER_DENIED_CONSENT = 3; // 0x3 - } - - public final class BugreportParams { - ctor public BugreportParams(int); - method public int getMode(); - field public static final int BUGREPORT_MODE_FULL = 0; // 0x0 - field public static final int BUGREPORT_MODE_INTERACTIVE = 1; // 0x1 - field public static final int BUGREPORT_MODE_REMOTE = 2; // 0x2 - field public static final int BUGREPORT_MODE_TELEPHONY = 4; // 0x4 - field public static final int BUGREPORT_MODE_WEAR = 3; // 0x3 - field public static final int BUGREPORT_MODE_WIFI = 5; // 0x5 - } - public class Build { method public static boolean is64BitAbi(String); field public static final boolean IS_EMULATOR; @@ -2668,18 +1121,12 @@ package android.os { } public class DeviceIdleManager { - method @RequiresPermission(android.Manifest.permission.DEVICE_POWER) public void endIdle(@NonNull String); method @NonNull public String[] getSystemPowerWhitelist(); method @NonNull public String[] getSystemPowerWhitelistExceptIdle(); } public class Environment { method public static java.io.File buildPath(java.io.File, java.lang.String...); - method @NonNull public static java.io.File getOdmDirectory(); - method @NonNull public static java.io.File getOemDirectory(); - method @NonNull public static java.io.File getProductDirectory(); - method @NonNull public static java.io.File getSystemExtDirectory(); - method @NonNull public static java.io.File getVendorDirectory(); } public final class FileUtils { @@ -2688,228 +1135,11 @@ package android.os { method @NonNull public static byte[] digest(@NonNull java.io.InputStream, @NonNull String) throws java.io.IOException, java.security.NoSuchAlgorithmException; } - public class HidlMemory implements java.io.Closeable { - ctor public HidlMemory(@NonNull String, @IntRange(from=0) long, @Nullable android.os.NativeHandle); - method public void close() throws java.io.IOException; - method @NonNull public android.os.HidlMemory dup() throws java.io.IOException; - method protected void finalize(); - method @Nullable public android.os.NativeHandle getHandle(); - method @NonNull public String getName(); - method public long getSize(); - method @Nullable public android.os.NativeHandle releaseHandle(); - } - - public abstract class HwBinder implements android.os.IHwBinder { - ctor public HwBinder(); - method public static final void configureRpcThreadpool(long, boolean); - method public static void enableInstrumentation(); - method public static final android.os.IHwBinder getService(String, String) throws java.util.NoSuchElementException, android.os.RemoteException; - method public static final android.os.IHwBinder getService(String, String, boolean) throws java.util.NoSuchElementException, android.os.RemoteException; - method public static final void joinRpcThreadpool(); - method public abstract void onTransact(int, android.os.HwParcel, android.os.HwParcel, int) throws android.os.RemoteException; - method public final void registerService(String) throws android.os.RemoteException; - method public final void transact(int, android.os.HwParcel, android.os.HwParcel, int) throws android.os.RemoteException; - } - - public class HwBlob { - ctor public HwBlob(int); - method public final void copyToBoolArray(long, boolean[], int); - method public final void copyToDoubleArray(long, double[], int); - method public final void copyToFloatArray(long, float[], int); - method public final void copyToInt16Array(long, short[], int); - method public final void copyToInt32Array(long, int[], int); - method public final void copyToInt64Array(long, long[], int); - method public final void copyToInt8Array(long, byte[], int); - method public final boolean getBool(long); - method public final double getDouble(long); - method public final long getFieldHandle(long); - method public final float getFloat(long); - method public final short getInt16(long); - method public final int getInt32(long); - method public final long getInt64(long); - method public final byte getInt8(long); - method public final String getString(long); - method public final long handle(); - method public final void putBlob(long, android.os.HwBlob); - method public final void putBool(long, boolean); - method public final void putBoolArray(long, boolean[]); - method public final void putDouble(long, double); - method public final void putDoubleArray(long, double[]); - method public final void putFloat(long, float); - method public final void putFloatArray(long, float[]); - method public final void putHidlMemory(long, @NonNull android.os.HidlMemory); - method public final void putInt16(long, short); - method public final void putInt16Array(long, short[]); - method public final void putInt32(long, int); - method public final void putInt32Array(long, int[]); - method public final void putInt64(long, long); - method public final void putInt64Array(long, long[]); - method public final void putInt8(long, byte); - method public final void putInt8Array(long, byte[]); - method public final void putNativeHandle(long, @Nullable android.os.NativeHandle); - method public final void putString(long, String); - method public static Boolean[] wrapArray(@NonNull boolean[]); - method public static Long[] wrapArray(@NonNull long[]); - method public static Byte[] wrapArray(@NonNull byte[]); - method public static Short[] wrapArray(@NonNull short[]); - method public static Integer[] wrapArray(@NonNull int[]); - method public static Float[] wrapArray(@NonNull float[]); - method public static Double[] wrapArray(@NonNull double[]); - } - - public class HwParcel { - ctor public HwParcel(); - method public final void enforceInterface(String); - method public final boolean readBool(); - method public final java.util.ArrayList<java.lang.Boolean> readBoolVector(); - method public final android.os.HwBlob readBuffer(long); - method public final double readDouble(); - method public final java.util.ArrayList<java.lang.Double> readDoubleVector(); - method public final android.os.HwBlob readEmbeddedBuffer(long, long, long, boolean); - method @NonNull @Nullable public final android.os.HidlMemory readEmbeddedHidlMemory(long, long, long); - method @Nullable public final android.os.NativeHandle readEmbeddedNativeHandle(long, long); - method public final float readFloat(); - method public final java.util.ArrayList<java.lang.Float> readFloatVector(); - method @NonNull public final android.os.HidlMemory readHidlMemory(); - method public final short readInt16(); - method public final java.util.ArrayList<java.lang.Short> readInt16Vector(); - method public final int readInt32(); - method public final java.util.ArrayList<java.lang.Integer> readInt32Vector(); - method public final long readInt64(); - method public final java.util.ArrayList<java.lang.Long> readInt64Vector(); - method public final byte readInt8(); - method public final java.util.ArrayList<java.lang.Byte> readInt8Vector(); - method @Nullable public final android.os.NativeHandle readNativeHandle(); - method @NonNull public final java.util.ArrayList<android.os.NativeHandle> readNativeHandleVector(); - method public final String readString(); - method public final java.util.ArrayList<java.lang.String> readStringVector(); - method public final android.os.IHwBinder readStrongBinder(); - method public final void release(); - method public final void releaseTemporaryStorage(); - method public final void send(); - method public final void verifySuccess(); - method public final void writeBool(boolean); - method public final void writeBoolVector(java.util.ArrayList<java.lang.Boolean>); - method public final void writeBuffer(android.os.HwBlob); - method public final void writeDouble(double); - method public final void writeDoubleVector(java.util.ArrayList<java.lang.Double>); - method public final void writeFloat(float); - method public final void writeFloatVector(java.util.ArrayList<java.lang.Float>); - method public final void writeHidlMemory(@NonNull android.os.HidlMemory); - method public final void writeInt16(short); - method public final void writeInt16Vector(java.util.ArrayList<java.lang.Short>); - method public final void writeInt32(int); - method public final void writeInt32Vector(java.util.ArrayList<java.lang.Integer>); - method public final void writeInt64(long); - method public final void writeInt64Vector(java.util.ArrayList<java.lang.Long>); - method public final void writeInt8(byte); - method public final void writeInt8Vector(java.util.ArrayList<java.lang.Byte>); - method public final void writeInterfaceToken(String); - method public final void writeNativeHandle(@Nullable android.os.NativeHandle); - method public final void writeNativeHandleVector(@NonNull java.util.ArrayList<android.os.NativeHandle>); - method public final void writeStatus(int); - method public final void writeString(String); - method public final void writeStringVector(java.util.ArrayList<java.lang.String>); - method public final void writeStrongBinder(android.os.IHwBinder); - field public static final int STATUS_SUCCESS = 0; // 0x0 - } - - public interface IHwBinder { - method public boolean linkToDeath(android.os.IHwBinder.DeathRecipient, long); - method public android.os.IHwInterface queryLocalInterface(String); - method public void transact(int, android.os.HwParcel, android.os.HwParcel, int) throws android.os.RemoteException; - method public boolean unlinkToDeath(android.os.IHwBinder.DeathRecipient); - } - - public static interface IHwBinder.DeathRecipient { - method public void serviceDied(long); - } - - public interface IHwInterface { - method public android.os.IHwBinder asBinder(); - } - - public class IncidentManager { - method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public void approveReport(android.net.Uri); - method @RequiresPermission("android.permission.REQUEST_INCIDENT_REPORT_APPROVAL") public void cancelAuthorization(android.os.IncidentManager.AuthListener); - method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void deleteIncidentReports(android.net.Uri); - method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public void denyReport(android.net.Uri); - method @Nullable @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public android.os.IncidentManager.IncidentReport getIncidentReport(android.net.Uri); - method @NonNull @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public java.util.List<android.net.Uri> getIncidentReportList(String); - method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public java.util.List<android.os.IncidentManager.PendingReport> getPendingReports(); - method public void registerSection(int, @NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.os.IncidentManager.DumpCallback); - method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void reportIncident(android.os.IncidentReportArgs); - method @RequiresPermission("android.permission.REQUEST_INCIDENT_REPORT_APPROVAL") public void requestAuthorization(int, String, int, android.os.IncidentManager.AuthListener); - method public void unregisterSection(int); - field public static final int FLAG_CONFIRMATION_DIALOG = 1; // 0x1 - field public static final int PRIVACY_POLICY_AUTO = 200; // 0xc8 - field public static final int PRIVACY_POLICY_EXPLICIT = 100; // 0x64 - field public static final int PRIVACY_POLICY_LOCAL = 0; // 0x0 - } - - public static class IncidentManager.AuthListener { - ctor public IncidentManager.AuthListener(); - method public void onReportApproved(); - method public void onReportDenied(); - } - - public static class IncidentManager.DumpCallback { - ctor public IncidentManager.DumpCallback(); - method public void onDumpSection(int, @NonNull java.io.OutputStream); - } - - public static class IncidentManager.IncidentReport implements java.io.Closeable android.os.Parcelable { - ctor public IncidentManager.IncidentReport(android.os.Parcel); - method public void close(); - method public int describeContents(); - method public java.io.InputStream getInputStream() throws java.io.IOException; - method public long getPrivacyPolicy(); - method public long getTimestamp(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.os.IncidentManager.IncidentReport> CREATOR; - } - - public static class IncidentManager.PendingReport { - ctor public IncidentManager.PendingReport(@NonNull android.net.Uri); - method public int getFlags(); - method @NonNull public String getRequestingPackage(); - method public long getTimestamp(); - method @NonNull public android.net.Uri getUri(); - } - - public final class IncidentReportArgs implements android.os.Parcelable { - ctor public IncidentReportArgs(); - ctor public IncidentReportArgs(android.os.Parcel); - method public void addHeader(byte[]); - method public void addSection(int); - method public boolean containsSection(int); - method public int describeContents(); - method public boolean isAll(); - method public void readFromParcel(android.os.Parcel); - method public int sectionCount(); - method public void setAll(boolean); - method public void setPrivacyPolicy(int); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.os.IncidentReportArgs> CREATOR; - } - public final class MessageQueue { method public int postSyncBarrier(); method public void removeSyncBarrier(int); } - public final class NativeHandle implements java.io.Closeable { - ctor public NativeHandle(); - ctor public NativeHandle(@NonNull java.io.FileDescriptor, boolean); - ctor public NativeHandle(@NonNull java.io.FileDescriptor[], @NonNull int[], boolean); - method public void close() throws java.io.IOException; - method @NonNull public android.os.NativeHandle dup() throws java.io.IOException; - method @NonNull public java.io.FileDescriptor getFileDescriptor(); - method @NonNull public java.io.FileDescriptor[] getFileDescriptors(); - method @NonNull public int[] getInts(); - method public boolean hasSingleFileDescriptor(); - } - public final class Parcel { method public boolean allowSquashing(); method public int readExceptionCode(); @@ -2921,24 +1151,7 @@ package android.os { } public final class PowerManager { - method @RequiresPermission(android.Manifest.permission.POWER_SAVER) public int getPowerSaveModeTrigger(); - method @RequiresPermission(android.Manifest.permission.DEVICE_POWER) public void setBatteryDischargePrediction(@NonNull java.time.Duration, boolean); - method @RequiresPermission(android.Manifest.permission.POWER_SAVER) public boolean setDynamicPowerSaveHint(boolean, int); - method @RequiresPermission(anyOf={android.Manifest.permission.DEVICE_POWER, android.Manifest.permission.POWER_SAVER}) public boolean setPowerSaveModeEnabled(boolean); field public static final String ACTION_ENHANCED_DISCHARGE_PREDICTION_CHANGED = "android.os.action.ENHANCED_DISCHARGE_PREDICTION_CHANGED"; - field public static final int POWER_SAVE_MODE_TRIGGER_DYNAMIC = 1; // 0x1 - field public static final int POWER_SAVE_MODE_TRIGGER_PERCENTAGE = 0; // 0x0 - } - - public class PowerWhitelistManager { - method @RequiresPermission(android.Manifest.permission.DEVICE_POWER) public void addToWhitelist(@NonNull String); - method @RequiresPermission(android.Manifest.permission.DEVICE_POWER) public void addToWhitelist(@NonNull java.util.List<java.lang.String>); - method @RequiresPermission(android.Manifest.permission.DEVICE_POWER) public void removeFromWhitelist(@NonNull String); - method @RequiresPermission(android.Manifest.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST) public void whitelistAppTemporarily(@NonNull String, long); - method @RequiresPermission(android.Manifest.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST) public long whitelistAppTemporarilyForEvent(@NonNull String, int, @NonNull String); - field public static final int EVENT_MMS = 2; // 0x2 - field public static final int EVENT_SMS = 1; // 0x1 - field public static final int EVENT_UNSPECIFIED = 0; // 0x0 } public class Process { @@ -2950,19 +1163,6 @@ package android.os { field public static final int NUM_UIDS_PER_APP_ZYGOTE = 100; // 0x64 } - public final class RemoteCallback implements android.os.Parcelable { - ctor public RemoteCallback(android.os.RemoteCallback.OnResultListener); - ctor public RemoteCallback(@NonNull android.os.RemoteCallback.OnResultListener, @Nullable android.os.Handler); - method public int describeContents(); - method public void sendResult(@Nullable android.os.Bundle); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.os.RemoteCallback> CREATOR; - } - - public static interface RemoteCallback.OnResultListener { - method public void onResult(@Nullable android.os.Bundle); - } - public final class StrictMode { method public static void conditionallyCheckInstanceCounts(); method public static void setViolationLogger(android.os.StrictMode.ViolationLogger); @@ -3000,31 +1200,11 @@ package android.os { method @NonNull public android.os.StrictMode.VmPolicy.Builder permitIncorrectContextUse(); } - public class SystemConfigManager { - method @NonNull @RequiresPermission(android.Manifest.permission.READ_CARRIER_APP_INFO) public java.util.Set<java.lang.String> getDisabledUntilUsedPreinstalledCarrierApps(); - method @NonNull @RequiresPermission(android.Manifest.permission.READ_CARRIER_APP_INFO) public java.util.Map<java.lang.String,java.util.List<java.lang.String>> getDisabledUntilUsedPreinstalledCarrierAssociatedApps(); - } - - public class SystemProperties { - method @NonNull public static String get(@NonNull String); - method @NonNull public static String get(@NonNull String, @Nullable String); - method public static boolean getBoolean(@NonNull String, boolean); - method public static int getInt(@NonNull String, int); - method public static long getLong(@NonNull String, long); - } - public final class UserHandle implements android.os.Parcelable { - method public static int getAppId(int); - method public int getIdentifier(); method public static int getUid(int, int); method public static int getUserId(int); method public static boolean isApp(int); - method public static int myUserId(); - method public static android.os.UserHandle of(int); - field @NonNull public static final android.os.UserHandle ALL; - field @NonNull public static final android.os.UserHandle CURRENT; field public static final int MIN_SECONDARY_USER_ID = 10; // 0xa - field @NonNull public static final android.os.UserHandle SYSTEM; field public static final int USER_ALL = -1; // 0xffffffff field public static final int USER_NULL = -10000; // 0xffffd8f0 field public static final int USER_SYSTEM = 0; // 0x0 @@ -3033,7 +1213,6 @@ package android.os { public class UserManager { method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public boolean hasBaseUserRestriction(@NonNull String, @NonNull android.os.UserHandle); method public static boolean isSplitSystemUser(); - field public static final String ACTION_USER_RESTRICTIONS_CHANGED = "android.os.action.USER_RESTRICTIONS_CHANGED"; } public final class VibrationAttributes implements android.os.Parcelable { @@ -3090,17 +1269,6 @@ package android.os { field @NonNull public static final android.os.Parcelable.Creator<android.os.VibrationEffect.Waveform> CREATOR; } - public abstract class Vibrator { - method @RequiresPermission(android.Manifest.permission.ACCESS_VIBRATOR_STATE) public void addVibratorStateListener(@NonNull android.os.Vibrator.OnVibratorStateChangedListener); - method @RequiresPermission(android.Manifest.permission.ACCESS_VIBRATOR_STATE) public void addVibratorStateListener(@NonNull java.util.concurrent.Executor, @NonNull android.os.Vibrator.OnVibratorStateChangedListener); - method @RequiresPermission(android.Manifest.permission.ACCESS_VIBRATOR_STATE) public boolean isVibrating(); - method @RequiresPermission(android.Manifest.permission.ACCESS_VIBRATOR_STATE) public void removeVibratorStateListener(@NonNull android.os.Vibrator.OnVibratorStateChangedListener); - } - - public static interface Vibrator.OnVibratorStateChangedListener { - method public void onVibratorStateChanged(boolean); - } - public class VintfObject { method public static String[] getHalNamesAndVersions(); method public static String getSepolicyVersion(); @@ -3120,16 +1288,10 @@ package android.os { } public class WorkSource implements android.os.Parcelable { - ctor public WorkSource(int); method public boolean add(int); method public boolean add(int, String); method @Deprecated public android.os.WorkSource addReturningNewbs(android.os.WorkSource); - method @Nullable public String getPackageName(int); - method public int getUid(int); - method public boolean isEmpty(); method @Deprecated public android.os.WorkSource[] setReturningDiffs(android.os.WorkSource); - method public int size(); - method @NonNull public android.os.WorkSource withoutNames(); } } @@ -3189,36 +1351,6 @@ package android.os.health { } -package android.os.image { - - public class DynamicSystemClient { - ctor public DynamicSystemClient(@NonNull android.content.Context); - method @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM) public void bind(); - method public void setOnStatusChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.os.image.DynamicSystemClient.OnStatusChangedListener); - method public void setOnStatusChangedListener(@NonNull android.os.image.DynamicSystemClient.OnStatusChangedListener); - method @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM) public void start(@NonNull android.net.Uri, long); - method @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM) public void start(@NonNull android.net.Uri, long, long); - method @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM) public void unbind(); - field public static final int CAUSE_ERROR_EXCEPTION = 6; // 0x6 - field public static final int CAUSE_ERROR_INVALID_URL = 4; // 0x4 - field public static final int CAUSE_ERROR_IO = 3; // 0x3 - field public static final int CAUSE_ERROR_IPC = 5; // 0x5 - field public static final int CAUSE_INSTALL_CANCELLED = 2; // 0x2 - field public static final int CAUSE_INSTALL_COMPLETED = 1; // 0x1 - field public static final int CAUSE_NOT_SPECIFIED = 0; // 0x0 - field public static final int STATUS_IN_PROGRESS = 2; // 0x2 - field public static final int STATUS_IN_USE = 4; // 0x4 - field public static final int STATUS_NOT_STARTED = 1; // 0x1 - field public static final int STATUS_READY = 3; // 0x3 - field public static final int STATUS_UNKNOWN = 0; // 0x0 - } - - public static interface DynamicSystemClient.OnStatusChangedListener { - method public void onStatusChanged(int, int, long, @Nullable Throwable); - } - -} - package android.os.storage { public final class CrateInfo implements android.os.Parcelable { @@ -3232,10 +1364,6 @@ package android.os.storage { field @NonNull public static final android.os.Parcelable.Creator<android.os.storage.CrateInfo> CREATOR; } - public class StorageManager { - method public static boolean hasIsolatedStorage(); - } - public final class StorageVolume implements android.os.Parcelable { method public String getPath(); } @@ -3252,17 +1380,9 @@ package android.os.strictmode { package android.permission { public final class PermissionControllerManager { - method @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.RESTORE_RUNTIME_PERMISSIONS}) public void applyStagedRuntimePermissionBackup(@NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>); method @RequiresPermission(android.Manifest.permission.GET_RUNTIME_PERMISSIONS) public void countPermissionApps(@NonNull java.util.List<java.lang.String>, int, @NonNull android.permission.PermissionControllerManager.OnCountPermissionAppsResultCallback, @Nullable android.os.Handler); method @RequiresPermission(android.Manifest.permission.GET_RUNTIME_PERMISSIONS) public void getAppPermissions(@NonNull String, @NonNull android.permission.PermissionControllerManager.OnGetAppPermissionResultCallback, @Nullable android.os.Handler); - method @RequiresPermission(android.Manifest.permission.GET_RUNTIME_PERMISSIONS) public void getRuntimePermissionBackup(@NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<byte[]>); method @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) public void revokeRuntimePermission(@NonNull String, @NonNull String); - method @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) public void revokeRuntimePermissions(@NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>, boolean, int, @NonNull java.util.concurrent.Executor, @NonNull android.permission.PermissionControllerManager.OnRevokeRuntimePermissionsCallback); - method @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.RESTORE_RUNTIME_PERMISSIONS}) public void stageAndApplyRuntimePermissionsBackup(@NonNull byte[], @NonNull android.os.UserHandle); - field public static final int COUNT_ONLY_WHEN_GRANTED = 1; // 0x1 - field public static final int COUNT_WHEN_SYSTEM = 2; // 0x2 - field public static final int REASON_INSTALLER_POLICY_VIOLATION = 2; // 0x2 - field public static final int REASON_MALWARE = 1; // 0x1 } public static interface PermissionControllerManager.OnCountPermissionAppsResultCallback { @@ -3273,33 +1393,6 @@ package android.permission { method public void onGetAppPermissions(@NonNull java.util.List<android.permission.RuntimePermissionPresentationInfo>); } - public abstract static class PermissionControllerManager.OnRevokeRuntimePermissionsCallback { - ctor public PermissionControllerManager.OnRevokeRuntimePermissionsCallback(); - method public abstract void onRevokeRuntimePermissions(@NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>); - } - - public final class PermissionManager { - method @IntRange(from=0) @RequiresPermission(anyOf={android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY, android.Manifest.permission.UPGRADE_RUNTIME_PERMISSIONS}) public int getRuntimePermissionsVersion(); - method @NonNull public java.util.List<android.permission.PermissionManager.SplitPermissionInfo> getSplitPermissions(); - method @RequiresPermission(anyOf={android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY, android.Manifest.permission.UPGRADE_RUNTIME_PERMISSIONS}) public void setRuntimePermissionsVersion(@IntRange(from=0) int); - } - - public static final class PermissionManager.SplitPermissionInfo { - method @NonNull public java.util.List<java.lang.String> getNewPermissions(); - method @NonNull public String getSplitPermission(); - method public int getTargetSdk(); - } - - public final class RuntimePermissionPresentationInfo implements android.os.Parcelable { - ctor public RuntimePermissionPresentationInfo(@NonNull CharSequence, boolean, boolean); - method public int describeContents(); - method @NonNull public CharSequence getLabel(); - method public boolean isGranted(); - method public boolean isStandard(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.permission.RuntimePermissionPresentationInfo> CREATOR; - } - } package android.print { @@ -3347,75 +1440,18 @@ package android.provider { } public final class DeviceConfig { - method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static void addOnPropertiesChangedListener(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.provider.DeviceConfig.OnPropertiesChangedListener); - method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static boolean getBoolean(@NonNull String, @NonNull String, boolean); - method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static float getFloat(@NonNull String, @NonNull String, float); - method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static int getInt(@NonNull String, @NonNull String, int); - method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static long getLong(@NonNull String, @NonNull String, long); - method @NonNull @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static android.provider.DeviceConfig.Properties getProperties(@NonNull String, @NonNull java.lang.String...); - method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static String getProperty(@NonNull String, @NonNull String); - method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static String getString(@NonNull String, @NonNull String, @Nullable String); - method public static void removeOnPropertiesChangedListener(@NonNull android.provider.DeviceConfig.OnPropertiesChangedListener); - method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static void resetToDefaults(int, @Nullable String); - method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static boolean setProperties(@NonNull android.provider.DeviceConfig.Properties) throws android.provider.DeviceConfig.BadConfigException; - method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static boolean setProperty(@NonNull String, @NonNull String, @Nullable String, boolean); field public static final String NAMESPACE_ALARM_MANAGER = "alarm_manager"; field public static final String NAMESPACE_ANDROID = "android"; - field public static final String NAMESPACE_AUTOFILL = "autofill"; - field public static final String NAMESPACE_BIOMETRICS = "biometrics"; - field public static final String NAMESPACE_CONTENT_CAPTURE = "content_capture"; field public static final String NAMESPACE_DEVICE_IDLE = "device_idle"; field public static final String NAMESPACE_JOB_SCHEDULER = "jobscheduler"; - field public static final String NAMESPACE_PERMISSIONS = "permissions"; - field public static final String NAMESPACE_PRIVACY = "privacy"; - field public static final String NAMESPACE_ROLLBACK = "rollback"; - field public static final String NAMESPACE_ROLLBACK_BOOT = "rollback_boot"; - } - - public static class DeviceConfig.BadConfigException extends java.lang.Exception { - ctor public DeviceConfig.BadConfigException(); - } - - public static interface DeviceConfig.OnPropertiesChangedListener { - method public void onPropertiesChanged(@NonNull android.provider.DeviceConfig.Properties); - } - - public static class DeviceConfig.Properties { - method public boolean getBoolean(@NonNull String, boolean); - method public float getFloat(@NonNull String, float); - method public int getInt(@NonNull String, int); - method @NonNull public java.util.Set<java.lang.String> getKeyset(); - method public long getLong(@NonNull String, long); - method @NonNull public String getNamespace(); - method @Nullable public String getString(@NonNull String, @Nullable String); - } - - public static final class DeviceConfig.Properties.Builder { - ctor public DeviceConfig.Properties.Builder(@NonNull String); - method @NonNull public android.provider.DeviceConfig.Properties build(); - method @NonNull public android.provider.DeviceConfig.Properties.Builder setBoolean(@NonNull String, boolean); - method @NonNull public android.provider.DeviceConfig.Properties.Builder setFloat(@NonNull String, float); - method @NonNull public android.provider.DeviceConfig.Properties.Builder setInt(@NonNull String, int); - method @NonNull public android.provider.DeviceConfig.Properties.Builder setLong(@NonNull String, long); - method @NonNull public android.provider.DeviceConfig.Properties.Builder setString(@NonNull String, @Nullable String); - } - - public final class DocumentsContract { - method public static boolean isManageMode(@NonNull android.net.Uri); - method @NonNull public static android.net.Uri setManageMode(@NonNull android.net.Uri); } public final class Settings { - field public static final String ACTION_ENTERPRISE_PRIVACY_SETTINGS = "android.settings.ENTERPRISE_PRIVACY_SETTINGS"; - field public static final String ACTION_MANAGE_APP_OVERLAY_PERMISSION = "android.settings.MANAGE_APP_OVERLAY_PERMISSION"; - field public static final String ACTION_REQUEST_ENABLE_CONTENT_CAPTURE = "android.settings.REQUEST_ENABLE_CONTENT_CAPTURE"; - field public static final String ACTION_TETHER_PROVISIONING_UI = "android.settings.TETHER_PROVISIONING_UI"; field public static final int RESET_MODE_PACKAGE_DEFAULTS = 1; // 0x1 } public static final class Settings.Global extends android.provider.Settings.NameValueTable { field public static final String APP_OPS_CONSTANTS = "app_ops_constants"; - field public static final String AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES = "autofill_compat_mode_allowed_packages"; field public static final String AUTOMATIC_POWER_SAVE_MODE = "automatic_power_save_mode"; field public static final String BATTERY_SAVER_CONSTANTS = "battery_saver_constants"; field public static final String DYNAMIC_POWER_SAVINGS_DISABLE_THRESHOLD = "dynamic_power_savings_disable_threshold"; @@ -3430,12 +1466,10 @@ package android.provider { field public static final String NOTIFICATION_BUBBLES = "notification_bubbles"; field public static final String OVERLAY_DISPLAY_DEVICES = "overlay_display_devices"; field public static final String SHOW_FIRST_CRASH_DIALOG = "show_first_crash_dialog"; - field public static final String TETHER_OFFLOAD_DISABLED = "tether_offload_disabled"; field public static final String USE_OPEN_WIFI_PACKAGE = "use_open_wifi_package"; } public static final class Settings.Secure extends android.provider.Settings.NameValueTable { - method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public static void resetToDefaults(@NonNull android.content.ContentResolver, @Nullable String); field public static final String ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED = "accessibility_display_magnification_enabled"; field public static final String ACCESSIBILITY_MAGNIFICATION_CAPABILITY = "accessibility_magnification_capability"; field public static final String ACCESSIBILITY_MAGNIFICATION_MODE = "accessibility_magnification_mode"; @@ -3444,23 +1478,12 @@ package android.provider { field public static final int ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW = 2; // 0x2 field public static final String ACCESSIBILITY_SHORTCUT_TARGET_SERVICE = "accessibility_shortcut_target_service"; field public static final String ANR_SHOW_BACKGROUND = "anr_show_background"; - field public static final String AUTOFILL_FEATURE_FIELD_CLASSIFICATION = "autofill_field_classification"; field public static final String AUTOFILL_SERVICE = "autofill_service"; - field public static final String AUTOFILL_USER_DATA_MAX_CATEGORY_COUNT = "autofill_user_data_max_category_count"; - field public static final String AUTOFILL_USER_DATA_MAX_FIELD_CLASSIFICATION_IDS_SIZE = "autofill_user_data_max_field_classification_size"; - field public static final String AUTOFILL_USER_DATA_MAX_USER_DATA_SIZE = "autofill_user_data_max_user_data_size"; - field public static final String AUTOFILL_USER_DATA_MAX_VALUE_LENGTH = "autofill_user_data_max_value_length"; - field public static final String AUTOFILL_USER_DATA_MIN_VALUE_LENGTH = "autofill_user_data_min_value_length"; field public static final String CONTENT_CAPTURE_ENABLED = "content_capture_enabled"; field public static final String DISABLED_PRINT_SERVICES = "disabled_print_services"; - field public static final String DOZE_ALWAYS_ON = "doze_always_on"; field @Deprecated public static final String ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES = "enabled_notification_policy_access_packages"; field public static final String ENABLED_VR_LISTENERS = "enabled_vr_listeners"; field public static final String IMMERSIVE_MODE_CONFIRMATIONS = "immersive_mode_confirmations"; - field public static final String LOCATION_ACCESS_CHECK_DELAY_MILLIS = "location_access_check_delay_millis"; - field public static final String LOCATION_ACCESS_CHECK_INTERVAL_MILLIS = "location_access_check_interval_millis"; - field public static final String LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS = "lock_screen_allow_private_notifications"; - field public static final String LOCK_SCREEN_SHOW_NOTIFICATIONS = "lock_screen_show_notifications"; field public static final String NFC_PAYMENT_DEFAULT_COMPONENT = "nfc_payment_default_component"; field public static final String NOTIFICATION_BADGING = "notification_badging"; field public static final String POWER_MENU_LOCKED_SHOW_CONTENT = "power_menu_locked_show_content"; @@ -3469,45 +1492,9 @@ package android.provider { field public static final String SHOW_FIRST_CRASH_DIALOG_DEV_OPTION = "show_first_crash_dialog_dev_option"; field public static final String SHOW_IME_WITH_HARD_KEYBOARD = "show_ime_with_hard_keyboard"; field @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public static final String SYNC_PARENT_SOUNDS = "sync_parent_sounds"; - field public static final String USER_SETUP_COMPLETE = "user_setup_complete"; field public static final String VOICE_INTERACTION_SERVICE = "voice_interaction_service"; } - public static final class Telephony.CellBroadcasts implements android.provider.BaseColumns { - field public static final String CID = "cid"; - field public static final String CMAS_CATEGORY = "cmas_category"; - field public static final String CMAS_CERTAINTY = "cmas_certainty"; - field public static final String CMAS_MESSAGE_CLASS = "cmas_message_class"; - field public static final String CMAS_RESPONSE_TYPE = "cmas_response_type"; - field public static final String CMAS_SEVERITY = "cmas_severity"; - field public static final String CMAS_URGENCY = "cmas_urgency"; - field @NonNull public static final android.net.Uri CONTENT_URI; - field public static final String DATA_CODING_SCHEME = "dcs"; - field public static final String DEFAULT_SORT_ORDER = "date DESC"; - field public static final String DELIVERY_TIME = "date"; - field public static final String ETWS_IS_PRIMARY = "etws_is_primary"; - field public static final String ETWS_WARNING_TYPE = "etws_warning_type"; - field public static final String GEOGRAPHICAL_SCOPE = "geo_scope"; - field public static final String GEOMETRIES = "geometries"; - field public static final String LAC = "lac"; - field public static final String LANGUAGE_CODE = "language"; - field public static final String LOCATION_CHECK_TIME = "location_check_time"; - field public static final String MAXIMUM_WAIT_TIME = "maximum_wait_time"; - field public static final String MESSAGE_BODY = "body"; - field public static final String MESSAGE_BROADCASTED = "message_broadcasted"; - field public static final String MESSAGE_DISPLAYED = "message_displayed"; - field public static final String MESSAGE_FORMAT = "format"; - field @NonNull @RequiresPermission(android.Manifest.permission.READ_CELL_BROADCASTS) public static final android.net.Uri MESSAGE_HISTORY_URI; - field public static final String MESSAGE_PRIORITY = "priority"; - field public static final String MESSAGE_READ = "read"; - field public static final String PLMN = "plmn"; - field public static final String RECEIVED_TIME = "received_time"; - field public static final String SERIAL_NUMBER = "serial_number"; - field public static final String SERVICE_CATEGORY = "service_category"; - field public static final String SLOT_INDEX = "slot_index"; - field public static final String SUBSCRIPTION_ID = "sub_id"; - } - public static final class Telephony.Sms.Intents { field public static final String SMS_CARRIER_PROVISION_ACTION = "android.provider.Telephony.SMS_CARRIER_PROVISION"; } @@ -3529,19 +1516,6 @@ package android.security { package android.security.keystore { - public abstract class AttestationUtils { - method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static java.security.cert.X509Certificate[] attestDeviceIds(android.content.Context, @NonNull int[], @NonNull byte[]) throws android.security.keystore.DeviceIdAttestationException; - field public static final int ID_TYPE_IMEI = 2; // 0x2 - field public static final int ID_TYPE_MEID = 3; // 0x3 - field public static final int ID_TYPE_SERIAL = 1; // 0x1 - field public static final int USE_INDIVIDUAL_ATTESTATION = 4; // 0x4 - } - - public class DeviceIdAttestationException extends java.lang.Exception { - ctor public DeviceIdAttestationException(@Nullable String); - ctor public DeviceIdAttestationException(@Nullable String, @Nullable Throwable); - } - public static final class KeyGenParameterSpec.Builder { method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setUniqueIdIncluded(boolean); } @@ -3556,37 +1530,8 @@ package android.security.keystore { } -package android.service.appprediction { - - public abstract class AppPredictionService extends android.app.Service { - ctor public AppPredictionService(); - method @MainThread public abstract void onAppTargetEvent(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull android.app.prediction.AppTargetEvent); - method @NonNull public final android.os.IBinder onBind(@NonNull android.content.Intent); - method public void onCreatePredictionSession(@NonNull android.app.prediction.AppPredictionContext, @NonNull android.app.prediction.AppPredictionSessionId); - method @MainThread public void onDestroyPredictionSession(@NonNull android.app.prediction.AppPredictionSessionId); - method @MainThread public abstract void onLaunchLocationShown(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull String, @NonNull java.util.List<android.app.prediction.AppTargetId>); - method @MainThread public abstract void onRequestPredictionUpdate(@NonNull android.app.prediction.AppPredictionSessionId); - method @MainThread public abstract void onSortAppTargets(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull java.util.List<android.app.prediction.AppTarget>, @NonNull android.os.CancellationSignal, @NonNull java.util.function.Consumer<java.util.List<android.app.prediction.AppTarget>>); - method @MainThread public void onStartPredictionUpdates(); - method @MainThread public void onStopPredictionUpdates(); - method public final void updatePredictions(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull java.util.List<android.app.prediction.AppTarget>); - } - -} - package android.service.autofill { - public abstract class AutofillFieldClassificationService extends android.app.Service { - ctor public AutofillFieldClassificationService(); - method public android.os.IBinder onBind(android.content.Intent); - field public static final String REQUIRED_ALGORITHM_CREDIT_CARD = "CREDIT_CARD"; - field public static final String REQUIRED_ALGORITHM_EDIT_DISTANCE = "EDIT_DISTANCE"; - field public static final String REQUIRED_ALGORITHM_EXACT_MATCH = "EXACT_MATCH"; - field public static final String SERVICE_INTERFACE = "android.service.autofill.AutofillFieldClassificationService"; - field public static final String SERVICE_META_DATA_KEY_AVAILABLE_ALGORITHMS = "android.autofill.field_classification.available_algorithms"; - field public static final String SERVICE_META_DATA_KEY_DEFAULT_ALGORITHM = "android.autofill.field_classification.default_algorithm"; - } - public final class CharSequenceTransformation extends android.service.autofill.InternalTransformation implements android.os.Parcelable android.service.autofill.Transformation { method public void apply(@NonNull android.service.autofill.ValueFinder, @NonNull android.widget.RemoteViews, int) throws java.lang.Exception; } @@ -3609,11 +1554,6 @@ package android.service.autofill { method @Nullable public android.util.SparseArray<android.service.autofill.InternalOnClickAction> getActions(); } - public static final class Dataset.Builder { - ctor public Dataset.Builder(@NonNull android.service.autofill.InlinePresentation); - method @NonNull public android.service.autofill.Dataset.Builder setFieldInlinePresentation(@NonNull android.view.autofill.AutofillId, @Nullable android.view.autofill.AutofillValue, @Nullable java.util.regex.Pattern, @NonNull android.service.autofill.InlinePresentation); - } - public final class DateTransformation extends android.service.autofill.InternalTransformation implements android.os.Parcelable android.service.autofill.Transformation { method public void apply(@NonNull android.service.autofill.ValueFinder, @NonNull android.widget.RemoteViews, int) throws java.lang.Exception; } @@ -3630,15 +1570,6 @@ package android.service.autofill { method public void apply(@NonNull android.service.autofill.ValueFinder, @NonNull android.widget.RemoteViews, int) throws java.lang.Exception; } - public abstract class InlineSuggestionRenderService extends android.app.Service { - ctor public InlineSuggestionRenderService(); - method @Nullable public final android.os.IBinder onBind(@NonNull android.content.Intent); - method @NonNull public android.os.Bundle onGetInlineSuggestionsRendererInfo(); - method @Nullable public android.view.View onRenderSuggestion(@NonNull android.service.autofill.InlinePresentation, int, int); - method public final void startIntentSender(@NonNull android.content.IntentSender); - field public static final String SERVICE_INTERFACE = "android.service.autofill.InlineSuggestionRenderService"; - } - public abstract class InternalOnClickAction implements android.service.autofill.OnClickAction android.os.Parcelable { ctor public InternalOnClickAction(); method public abstract void onClick(@NonNull android.view.ViewGroup); @@ -3688,26 +1619,6 @@ package android.service.autofill { package android.service.autofill.augmented { - public abstract class AugmentedAutofillService extends android.app.Service { - ctor public AugmentedAutofillService(); - method protected final void dump(java.io.FileDescriptor, java.io.PrintWriter, String[]); - method protected void dump(@NonNull java.io.PrintWriter, @NonNull String[]); - method @Nullable public final android.service.autofill.FillEventHistory getFillEventHistory(); - method public void onConnected(); - method public void onDisconnected(); - method public void onFillRequest(@NonNull android.service.autofill.augmented.FillRequest, @NonNull android.os.CancellationSignal, @NonNull android.service.autofill.augmented.FillController, @NonNull android.service.autofill.augmented.FillCallback); - method public final boolean requestAutofill(@NonNull android.content.ComponentName, @NonNull android.view.autofill.AutofillId); - field public static final String SERVICE_INTERFACE = "android.service.autofill.augmented.AugmentedAutofillService"; - } - - public final class FillCallback { - method public void onSuccess(@Nullable android.service.autofill.augmented.FillResponse); - } - - public final class FillController { - method public void autofill(@NonNull java.util.List<android.util.Pair<android.view.autofill.AutofillId,android.view.autofill.AutofillValue>>); - } - public final class FillRequest { method @NonNull public android.content.ComponentName getActivityComponent(); method @NonNull public android.view.autofill.AutofillId getFocusedId(); @@ -3717,181 +1628,14 @@ package android.service.autofill.augmented { method public int getTaskId(); } - public final class FillResponse { - } - - public static final class FillResponse.Builder { - ctor public FillResponse.Builder(); - method @NonNull public android.service.autofill.augmented.FillResponse build(); - method @NonNull public android.service.autofill.augmented.FillResponse.Builder setClientState(@NonNull android.os.Bundle); - method @NonNull public android.service.autofill.augmented.FillResponse.Builder setFillWindow(@NonNull android.service.autofill.augmented.FillWindow); - method @NonNull public android.service.autofill.augmented.FillResponse.Builder setInlineSuggestions(@NonNull java.util.List<android.service.autofill.Dataset>); - } - - public final class FillWindow implements java.lang.AutoCloseable { - ctor public FillWindow(); - method public void destroy(); - method public boolean update(@NonNull android.service.autofill.augmented.PresentationParams.Area, @NonNull android.view.View, long); - } - - public abstract class PresentationParams { - method @Nullable public android.service.autofill.augmented.PresentationParams.Area getSuggestionArea(); - } - - public abstract static class PresentationParams.Area { - method @NonNull public android.graphics.Rect getBounds(); - } - -} - -package android.service.contentcapture { - - public final class ActivityEvent implements android.os.Parcelable { - method public int describeContents(); - method @NonNull public android.content.ComponentName getComponentName(); - method public int getEventType(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.service.contentcapture.ActivityEvent> CREATOR; - field public static final int TYPE_ACTIVITY_DESTROYED = 24; // 0x18 - field public static final int TYPE_ACTIVITY_PAUSED = 2; // 0x2 - field public static final int TYPE_ACTIVITY_RESUMED = 1; // 0x1 - field public static final int TYPE_ACTIVITY_STOPPED = 23; // 0x17 - } - - public abstract class ContentCaptureService extends android.app.Service { - ctor public ContentCaptureService(); - method public final void disableSelf(); - method public void onActivityEvent(@NonNull android.service.contentcapture.ActivityEvent); - method public void onActivitySnapshot(@NonNull android.view.contentcapture.ContentCaptureSessionId, @NonNull android.service.contentcapture.SnapshotData); - method public void onConnected(); - method public void onContentCaptureEvent(@NonNull android.view.contentcapture.ContentCaptureSessionId, @NonNull android.view.contentcapture.ContentCaptureEvent); - method public void onCreateContentCaptureSession(@NonNull android.view.contentcapture.ContentCaptureContext, @NonNull android.view.contentcapture.ContentCaptureSessionId); - method public void onDataRemovalRequest(@NonNull android.view.contentcapture.DataRemovalRequest); - method public void onDataShareRequest(@NonNull android.view.contentcapture.DataShareRequest, @NonNull android.service.contentcapture.DataShareCallback); - method public void onDestroyContentCaptureSession(@NonNull android.view.contentcapture.ContentCaptureSessionId); - method public void onDisconnected(); - method public final void setContentCaptureConditions(@NonNull String, @Nullable java.util.Set<android.view.contentcapture.ContentCaptureCondition>); - method public final void setContentCaptureWhitelist(@Nullable java.util.Set<java.lang.String>, @Nullable java.util.Set<android.content.ComponentName>); - field public static final String SERVICE_INTERFACE = "android.service.contentcapture.ContentCaptureService"; - field public static final String SERVICE_META_DATA = "android.content_capture"; - } - - public interface DataShareCallback { - method public void onAccept(@NonNull java.util.concurrent.Executor, @NonNull android.service.contentcapture.DataShareReadAdapter); - method public void onReject(); - } - - public interface DataShareReadAdapter { - method public void onError(int); - method public void onStart(@NonNull android.os.ParcelFileDescriptor); - } - - public final class SnapshotData implements android.os.Parcelable { - method public int describeContents(); - method @Nullable public android.app.assist.AssistContent getAssistContent(); - method @NonNull public android.os.Bundle getAssistData(); - method @NonNull public android.app.assist.AssistStructure getAssistStructure(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.service.contentcapture.SnapshotData> CREATOR; - } - } package android.service.notification { - public final class Adjustment implements android.os.Parcelable { - ctor public Adjustment(String, String, android.os.Bundle, CharSequence, int); - ctor public Adjustment(@NonNull String, @NonNull String, @NonNull android.os.Bundle, @NonNull CharSequence, @NonNull android.os.UserHandle); - method public int describeContents(); - method @NonNull public CharSequence getExplanation(); - method @NonNull public String getKey(); - method @NonNull public String getPackage(); - method @NonNull public android.os.Bundle getSignals(); - method public int getUser(); - method @NonNull public android.os.UserHandle getUserHandle(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.service.notification.Adjustment> CREATOR; - field public static final String KEY_CONTEXTUAL_ACTIONS = "key_contextual_actions"; - field public static final String KEY_IMPORTANCE = "key_importance"; - field public static final String KEY_RANKING_SCORE = "key_ranking_score"; - field public static final String KEY_SNOOZE_CRITERIA = "key_snooze_criteria"; - field public static final String KEY_TEXT_REPLIES = "key_text_replies"; - field public static final String KEY_USER_SENTIMENT = "key_user_sentiment"; - } - @Deprecated public abstract class ConditionProviderService extends android.app.Service { method @Deprecated public boolean isBound(); } - public abstract class NotificationAssistantService extends android.service.notification.NotificationListenerService { - ctor public NotificationAssistantService(); - method public final void adjustNotification(@NonNull android.service.notification.Adjustment); - method public final void adjustNotifications(@NonNull java.util.List<android.service.notification.Adjustment>); - method public void onActionInvoked(@NonNull String, @NonNull android.app.Notification.Action, int); - method public void onAllowedAdjustmentsChanged(); - method @NonNull public final android.os.IBinder onBind(@Nullable android.content.Intent); - method public void onNotificationDirectReplied(@NonNull String); - method @Nullable public abstract android.service.notification.Adjustment onNotificationEnqueued(@NonNull android.service.notification.StatusBarNotification); - method @Nullable public android.service.notification.Adjustment onNotificationEnqueued(@NonNull android.service.notification.StatusBarNotification, @NonNull android.app.NotificationChannel); - method public void onNotificationExpansionChanged(@NonNull String, boolean, boolean); - method public abstract void onNotificationSnoozedUntilContext(@NonNull android.service.notification.StatusBarNotification, @NonNull String); - method public void onNotificationVisibilityChanged(@NonNull String, boolean); - method public void onNotificationsSeen(@NonNull java.util.List<java.lang.String>); - method public void onPanelHidden(); - method public void onPanelRevealed(int); - method public void onSuggestedReplySent(@NonNull String, @NonNull CharSequence, int); - method public final void unsnoozeNotification(@NonNull String); - field public static final String SERVICE_INTERFACE = "android.service.notification.NotificationAssistantService"; - field public static final int SOURCE_FROM_APP = 0; // 0x0 - field public static final int SOURCE_FROM_ASSISTANT = 1; // 0x1 - } - - public abstract class NotificationListenerService extends android.app.Service { - method public void onNotificationRemoved(@NonNull android.service.notification.StatusBarNotification, @NonNull android.service.notification.NotificationListenerService.RankingMap, @NonNull android.service.notification.NotificationStats, int); - } - - public final class NotificationStats implements android.os.Parcelable { - ctor public NotificationStats(); - method public int describeContents(); - method public int getDismissalSentiment(); - method public int getDismissalSurface(); - method public boolean hasDirectReplied(); - method public boolean hasExpanded(); - method public boolean hasInteracted(); - method public boolean hasSeen(); - method public boolean hasSnoozed(); - method public boolean hasViewedSettings(); - method public void setDirectReplied(); - method public void setDismissalSentiment(int); - method public void setDismissalSurface(int); - method public void setExpanded(); - method public void setSeen(); - method public void setSnoozed(); - method public void setViewedSettings(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.service.notification.NotificationStats> CREATOR; - field public static final int DISMISSAL_AOD = 2; // 0x2 - field public static final int DISMISSAL_NOT_DISMISSED = -1; // 0xffffffff - field public static final int DISMISSAL_OTHER = 0; // 0x0 - field public static final int DISMISSAL_PEEK = 1; // 0x1 - field public static final int DISMISSAL_SHADE = 3; // 0x3 - field public static final int DISMISS_SENTIMENT_NEGATIVE = 0; // 0x0 - field public static final int DISMISS_SENTIMENT_NEUTRAL = 1; // 0x1 - field public static final int DISMISS_SENTIMENT_POSITIVE = 2; // 0x2 - field public static final int DISMISS_SENTIMENT_UNKNOWN = -1000; // 0xfffffc18 - } - - public final class SnoozeCriterion implements android.os.Parcelable { - ctor public SnoozeCriterion(String, CharSequence, CharSequence); - ctor protected SnoozeCriterion(android.os.Parcel); - method public int describeContents(); - method public CharSequence getConfirmation(); - method public CharSequence getExplanation(); - method public String getId(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.service.notification.SnoozeCriterion> CREATOR; - } - } package android.service.quickaccesswallet { @@ -3932,67 +1676,16 @@ package android.service.quicksettings { } -package android.service.textclassifier { - - public abstract class TextClassifierService extends android.app.Service { - ctor public TextClassifierService(); - method @NonNull public static android.view.textclassifier.TextClassifier getDefaultTextClassifierImplementation(@NonNull android.content.Context); - method @Deprecated public final android.view.textclassifier.TextClassifier getLocalTextClassifier(); - method @Nullable public final android.os.IBinder onBind(@NonNull android.content.Intent); - method @MainThread public abstract void onClassifyText(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextClassification.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextClassification>); - method public void onConnected(); - method @MainThread public void onCreateTextClassificationSession(@NonNull android.view.textclassifier.TextClassificationContext, @NonNull android.view.textclassifier.TextClassificationSessionId); - method @MainThread public void onDestroyTextClassificationSession(@NonNull android.view.textclassifier.TextClassificationSessionId); - method @MainThread public void onDetectLanguage(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextLanguage.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextLanguage>); - method public void onDisconnected(); - method @MainThread public abstract void onGenerateLinks(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextLinks.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextLinks>); - method @Deprecated @MainThread public void onSelectionEvent(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.SelectionEvent); - method @MainThread public void onSuggestConversationActions(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.ConversationActions.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.ConversationActions>); - method @MainThread public abstract void onSuggestSelection(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextSelection.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextSelection>); - method @MainThread public void onTextClassifierEvent(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextClassifierEvent); - field public static final String SERVICE_INTERFACE = "android.service.textclassifier.TextClassifierService"; - } - - public static interface TextClassifierService.Callback<T> { - method public void onFailure(@NonNull CharSequence); - method public void onSuccess(T); - } - -} - package android.service.watchdog { public abstract class ExplicitHealthCheckService extends android.app.Service { - ctor public ExplicitHealthCheckService(); - method public final void notifyHealthCheckPassed(@NonNull String); - method @NonNull public final android.os.IBinder onBind(@NonNull android.content.Intent); - method public abstract void onCancelHealthCheck(@NonNull String); - method @NonNull public abstract java.util.List<java.lang.String> onGetRequestedPackages(); - method @NonNull public abstract java.util.List<android.service.watchdog.ExplicitHealthCheckService.PackageConfig> onGetSupportedPackages(); - method public abstract void onRequestHealthCheck(@NonNull String); method public void setCallback(@Nullable android.os.RemoteCallback); - field public static final String BIND_PERMISSION = "android.permission.BIND_EXPLICIT_HEALTH_CHECK_SERVICE"; - field public static final String SERVICE_INTERFACE = "android.service.watchdog.ExplicitHealthCheckService"; - } - - public static final class ExplicitHealthCheckService.PackageConfig implements android.os.Parcelable { - ctor public ExplicitHealthCheckService.PackageConfig(@NonNull String, long); - method public int describeContents(); - method public long getHealthCheckTimeoutMillis(); - method @NonNull public String getPackageName(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.service.watchdog.ExplicitHealthCheckService.PackageConfig> CREATOR; } } package android.telecom { - public final class Call { - method public void enterBackgroundAudioProcessing(); - method public void exitBackgroundAudioProcessing(boolean); - } - public static class Call.Details { method public String getTelecomCallId(); } @@ -4001,42 +1694,6 @@ package android.telecom { ctor public CallAudioState(boolean, int, int, @Nullable android.bluetooth.BluetoothDevice, @NonNull java.util.Collection<android.bluetooth.BluetoothDevice>); } - public static class CallScreeningService.CallResponse.Builder { - method @NonNull @RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_OUTPUT) public android.telecom.CallScreeningService.CallResponse.Builder setShouldScreenCallViaAudioProcessing(boolean); - } - - public abstract class Conference extends android.telecom.Conferenceable { - method public android.telecom.Connection getPrimaryConnection(); - method @NonNull public final String getTelecomCallId(); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public final void setAddress(@NonNull android.net.Uri, int); - method public final void setCallerDisplayName(@NonNull String, int); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setConferenceState(boolean); - } - - public abstract class Connection extends android.telecom.Conferenceable { - method @IntRange(from=0) public final long getConnectTimeMillis(); - method public final long getConnectionStartElapsedRealtimeMillis(); - method @Nullable public android.telecom.PhoneAccountHandle getPhoneAccountHandle(); - method @Nullable public final String getTelecomCallId(); - method public final void resetConnectionTime(); - method public void setCallDirection(int); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public final void setConnectTimeMillis(@IntRange(from=0) long); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public final void setConnectionStartElapsedRealtimeMillis(long); - method public void setPhoneAccountHandle(@NonNull android.telecom.PhoneAccountHandle); - method public void setTelecomCallId(@NonNull String); - field public static final int CAPABILITY_CONFERENCE_HAS_NO_CHILDREN = 2097152; // 0x200000 - field public static final int CAPABILITY_SPEED_UP_MT_AUDIO = 262144; // 0x40000 - field public static final String EXTRA_DISABLE_ADD_CALL = "android.telecom.extra.DISABLE_ADD_CALL"; - field public static final int PROPERTY_EMERGENCY_CALLBACK_MODE = 1; // 0x1 - field public static final int PROPERTY_GENERIC_CONFERENCE = 2; // 0x2 - field public static final int PROPERTY_IS_DOWNGRADED_CONFERENCE = 64; // 0x40 - field public static final int PROPERTY_REMOTELY_HOSTED = 2048; // 0x800 - } - - public final class ConnectionRequest implements android.os.Parcelable { - method @Nullable public String getTelecomCallId(); - } - public static final class ConnectionRequest.Builder { ctor public ConnectionRequest.Builder(); method @NonNull public android.telecom.ConnectionRequest build(); @@ -4052,53 +1709,11 @@ package android.telecom { method @NonNull public android.telecom.ConnectionRequest.Builder setVideoState(int); } - public static class PhoneAccount.Builder { - method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public android.telecom.PhoneAccount.Builder setGroupId(@NonNull String); - } - - public class PhoneAccountSuggestionService extends android.app.Service { - ctor public PhoneAccountSuggestionService(); - method public void onAccountSuggestionRequest(@NonNull String); - method public android.os.IBinder onBind(android.content.Intent); - method public final void suggestPhoneAccounts(@NonNull String, @NonNull java.util.List<android.telecom.PhoneAccountSuggestion>); - field public static final String SERVICE_INTERFACE = "android.telecom.PhoneAccountSuggestionService"; - } - - public class TelecomManager { - method @NonNull public android.content.Intent createLaunchEmergencyDialerIntent(@Nullable String); - method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.List<android.telecom.PhoneAccountHandle> getCallCapablePhoneAccounts(boolean); - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getCurrentTtyMode(); - method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getDefaultDialerPackage(@NonNull android.os.UserHandle); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean isInEmergencyCall(); - method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isRinging(); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUserSelectedOutgoingPhoneAccount(@Nullable android.telecom.PhoneAccountHandle); - field public static final String ACTION_CURRENT_TTY_MODE_CHANGED = "android.telecom.action.CURRENT_TTY_MODE_CHANGED"; - field public static final String ACTION_TTY_PREFERRED_MODE_CHANGED = "android.telecom.action.TTY_PREFERRED_MODE_CHANGED"; - field public static final String EXTRA_CURRENT_TTY_MODE = "android.telecom.extra.CURRENT_TTY_MODE"; - field public static final String EXTRA_TTY_PREFERRED_MODE = "android.telecom.extra.TTY_PREFERRED_MODE"; - field public static final int TTY_MODE_FULL = 1; // 0x1 - field public static final int TTY_MODE_HCO = 2; // 0x2 - field public static final int TTY_MODE_OFF = 0; // 0x0 - field public static final int TTY_MODE_VCO = 3; // 0x3 - } - } package android.telephony { - public final class AccessNetworkConstants { - field public static final int TRANSPORT_TYPE_INVALID = -1; // 0xffffffff - } - - public static final class AccessNetworkConstants.NgranBands { - method public static int getFrequencyRangeGroup(int); - field public static final int FREQUENCY_RANGE_GROUP_1 = 1; // 0x1 - field public static final int FREQUENCY_RANGE_GROUP_2 = 2; // 0x2 - field public static final int FREQUENCY_RANGE_GROUP_UNKNOWN = 0; // 0x0 - } - public final class BarringInfo implements android.os.Parcelable { - ctor public BarringInfo(); ctor public BarringInfo(@Nullable android.telephony.CellIdentity, @NonNull android.util.SparseArray<android.telephony.BarringInfo.BarringServiceInfo>); } @@ -4106,57 +1721,6 @@ package android.telephony { ctor public BarringInfo.BarringServiceInfo(int, boolean, int, int); } - public final class CallQuality implements android.os.Parcelable { - ctor public CallQuality(int, int, int, int, int, int, int, int, int, int, int); - ctor public CallQuality(int, int, int, int, int, int, int, int, int, int, int, boolean, boolean, boolean); - method public int describeContents(); - method public int getAverageRelativeJitter(); - method public int getAverageRoundTripTime(); - method public int getCallDuration(); - method public int getCodecType(); - method public int getDownlinkCallQualityLevel(); - method public int getMaxRelativeJitter(); - method public int getNumRtpPacketsNotReceived(); - method public int getNumRtpPacketsReceived(); - method public int getNumRtpPacketsTransmitted(); - method public int getNumRtpPacketsTransmittedLost(); - method public int getUplinkCallQualityLevel(); - method public boolean isIncomingSilenceDetectedAtCallSetup(); - method public boolean isOutgoingSilenceDetectedAtCallSetup(); - method public boolean isRtpInactivityDetected(); - method public void writeToParcel(android.os.Parcel, int); - field public static final int CALL_QUALITY_BAD = 4; // 0x4 - field public static final int CALL_QUALITY_EXCELLENT = 0; // 0x0 - field public static final int CALL_QUALITY_FAIR = 2; // 0x2 - field public static final int CALL_QUALITY_GOOD = 1; // 0x1 - field public static final int CALL_QUALITY_NOT_AVAILABLE = 5; // 0x5 - field public static final int CALL_QUALITY_POOR = 3; // 0x3 - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.CallQuality> CREATOR; - } - - public class CarrierConfigManager { - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void overrideConfig(int, @Nullable android.os.PersistableBundle); - } - - public final class DataSpecificRegistrationInfo implements android.os.Parcelable { - method public int describeContents(); - method @NonNull public android.telephony.LteVopsSupportInfo getLteVopsSupportInfo(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.DataSpecificRegistrationInfo> CREATOR; - } - - public final class LteVopsSupportInfo implements android.os.Parcelable { - ctor public LteVopsSupportInfo(int, int); - method public int describeContents(); - method public int getEmcBearerSupport(); - method public int getVopsSupport(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.LteVopsSupportInfo> CREATOR; - field public static final int LTE_STATUS_NOT_AVAILABLE = 1; // 0x1 - field public static final int LTE_STATUS_NOT_SUPPORTED = 3; // 0x3 - field public static final int LTE_STATUS_SUPPORTED = 2; // 0x2 - } - public class MbmsDownloadSession implements java.lang.AutoCloseable { field public static final String MBMS_DOWNLOAD_SERVICE_OVERRIDE_METADATA = "mbms-download-service-override"; } @@ -4171,71 +1735,14 @@ package android.telephony { public final class ModemActivityInfo implements android.os.Parcelable { ctor public ModemActivityInfo(long, int, int, @NonNull int[], int); - method public int describeContents(); - method @NonNull public android.telephony.ModemActivityInfo getDelta(@NonNull android.telephony.ModemActivityInfo); - method public long getIdleTimeMillis(); - method public static int getNumTxPowerLevels(); - method public long getReceiveTimeMillis(); - method public long getSleepTimeMillis(); - method public long getTimestampMillis(); - method public long getTransmitDurationMillisAtPowerLevel(int); - method @NonNull public android.util.Range<java.lang.Integer> getTransmitPowerRange(int); method public boolean isValid(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ModemActivityInfo> CREATOR; - field public static final int TX_POWER_LEVEL_0 = 0; // 0x0 - field public static final int TX_POWER_LEVEL_1 = 1; // 0x1 - field public static final int TX_POWER_LEVEL_2 = 2; // 0x2 - field public static final int TX_POWER_LEVEL_3 = 3; // 0x3 - field public static final int TX_POWER_LEVEL_4 = 4; // 0x4 - } - - public final class NetworkRegistrationInfo implements android.os.Parcelable { - method @Nullable public android.telephony.DataSpecificRegistrationInfo getDataSpecificInfo(); - method public int getRegistrationState(); - method public int getRejectCause(); - method public int getRoamingType(); - method public boolean isEmergencyEnabled(); - method public void writeToParcel(android.os.Parcel, int); - field public static final int REGISTRATION_STATE_DENIED = 3; // 0x3 - field public static final int REGISTRATION_STATE_HOME = 1; // 0x1 - field public static final int REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING = 0; // 0x0 - field public static final int REGISTRATION_STATE_NOT_REGISTERED_SEARCHING = 2; // 0x2 - field public static final int REGISTRATION_STATE_ROAMING = 5; // 0x5 - field public static final int REGISTRATION_STATE_UNKNOWN = 4; // 0x4 - } - - public static final class NetworkRegistrationInfo.Builder { - ctor public NetworkRegistrationInfo.Builder(); - method @NonNull public android.telephony.NetworkRegistrationInfo build(); - method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setAccessNetworkTechnology(int); - method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setAvailableServices(@NonNull java.util.List<java.lang.Integer>); - method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setCellIdentity(@Nullable android.telephony.CellIdentity); - method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setDomain(int); - method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setEmergencyOnly(boolean); - method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setRegisteredPlmn(@Nullable String); - method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setRegistrationState(int); - method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setRejectCause(int); - method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setTransportType(int); } public class PhoneNumberUtils { method public static int getMinMatchForTest(); - method @NonNull public static String getUsernameFromUriNumber(@NonNull String); - method public static boolean isUriNumber(@Nullable String); - method public static boolean isVoiceMailNumber(@NonNull android.content.Context, int, @Nullable String); method public static void setMinMatchForTest(int); } - public class PhoneStateListener { - method @Deprecated public void onOutgoingEmergencyCall(@NonNull android.telephony.emergency.EmergencyNumber); - method public void onOutgoingEmergencyCall(@NonNull android.telephony.emergency.EmergencyNumber, int); - method @Deprecated public void onOutgoingEmergencySms(@NonNull android.telephony.emergency.EmergencyNumber); - method public void onOutgoingEmergencySms(@NonNull android.telephony.emergency.EmergencyNumber, int); - field @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public static final int LISTEN_OUTGOING_EMERGENCY_CALL = 268435456; // 0x10000000 - field @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public static final int LISTEN_OUTGOING_EMERGENCY_SMS = 536870912; // 0x20000000 - } - public final class PreciseDataConnectionState implements android.os.Parcelable { ctor @Deprecated public PreciseDataConnectionState(int, int, int, @NonNull String, @Nullable android.net.LinkProperties, int); } @@ -4261,44 +1768,16 @@ package android.telephony { field public static final int SMS_CATEGORY_STANDARD_SHORT_CODE = 2; // 0x2 } - public class SubscriptionManager { - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultVoiceSubscriptionId(int); - field @NonNull public static final android.net.Uri ADVANCED_CALLING_ENABLED_CONTENT_URI; - field @NonNull public static final android.net.Uri VT_ENABLED_CONTENT_URI; - field @NonNull public static final android.net.Uri WFC_ENABLED_CONTENT_URI; - field @NonNull public static final android.net.Uri WFC_MODE_CONTENT_URI; - field @NonNull public static final android.net.Uri WFC_ROAMING_ENABLED_CONTENT_URI; - field @NonNull public static final android.net.Uri WFC_ROAMING_MODE_CONTENT_URI; - } - public class TelephonyManager { method public int addDevicePolicyOverrideApn(@NonNull android.content.Context, @NonNull android.telephony.data.ApnSetting); - method public int checkCarrierPrivilegesForPackage(String); - method @Nullable @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public android.content.ComponentName getAndUpdateDefaultRespondViaMessageApplication(); method public int getCarrierIdListVersion(); - method public java.util.List<java.lang.String> getCarrierPackageNamesForIntent(android.content.Intent); - method @Nullable @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public android.content.ComponentName getDefaultRespondViaMessageApplication(); method @NonNull public java.util.List<android.telephony.data.ApnSetting> getDevicePolicyOverrideApns(@NonNull android.content.Context); - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getEmergencyNumberDbVersion(); method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getLine1AlphaTag(); method public android.util.Pair<java.lang.Integer,java.lang.Integer> getRadioHalVersion(); - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isMobileDataPolicyEnabled(int); method public boolean modifyDevicePolicyOverrideApn(@NonNull android.content.Context, int, @NonNull android.telephony.data.ApnSetting); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void refreshUiccProfile(); - method @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public void resetOtaEmergencyNumberDbFilePath(); method @Deprecated public void setCarrierTestOverride(String, String, String, String, String, String, String); method public void setCarrierTestOverride(String, String, String, String, String, String, String, String, String); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setMobileDataPolicyEnabledStatus(int, boolean); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSystemSelectionChannels(@NonNull java.util.List<android.telephony.RadioAccessSpecifier>, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSystemSelectionChannels(@NonNull java.util.List<android.telephony.RadioAccessSpecifier>); - method @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public void updateOtaEmergencyNumberDbFilePath(@NonNull android.os.ParcelFileDescriptor); - field public static final int CARRIER_PRIVILEGE_STATUS_ERROR_LOADING_RULES = -2; // 0xfffffffe - field public static final int CARRIER_PRIVILEGE_STATUS_HAS_ACCESS = 1; // 0x1 - field public static final int CARRIER_PRIVILEGE_STATUS_NO_ACCESS = 0; // 0x0 - field public static final int CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED = -1; // 0xffffffff - field public static final int INVALID_EMERGENCY_NUMBER_DB_VERSION = -1; // 0xffffffff - field public static final int MOBILE_DATA_POLICY_DATA_ON_NON_DEFAULT_DURING_VOICE_CALL = 1; // 0x1 - field public static final int MOBILE_DATA_POLICY_MMS_ALWAYS_ALLOWED = 2; // 0x2 field public static final int UNKNOWN_CARRIER_ID_LIST_VERSION = -1; // 0xffffffff } @@ -4314,835 +1793,18 @@ package android.telephony.emergency { package android.telephony.ims { - public final class ImsCallForwardInfo implements android.os.Parcelable { - ctor public ImsCallForwardInfo(int, int, int, int, @NonNull String, int); - method public int describeContents(); - method public int getCondition(); - method public String getNumber(); - method public int getServiceClass(); - method public int getStatus(); - method public int getTimeSeconds(); - method public int getToA(); - method public void writeToParcel(android.os.Parcel, int); - field public static final int CDIV_CF_REASON_ALL = 4; // 0x4 - field public static final int CDIV_CF_REASON_ALL_CONDITIONAL = 5; // 0x5 - field public static final int CDIV_CF_REASON_BUSY = 1; // 0x1 - field public static final int CDIV_CF_REASON_NOT_LOGGED_IN = 6; // 0x6 - field public static final int CDIV_CF_REASON_NOT_REACHABLE = 3; // 0x3 - field public static final int CDIV_CF_REASON_NO_REPLY = 2; // 0x2 - field public static final int CDIV_CF_REASON_UNCONDITIONAL = 0; // 0x0 - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsCallForwardInfo> CREATOR; - field public static final int STATUS_ACTIVE = 1; // 0x1 - field public static final int STATUS_NOT_ACTIVE = 0; // 0x0 - field public static final int TYPE_OF_ADDRESS_INTERNATIONAL = 145; // 0x91 - field public static final int TYPE_OF_ADDRESS_UNKNOWN = 129; // 0x81 - } - public final class ImsCallProfile implements android.os.Parcelable { - ctor public ImsCallProfile(); - ctor public ImsCallProfile(int, int); - ctor public ImsCallProfile(int, int, android.os.Bundle, android.telephony.ims.ImsStreamMediaProfile); - method public int describeContents(); - method public String getCallExtra(String); - method public String getCallExtra(String, String); - method public boolean getCallExtraBoolean(String); - method public boolean getCallExtraBoolean(String, boolean); - method public int getCallExtraInt(String); - method public int getCallExtraInt(String, int); - method public android.os.Bundle getCallExtras(); - method public int getCallType(); - method public static int getCallTypeFromVideoState(int); - method public int getCallerNumberVerificationStatus(); - method public int getEmergencyCallRouting(); - method public int getEmergencyServiceCategories(); - method @NonNull public java.util.List<java.lang.String> getEmergencyUrns(); - method public android.telephony.ims.ImsStreamMediaProfile getMediaProfile(); - method @NonNull public android.os.Bundle getProprietaryCallExtras(); - method public int getRestrictCause(); - method public int getServiceType(); - method public static int getVideoStateFromCallType(int); - method public static int getVideoStateFromImsCallProfile(android.telephony.ims.ImsCallProfile); - method public boolean hasKnownUserIntentEmergency(); - method public boolean isEmergencyCallTesting(); - method public boolean isVideoCall(); - method public boolean isVideoPaused(); - method public static int presentationToOir(int); - method public void setCallExtra(String, String); - method public void setCallExtraBoolean(String, boolean); - method public void setCallExtraInt(String, int); - method public void setCallRestrictCause(int); - method public void setCallerNumberVerificationStatus(int); - method public void setEmergencyCallRouting(int); - method public void setEmergencyCallTesting(boolean); - method public void setEmergencyServiceCategories(int); - method public void setEmergencyUrns(@NonNull java.util.List<java.lang.String>); - method public void setHasKnownUserIntentEmergency(boolean); - method public void updateCallExtras(android.telephony.ims.ImsCallProfile); - method public void updateCallType(android.telephony.ims.ImsCallProfile); - method public void updateMediaProfile(android.telephony.ims.ImsCallProfile); - method public void writeToParcel(android.os.Parcel, int); - field public static final int CALL_RESTRICT_CAUSE_DISABLED = 2; // 0x2 - field public static final int CALL_RESTRICT_CAUSE_HD = 3; // 0x3 - field public static final int CALL_RESTRICT_CAUSE_NONE = 0; // 0x0 - field public static final int CALL_RESTRICT_CAUSE_RAT = 1; // 0x1 - field public static final int CALL_TYPE_VIDEO_N_VOICE = 3; // 0x3 - field public static final int CALL_TYPE_VOICE = 2; // 0x2 - field public static final int CALL_TYPE_VOICE_N_VIDEO = 1; // 0x1 - field public static final int CALL_TYPE_VS = 8; // 0x8 - field public static final int CALL_TYPE_VS_RX = 10; // 0xa - field public static final int CALL_TYPE_VS_TX = 9; // 0x9 - field public static final int CALL_TYPE_VT = 4; // 0x4 - field public static final int CALL_TYPE_VT_NODIR = 7; // 0x7 - field public static final int CALL_TYPE_VT_RX = 6; // 0x6 - field public static final int CALL_TYPE_VT_TX = 5; // 0x5 - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsCallProfile> CREATOR; - field public static final int DIALSTRING_NORMAL = 0; // 0x0 - field public static final int DIALSTRING_SS_CONF = 1; // 0x1 - field public static final int DIALSTRING_USSD = 2; // 0x2 - field public static final String EXTRA_ADDITIONAL_CALL_INFO = "AdditionalCallInfo"; - field public static final String EXTRA_ADDITIONAL_SIP_INVITE_FIELDS = "android.telephony.ims.extra.ADDITIONAL_SIP_INVITE_FIELDS"; - field public static final String EXTRA_CALL_DISCONNECT_CAUSE = "android.telephony.ims.extra.CALL_DISCONNECT_CAUSE"; - field public static final String EXTRA_CALL_NETWORK_TYPE = "android.telephony.ims.extra.CALL_NETWORK_TYPE"; - field @Deprecated public static final String EXTRA_CALL_RAT_TYPE = "CallRadioTech"; - field public static final String EXTRA_CHILD_NUMBER = "ChildNum"; - field public static final String EXTRA_CNA = "cna"; - field public static final String EXTRA_CNAP = "cnap"; - field public static final String EXTRA_CODEC = "Codec"; - field public static final String EXTRA_DIALSTRING = "dialstring"; - field public static final String EXTRA_DISPLAY_TEXT = "DisplayText"; - field public static final String EXTRA_EMERGENCY_CALL = "e_call"; - field public static final String EXTRA_FORWARDED_NUMBER = "android.telephony.ims.extra.FORWARDED_NUMBER"; - field public static final String EXTRA_IS_CALL_PULL = "CallPull"; field public static final String EXTRA_OEM_EXTRAS = "android.telephony.ims.extra.OEM_EXTRAS"; - field public static final String EXTRA_OI = "oi"; - field public static final String EXTRA_OIR = "oir"; - field public static final String EXTRA_REMOTE_URI = "remote_uri"; - field public static final String EXTRA_USSD = "ussd"; - field public static final int OIR_DEFAULT = 0; // 0x0 - field public static final int OIR_PRESENTATION_NOT_RESTRICTED = 2; // 0x2 - field public static final int OIR_PRESENTATION_PAYPHONE = 4; // 0x4 - field public static final int OIR_PRESENTATION_RESTRICTED = 1; // 0x1 - field public static final int OIR_PRESENTATION_UNKNOWN = 3; // 0x3 - field public static final int SERVICE_TYPE_EMERGENCY = 2; // 0x2 - field public static final int SERVICE_TYPE_NONE = 0; // 0x0 - field public static final int SERVICE_TYPE_NORMAL = 1; // 0x1 - field public static final int VERIFICATION_STATUS_FAILED = 2; // 0x2 - field public static final int VERIFICATION_STATUS_NOT_VERIFIED = 0; // 0x0 - field public static final int VERIFICATION_STATUS_PASSED = 1; // 0x1 - } - - public class ImsCallSessionListener { - method public void callQualityChanged(@NonNull android.telephony.CallQuality); - method public void callSessionConferenceExtendFailed(android.telephony.ims.ImsReasonInfo); - method public void callSessionConferenceExtendReceived(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); - method public void callSessionConferenceExtended(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); - method public void callSessionConferenceStateUpdated(android.telephony.ims.ImsConferenceState); - method @Deprecated public void callSessionHandover(int, int, android.telephony.ims.ImsReasonInfo); - method @Deprecated public void callSessionHandoverFailed(int, int, android.telephony.ims.ImsReasonInfo); - method public void callSessionHeld(android.telephony.ims.ImsCallProfile); - method public void callSessionHoldFailed(android.telephony.ims.ImsReasonInfo); - method public void callSessionHoldReceived(android.telephony.ims.ImsCallProfile); - method public void callSessionInitiated(android.telephony.ims.ImsCallProfile); - method public void callSessionInitiatedFailed(android.telephony.ims.ImsReasonInfo); - method public void callSessionInviteParticipantsRequestDelivered(); - method public void callSessionInviteParticipantsRequestFailed(android.telephony.ims.ImsReasonInfo); - method @Deprecated public void callSessionMayHandover(int, int); - method public void callSessionMergeComplete(android.telephony.ims.stub.ImsCallSessionImplBase); - method public void callSessionMergeFailed(android.telephony.ims.ImsReasonInfo); - method public void callSessionMergeStarted(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); - method public void callSessionMultipartyStateChanged(boolean); - method public void callSessionProgressing(android.telephony.ims.ImsStreamMediaProfile); - method public void callSessionRemoveParticipantsRequestDelivered(); - method public void callSessionRemoveParticipantsRequestFailed(android.telephony.ims.ImsReasonInfo); - method public void callSessionResumeFailed(android.telephony.ims.ImsReasonInfo); - method public void callSessionResumeReceived(android.telephony.ims.ImsCallProfile); - method public void callSessionResumed(android.telephony.ims.ImsCallProfile); - method public void callSessionRttAudioIndicatorChanged(@NonNull android.telephony.ims.ImsStreamMediaProfile); - method public void callSessionRttMessageReceived(String); - method public void callSessionRttModifyRequestReceived(android.telephony.ims.ImsCallProfile); - method public void callSessionRttModifyResponseReceived(int); - method public void callSessionSuppServiceReceived(android.telephony.ims.ImsSuppServiceNotification); - method public void callSessionTerminated(android.telephony.ims.ImsReasonInfo); - method public void callSessionTtyModeReceived(int); - method public void callSessionUpdateFailed(android.telephony.ims.ImsReasonInfo); - method public void callSessionUpdateReceived(android.telephony.ims.ImsCallProfile); - method public void callSessionUpdated(android.telephony.ims.ImsCallProfile); - method public void callSessionUssdMessageReceived(int, String); - method public void onHandover(int, int, @Nullable android.telephony.ims.ImsReasonInfo); - method public void onHandoverFailed(int, int, @NonNull android.telephony.ims.ImsReasonInfo); - method public void onMayHandover(int, int); - } - - public final class ImsConferenceState implements android.os.Parcelable { - method public int describeContents(); - method public static int getConnectionStateForStatus(String); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsConferenceState> CREATOR; - field public static final String DISPLAY_TEXT = "display-text"; - field public static final String ENDPOINT = "endpoint"; - field public static final String SIP_STATUS_CODE = "sipstatuscode"; - field public static final String STATUS = "status"; - field public static final String STATUS_ALERTING = "alerting"; - field public static final String STATUS_CONNECTED = "connected"; - field public static final String STATUS_CONNECT_FAIL = "connect-fail"; - field public static final String STATUS_DIALING_IN = "dialing-in"; - field public static final String STATUS_DIALING_OUT = "dialing-out"; - field public static final String STATUS_DISCONNECTED = "disconnected"; - field public static final String STATUS_DISCONNECTING = "disconnecting"; - field public static final String STATUS_MUTED_VIA_FOCUS = "muted-via-focus"; - field public static final String STATUS_ON_HOLD = "on-hold"; - field public static final String STATUS_PENDING = "pending"; - field public static final String STATUS_SEND_ONLY = "sendonly"; - field public static final String STATUS_SEND_RECV = "sendrecv"; - field public static final String USER = "user"; - field public final java.util.HashMap<java.lang.String,android.os.Bundle> mParticipants; - } - - public final class ImsException extends java.lang.Exception { - ctor public ImsException(@Nullable String); - ctor public ImsException(@Nullable String, int); - ctor public ImsException(@Nullable String, int, @Nullable Throwable); - } - - public final class ImsExternalCallState implements android.os.Parcelable { - ctor public ImsExternalCallState(@NonNull String, @NonNull android.net.Uri, @Nullable android.net.Uri, boolean, int, int, boolean); - method public int describeContents(); - method @NonNull public android.net.Uri getAddress(); - method public int getCallId(); - method public int getCallState(); - method public int getCallType(); - method @Nullable public android.net.Uri getLocalAddress(); - method public boolean isCallHeld(); - method public boolean isCallPullable(); - method public void writeToParcel(android.os.Parcel, int); - field public static final int CALL_STATE_CONFIRMED = 1; // 0x1 - field public static final int CALL_STATE_TERMINATED = 2; // 0x2 - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsExternalCallState> CREATOR; - } - - public class ImsMmTelManager implements android.telephony.ims.RegistrationManager { - method @Deprecated @NonNull @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PRECISE_PHONE_STATE}) public static android.telephony.ims.ImsMmTelManager createForSubscriptionId(int); - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void getFeatureState(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>) throws android.telephony.ims.ImsException; - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void getRegistrationState(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>); - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getVoWiFiRoamingModeSetting(); - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isAvailable(int, int); - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isCapable(int, int); - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void isSupported(int, int, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>) throws android.telephony.ims.ImsException; - method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerImsRegistrationCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ImsMmTelManager.RegistrationCallback) throws android.telephony.ims.ImsException; - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setAdvancedCallingSettingEnabled(boolean); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setRttCapabilitySetting(boolean); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiModeSetting(int); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiNonPersistent(boolean, int); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiRoamingModeSetting(int); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiRoamingSettingEnabled(boolean); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiSettingEnabled(boolean); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVtSettingEnabled(boolean); - method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterImsRegistrationCallback(@NonNull android.telephony.ims.ImsMmTelManager.RegistrationCallback); - } - - @Deprecated public static class ImsMmTelManager.RegistrationCallback extends android.telephony.ims.RegistrationManager.RegistrationCallback { - ctor @Deprecated public ImsMmTelManager.RegistrationCallback(); - } - - public class ImsService extends android.app.Service { - ctor public ImsService(); - method public android.telephony.ims.feature.MmTelFeature createMmTelFeature(int); - method public android.telephony.ims.feature.RcsFeature createRcsFeature(int); - method public void disableIms(int); - method public void enableIms(int); - method public android.telephony.ims.stub.ImsConfigImplBase getConfig(int); - method public android.telephony.ims.stub.ImsRegistrationImplBase getRegistration(int); - method public final void onUpdateSupportedImsFeatures(android.telephony.ims.stub.ImsFeatureConfiguration) throws android.os.RemoteException; - method public android.telephony.ims.stub.ImsFeatureConfiguration querySupportedImsFeatures(); - method public void readyForFeatureCreation(); - } - - public final class ImsSsData implements android.os.Parcelable { - ctor public ImsSsData(int, int, int, int, int); - method public int describeContents(); - method @Nullable public java.util.List<android.telephony.ims.ImsCallForwardInfo> getCallForwardInfo(); - method public int getRequestType(); - method public int getResult(); - method public int getServiceClass(); - method public int getServiceType(); - method @NonNull public java.util.List<android.telephony.ims.ImsSsInfo> getSuppServiceInfo(); - method public int getTeleserviceType(); - method public boolean isTypeBarring(); - method public boolean isTypeCf(); - method public boolean isTypeClip(); - method public boolean isTypeClir(); - method public boolean isTypeColp(); - method public boolean isTypeColr(); - method public boolean isTypeCw(); - method public boolean isTypeIcb(); - method public boolean isTypeInterrogation(); - method public boolean isTypeUnConditional(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsSsData> CREATOR; - field public static final int RESULT_SUCCESS = 0; // 0x0 - field public static final int SERVICE_CLASS_DATA = 2; // 0x2 - field public static final int SERVICE_CLASS_DATA_CIRCUIT_ASYNC = 32; // 0x20 - field public static final int SERVICE_CLASS_DATA_CIRCUIT_SYNC = 16; // 0x10 - field public static final int SERVICE_CLASS_DATA_PACKET_ACCESS = 64; // 0x40 - field public static final int SERVICE_CLASS_DATA_PAD = 128; // 0x80 - field public static final int SERVICE_CLASS_FAX = 4; // 0x4 - field public static final int SERVICE_CLASS_NONE = 0; // 0x0 - field public static final int SERVICE_CLASS_SMS = 8; // 0x8 - field public static final int SERVICE_CLASS_VOICE = 1; // 0x1 - field public static final int SS_ACTIVATION = 0; // 0x0 - field public static final int SS_ALL_BARRING = 18; // 0x12 - field public static final int SS_ALL_DATA_TELESERVICES = 3; // 0x3 - field public static final int SS_ALL_TELESERVICES_EXCEPT_SMS = 5; // 0x5 - field public static final int SS_ALL_TELESEVICES = 1; // 0x1 - field public static final int SS_ALL_TELE_AND_BEARER_SERVICES = 0; // 0x0 - field public static final int SS_BAIC = 16; // 0x10 - field public static final int SS_BAIC_ROAMING = 17; // 0x11 - field public static final int SS_BAOC = 13; // 0xd - field public static final int SS_BAOIC = 14; // 0xe - field public static final int SS_BAOIC_EXC_HOME = 15; // 0xf - field public static final int SS_CFU = 0; // 0x0 - field public static final int SS_CFUT = 6; // 0x6 - field public static final int SS_CF_ALL = 4; // 0x4 - field public static final int SS_CF_ALL_CONDITIONAL = 5; // 0x5 - field public static final int SS_CF_BUSY = 1; // 0x1 - field public static final int SS_CF_NOT_REACHABLE = 3; // 0x3 - field public static final int SS_CF_NO_REPLY = 2; // 0x2 - field public static final int SS_CLIP = 7; // 0x7 - field public static final int SS_CLIR = 8; // 0x8 - field public static final int SS_CNAP = 11; // 0xb - field public static final int SS_COLP = 9; // 0x9 - field public static final int SS_COLR = 10; // 0xa - field public static final int SS_DEACTIVATION = 1; // 0x1 - field public static final int SS_ERASURE = 4; // 0x4 - field public static final int SS_INCOMING_BARRING = 20; // 0x14 - field public static final int SS_INCOMING_BARRING_ANONYMOUS = 22; // 0x16 - field public static final int SS_INCOMING_BARRING_DN = 21; // 0x15 - field public static final int SS_INTERROGATION = 2; // 0x2 - field public static final int SS_OUTGOING_BARRING = 19; // 0x13 - field public static final int SS_REGISTRATION = 3; // 0x3 - field public static final int SS_SMS_SERVICES = 4; // 0x4 - field public static final int SS_TELEPHONY = 2; // 0x2 - field public static final int SS_WAIT = 12; // 0xc - } - - public static final class ImsSsData.Builder { - ctor public ImsSsData.Builder(int, int, int, int, int); - method @NonNull public android.telephony.ims.ImsSsData build(); - method @NonNull public android.telephony.ims.ImsSsData.Builder setCallForwardingInfo(@NonNull java.util.List<android.telephony.ims.ImsCallForwardInfo>); - method @NonNull public android.telephony.ims.ImsSsData.Builder setSuppServiceInfo(@NonNull java.util.List<android.telephony.ims.ImsSsInfo>); - } - - public final class ImsSsInfo implements android.os.Parcelable { - ctor @Deprecated public ImsSsInfo(int, @Nullable String); - method public int describeContents(); - method public int getClirInterrogationStatus(); - method public int getClirOutgoingState(); - method @Deprecated public String getIcbNum(); - method @Nullable public String getIncomingCommunicationBarringNumber(); - method public int getProvisionStatus(); - method public int getStatus(); - method public void writeToParcel(android.os.Parcel, int); - field public static final int CLIR_OUTGOING_DEFAULT = 0; // 0x0 - field public static final int CLIR_OUTGOING_INVOCATION = 1; // 0x1 - field public static final int CLIR_OUTGOING_SUPPRESSION = 2; // 0x2 - field public static final int CLIR_STATUS_NOT_PROVISIONED = 0; // 0x0 - field public static final int CLIR_STATUS_PROVISIONED_PERMANENT = 1; // 0x1 - field public static final int CLIR_STATUS_TEMPORARILY_ALLOWED = 4; // 0x4 - field public static final int CLIR_STATUS_TEMPORARILY_RESTRICTED = 3; // 0x3 - field public static final int CLIR_STATUS_UNKNOWN = 2; // 0x2 - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsSsInfo> CREATOR; - field public static final int DISABLED = 0; // 0x0 - field public static final int ENABLED = 1; // 0x1 - field public static final int NOT_REGISTERED = -1; // 0xffffffff - field public static final int SERVICE_NOT_PROVISIONED = 0; // 0x0 - field public static final int SERVICE_PROVISIONED = 1; // 0x1 - field public static final int SERVICE_PROVISIONING_UNKNOWN = -1; // 0xffffffff - } - - public static final class ImsSsInfo.Builder { - ctor public ImsSsInfo.Builder(int); - method @NonNull public android.telephony.ims.ImsSsInfo build(); - method @NonNull public android.telephony.ims.ImsSsInfo.Builder setClirInterrogationStatus(int); - method @NonNull public android.telephony.ims.ImsSsInfo.Builder setClirOutgoingState(int); - method @NonNull public android.telephony.ims.ImsSsInfo.Builder setIncomingCommunicationBarringNumber(@NonNull String); - method @NonNull public android.telephony.ims.ImsSsInfo.Builder setProvisionStatus(int); - } - - public final class ImsStreamMediaProfile implements android.os.Parcelable { - ctor public ImsStreamMediaProfile(int, int, int, int, int); - method public void copyFrom(android.telephony.ims.ImsStreamMediaProfile); - method public int describeContents(); - method public int getAudioDirection(); - method public int getAudioQuality(); - method public int getRttMode(); - method public int getVideoDirection(); - method public int getVideoQuality(); - method public boolean isReceivingRttAudio(); - method public boolean isRttCall(); - method public void setReceivingRttAudio(boolean); - method public void setRttMode(int); - method public void writeToParcel(android.os.Parcel, int); - field public static final int AUDIO_QUALITY_AMR = 1; // 0x1 - field public static final int AUDIO_QUALITY_AMR_WB = 2; // 0x2 - field public static final int AUDIO_QUALITY_EVRC = 4; // 0x4 - field public static final int AUDIO_QUALITY_EVRC_B = 5; // 0x5 - field public static final int AUDIO_QUALITY_EVRC_NW = 7; // 0x7 - field public static final int AUDIO_QUALITY_EVRC_WB = 6; // 0x6 - field public static final int AUDIO_QUALITY_EVS_FB = 20; // 0x14 - field public static final int AUDIO_QUALITY_EVS_NB = 17; // 0x11 - field public static final int AUDIO_QUALITY_EVS_SWB = 19; // 0x13 - field public static final int AUDIO_QUALITY_EVS_WB = 18; // 0x12 - field public static final int AUDIO_QUALITY_G711A = 13; // 0xd - field public static final int AUDIO_QUALITY_G711AB = 15; // 0xf - field public static final int AUDIO_QUALITY_G711U = 11; // 0xb - field public static final int AUDIO_QUALITY_G722 = 14; // 0xe - field public static final int AUDIO_QUALITY_G723 = 12; // 0xc - field public static final int AUDIO_QUALITY_G729 = 16; // 0x10 - field public static final int AUDIO_QUALITY_GSM_EFR = 8; // 0x8 - field public static final int AUDIO_QUALITY_GSM_FR = 9; // 0x9 - field public static final int AUDIO_QUALITY_GSM_HR = 10; // 0xa - field public static final int AUDIO_QUALITY_NONE = 0; // 0x0 - field public static final int AUDIO_QUALITY_QCELP13K = 3; // 0x3 - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsStreamMediaProfile> CREATOR; - field public static final int DIRECTION_INACTIVE = 0; // 0x0 - field public static final int DIRECTION_INVALID = -1; // 0xffffffff - field public static final int DIRECTION_RECEIVE = 1; // 0x1 - field public static final int DIRECTION_SEND = 2; // 0x2 - field public static final int DIRECTION_SEND_RECEIVE = 3; // 0x3 - field public static final int RTT_MODE_DISABLED = 0; // 0x0 - field public static final int RTT_MODE_FULL = 1; // 0x1 - field public static final int VIDEO_QUALITY_NONE = 0; // 0x0 - field public static final int VIDEO_QUALITY_QCIF = 1; // 0x1 - field public static final int VIDEO_QUALITY_QVGA_LANDSCAPE = 2; // 0x2 - field public static final int VIDEO_QUALITY_QVGA_PORTRAIT = 4; // 0x4 - field public static final int VIDEO_QUALITY_VGA_LANDSCAPE = 8; // 0x8 - field public static final int VIDEO_QUALITY_VGA_PORTRAIT = 16; // 0x10 - } - - public final class ImsSuppServiceNotification implements android.os.Parcelable { - ctor public ImsSuppServiceNotification(int, int, int, int, String, String[]); - method public int describeContents(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsSuppServiceNotification> CREATOR; - field public final int code; - field public final String[] history; - field public final int index; - field public final int notificationType; - field public final String number; - field public final int type; - } - - public class ImsUtListener { - method public void onLineIdentificationSupplementaryServiceResponse(int, @NonNull android.telephony.ims.ImsSsInfo); - method public void onSupplementaryServiceIndication(android.telephony.ims.ImsSsData); - method public void onUtConfigurationCallBarringQueried(int, android.telephony.ims.ImsSsInfo[]); - method public void onUtConfigurationCallForwardQueried(int, android.telephony.ims.ImsCallForwardInfo[]); - method public void onUtConfigurationCallWaitingQueried(int, android.telephony.ims.ImsSsInfo[]); - method @Deprecated public void onUtConfigurationQueried(int, android.os.Bundle); - method public void onUtConfigurationQueryFailed(int, android.telephony.ims.ImsReasonInfo); - method public void onUtConfigurationUpdateFailed(int, android.telephony.ims.ImsReasonInfo); - method public void onUtConfigurationUpdated(int); - field @Deprecated public static final String BUNDLE_KEY_CLIR = "queryClir"; - field @Deprecated public static final String BUNDLE_KEY_SSINFO = "imsSsInfo"; - } - - public abstract class ImsVideoCallProvider { - ctor public ImsVideoCallProvider(); - method public void changeCallDataUsage(long); - method public void changeCameraCapabilities(android.telecom.VideoProfile.CameraCapabilities); - method public void changePeerDimensions(int, int); - method public void changeVideoQuality(int); - method public void handleCallSessionEvent(int); - method public abstract void onRequestCallDataUsage(); - method public abstract void onRequestCameraCapabilities(); - method public abstract void onSendSessionModifyRequest(android.telecom.VideoProfile, android.telecom.VideoProfile); - method public abstract void onSendSessionModifyResponse(android.telecom.VideoProfile); - method public abstract void onSetCamera(String); - method public void onSetCamera(String, int); - method public abstract void onSetDeviceOrientation(int); - method public abstract void onSetDisplaySurface(android.view.Surface); - method public abstract void onSetPauseImage(android.net.Uri); - method public abstract void onSetPreviewSurface(android.view.Surface); - method public abstract void onSetZoom(float); - method public void receiveSessionModifyRequest(android.telecom.VideoProfile); - method public void receiveSessionModifyResponse(int, android.telecom.VideoProfile, android.telecom.VideoProfile); - } - - public class ProvisioningManager { - method @NonNull public static android.telephony.ims.ProvisioningManager createForSubscriptionId(int); - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public int getProvisioningIntValue(int); - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public boolean getProvisioningStatusForCapability(int, int); - method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public String getProvisioningStringValue(int); - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public boolean getRcsProvisioningStatusForCapability(int); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void notifyRcsAutoConfigurationReceived(@NonNull byte[], boolean); - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerProvisioningChangedCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ProvisioningManager.Callback) throws android.telephony.ims.ImsException; - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public int setProvisioningIntValue(int, int); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public void setProvisioningStatusForCapability(int, int, boolean); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public int setProvisioningStringValue(int, @NonNull String); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public void setRcsProvisioningStatusForCapability(int, boolean); - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterProvisioningChangedCallback(@NonNull android.telephony.ims.ProvisioningManager.Callback); - field public static final int KEY_VOICE_OVER_WIFI_ENTITLEMENT_ID = 67; // 0x43 - field public static final int KEY_VOICE_OVER_WIFI_MODE_OVERRIDE = 27; // 0x1b - field public static final int KEY_VOICE_OVER_WIFI_ROAMING_ENABLED_OVERRIDE = 26; // 0x1a - field public static final int PROVISIONING_VALUE_DISABLED = 0; // 0x0 - field public static final int PROVISIONING_VALUE_ENABLED = 1; // 0x1 - field public static final String STRING_QUERY_RESULT_ERROR_GENERIC = "STRING_QUERY_RESULT_ERROR_GENERIC"; - field public static final String STRING_QUERY_RESULT_ERROR_NOT_READY = "STRING_QUERY_RESULT_ERROR_NOT_READY"; - } - - public static class ProvisioningManager.Callback { - ctor public ProvisioningManager.Callback(); - method public void onProvisioningIntChanged(int, int); - method public void onProvisioningStringChanged(int, @NonNull String); - } - - public class RcsUceAdapter { - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUceSettingEnabled(boolean) throws android.telephony.ims.ImsException; } } package android.telephony.ims.feature { - public final class CapabilityChangeRequest implements android.os.Parcelable { - method public void addCapabilitiesToDisableForTech(int, int); - method public void addCapabilitiesToEnableForTech(int, int); - method public int describeContents(); - method public java.util.List<android.telephony.ims.feature.CapabilityChangeRequest.CapabilityPair> getCapabilitiesToDisable(); - method public java.util.List<android.telephony.ims.feature.CapabilityChangeRequest.CapabilityPair> getCapabilitiesToEnable(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.feature.CapabilityChangeRequest> CREATOR; - } - - public static class CapabilityChangeRequest.CapabilityPair { - ctor public CapabilityChangeRequest.CapabilityPair(int, int); - method public int getCapability(); - method public int getRadioTech(); - } - - public abstract class ImsFeature { - ctor public ImsFeature(); - method public abstract void changeEnabledCapabilities(android.telephony.ims.feature.CapabilityChangeRequest, android.telephony.ims.feature.ImsFeature.CapabilityCallbackProxy); - method public int getFeatureState(); - method public final int getSlotIndex(); - method public abstract void onFeatureReady(); - method public abstract void onFeatureRemoved(); - method public final void setFeatureState(int); - field public static final int CAPABILITY_ERROR_GENERIC = -1; // 0xffffffff - field public static final int CAPABILITY_SUCCESS = 0; // 0x0 - field public static final int FEATURE_EMERGENCY_MMTEL = 0; // 0x0 - field public static final int FEATURE_MMTEL = 1; // 0x1 - field public static final int FEATURE_RCS = 2; // 0x2 - field public static final int STATE_INITIALIZING = 1; // 0x1 - field public static final int STATE_READY = 2; // 0x2 - field public static final int STATE_UNAVAILABLE = 0; // 0x0 - } - @Deprecated public static class ImsFeature.Capabilities { field @Deprecated protected int mCapabilities; } - protected static class ImsFeature.CapabilityCallbackProxy { - method public void onChangeCapabilityConfigurationError(int, int, int); - } - - public class MmTelFeature extends android.telephony.ims.feature.ImsFeature { - ctor public MmTelFeature(); - method public void changeEnabledCapabilities(@NonNull android.telephony.ims.feature.CapabilityChangeRequest, @NonNull android.telephony.ims.feature.ImsFeature.CapabilityCallbackProxy); - method @Nullable public android.telephony.ims.ImsCallProfile createCallProfile(int, int); - method @Nullable public android.telephony.ims.stub.ImsCallSessionImplBase createCallSession(@NonNull android.telephony.ims.ImsCallProfile); - method @NonNull public android.telephony.ims.stub.ImsEcbmImplBase getEcbm(); - method @NonNull public android.telephony.ims.stub.ImsMultiEndpointImplBase getMultiEndpoint(); - method @NonNull public android.telephony.ims.stub.ImsSmsImplBase getSmsImplementation(); - method @NonNull public android.telephony.ims.stub.ImsUtImplBase getUt(); - method public final void notifyCapabilitiesStatusChanged(@NonNull android.telephony.ims.feature.MmTelFeature.MmTelCapabilities); - method public final void notifyIncomingCall(@NonNull android.telephony.ims.stub.ImsCallSessionImplBase, @NonNull android.os.Bundle); - method public final void notifyRejectedCall(@NonNull android.telephony.ims.ImsCallProfile, @NonNull android.telephony.ims.ImsReasonInfo); - method public final void notifyVoiceMessageCountUpdate(int); - method public void onFeatureReady(); - method public void onFeatureRemoved(); - method public boolean queryCapabilityConfiguration(int, int); - method @NonNull public final android.telephony.ims.feature.MmTelFeature.MmTelCapabilities queryCapabilityStatus(); - method public void setUiTtyMode(int, @Nullable android.os.Message); - method public int shouldProcessCall(@NonNull String[]); - field public static final String EXTRA_IS_UNKNOWN_CALL = "android.telephony.ims.feature.extra.IS_UNKNOWN_CALL"; - field public static final String EXTRA_IS_USSD = "android.telephony.ims.feature.extra.IS_USSD"; - field public static final int PROCESS_CALL_CSFB = 1; // 0x1 - field public static final int PROCESS_CALL_IMS = 0; // 0x0 - } - - public static class MmTelFeature.MmTelCapabilities extends android.telephony.ims.feature.ImsFeature.Capabilities { - ctor public MmTelFeature.MmTelCapabilities(); - ctor @Deprecated public MmTelFeature.MmTelCapabilities(android.telephony.ims.feature.ImsFeature.Capabilities); - ctor public MmTelFeature.MmTelCapabilities(int); - method public final void addCapabilities(int); - method public final void removeCapabilities(int); - } - - public class RcsFeature extends android.telephony.ims.feature.ImsFeature { - ctor public RcsFeature(); - method public void changeEnabledCapabilities(@NonNull android.telephony.ims.feature.CapabilityChangeRequest, @NonNull android.telephony.ims.feature.ImsFeature.CapabilityCallbackProxy); - method public void onFeatureReady(); - method public void onFeatureRemoved(); - } - -} - -package android.telephony.ims.stub { - - public class ImsCallSessionImplBase implements java.lang.AutoCloseable { - ctor public ImsCallSessionImplBase(); - method public void accept(int, android.telephony.ims.ImsStreamMediaProfile); - method public void close(); - method public void deflect(String); - method public void extendToConference(String[]); - method public String getCallId(); - method public android.telephony.ims.ImsCallProfile getCallProfile(); - method public android.telephony.ims.ImsVideoCallProvider getImsVideoCallProvider(); - method public android.telephony.ims.ImsCallProfile getLocalCallProfile(); - method public String getProperty(String); - method public android.telephony.ims.ImsCallProfile getRemoteCallProfile(); - method public int getState(); - method public void hold(android.telephony.ims.ImsStreamMediaProfile); - method public void inviteParticipants(String[]); - method public boolean isInCall(); - method public boolean isMultiparty(); - method public void merge(); - method public void reject(int); - method public void removeParticipants(String[]); - method public void resume(android.telephony.ims.ImsStreamMediaProfile); - method public void sendDtmf(char, android.os.Message); - method public void sendRttMessage(String); - method public void sendRttModifyRequest(android.telephony.ims.ImsCallProfile); - method public void sendRttModifyResponse(boolean); - method public void sendUssd(String); - method public void setListener(android.telephony.ims.ImsCallSessionListener); - method public void setMute(boolean); - method public void start(String, android.telephony.ims.ImsCallProfile); - method public void startConference(String[], android.telephony.ims.ImsCallProfile); - method public void startDtmf(char); - method public void stopDtmf(); - method public void terminate(int); - method public void update(int, android.telephony.ims.ImsStreamMediaProfile); - field public static final int USSD_MODE_NOTIFY = 0; // 0x0 - field public static final int USSD_MODE_REQUEST = 1; // 0x1 - } - - public static class ImsCallSessionImplBase.State { - method public static String toString(int); - field public static final int ESTABLISHED = 4; // 0x4 - field public static final int ESTABLISHING = 3; // 0x3 - field public static final int IDLE = 0; // 0x0 - field public static final int INITIATED = 1; // 0x1 - field public static final int INVALID = -1; // 0xffffffff - field public static final int NEGOTIATING = 2; // 0x2 - field public static final int REESTABLISHING = 6; // 0x6 - field public static final int RENEGOTIATING = 5; // 0x5 - field public static final int TERMINATED = 8; // 0x8 - field public static final int TERMINATING = 7; // 0x7 - } - - public class ImsConfigImplBase { - ctor public ImsConfigImplBase(); - method public int getConfigInt(int); - method public String getConfigString(int); - method public final void notifyProvisionedValueChanged(int, int); - method public final void notifyProvisionedValueChanged(int, String); - method public void notifyRcsAutoConfigurationReceived(@NonNull byte[], boolean); - method public int setConfig(int, int); - method public int setConfig(int, String); - field public static final int CONFIG_RESULT_FAILED = 1; // 0x1 - field public static final int CONFIG_RESULT_SUCCESS = 0; // 0x0 - field public static final int CONFIG_RESULT_UNKNOWN = -1; // 0xffffffff - } - - public class ImsEcbmImplBase { - ctor public ImsEcbmImplBase(); - method public final void enteredEcbm(); - method public void exitEmergencyCallbackMode(); - method public final void exitedEcbm(); - } - - public final class ImsFeatureConfiguration implements android.os.Parcelable { - method public int describeContents(); - method public java.util.Set<android.telephony.ims.stub.ImsFeatureConfiguration.FeatureSlotPair> getServiceFeatures(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.stub.ImsFeatureConfiguration> CREATOR; - } - - public static class ImsFeatureConfiguration.Builder { - ctor public ImsFeatureConfiguration.Builder(); - method public android.telephony.ims.stub.ImsFeatureConfiguration.Builder addFeature(int, int); - method public android.telephony.ims.stub.ImsFeatureConfiguration build(); - } - - public static final class ImsFeatureConfiguration.FeatureSlotPair { - ctor public ImsFeatureConfiguration.FeatureSlotPair(int, int); - field public final int featureType; - field public final int slotId; - } - - public class ImsMultiEndpointImplBase { - ctor public ImsMultiEndpointImplBase(); - method public final void onImsExternalCallStateUpdate(java.util.List<android.telephony.ims.ImsExternalCallState>); - method public void requestImsExternalCallStateInfo(); - } - - public class ImsRegistrationImplBase { - ctor public ImsRegistrationImplBase(); - method public final void onDeregistered(android.telephony.ims.ImsReasonInfo); - method public final void onRegistered(int); - method public final void onRegistering(int); - method public final void onSubscriberAssociatedUriChanged(android.net.Uri[]); - method public final void onTechnologyChangeFailed(int, android.telephony.ims.ImsReasonInfo); - field public static final int REGISTRATION_TECH_IWLAN = 1; // 0x1 - field public static final int REGISTRATION_TECH_LTE = 0; // 0x0 - field public static final int REGISTRATION_TECH_NONE = -1; // 0xffffffff - } - - public class ImsSmsImplBase { - ctor public ImsSmsImplBase(); - method public void acknowledgeSms(int, @IntRange(from=0, to=65535) int, int); - method public void acknowledgeSmsReport(int, @IntRange(from=0, to=65535) int, int); - method public String getSmsFormat(); - method public void onReady(); - method @Deprecated public final void onSendSmsResult(int, @IntRange(from=0, to=65535) int, int, int) throws java.lang.RuntimeException; - method public final void onSendSmsResultError(int, @IntRange(from=0, to=65535) int, int, int, int) throws java.lang.RuntimeException; - method public final void onSendSmsResultSuccess(int, @IntRange(from=0, to=65535) int) throws java.lang.RuntimeException; - method public final void onSmsReceived(int, String, byte[]) throws java.lang.RuntimeException; - method @Deprecated public final void onSmsStatusReportReceived(int, @IntRange(from=0, to=65535) int, String, byte[]) throws java.lang.RuntimeException; - method public final void onSmsStatusReportReceived(int, String, byte[]) throws java.lang.RuntimeException; - method public void sendSms(int, @IntRange(from=0, to=65535) int, String, String, boolean, byte[]); - field public static final int DELIVER_STATUS_ERROR_GENERIC = 2; // 0x2 - field public static final int DELIVER_STATUS_ERROR_NO_MEMORY = 3; // 0x3 - field public static final int DELIVER_STATUS_ERROR_REQUEST_NOT_SUPPORTED = 4; // 0x4 - field public static final int DELIVER_STATUS_OK = 1; // 0x1 - field public static final int RESULT_NO_NETWORK_ERROR = -1; // 0xffffffff - field public static final int SEND_STATUS_ERROR = 2; // 0x2 - field public static final int SEND_STATUS_ERROR_FALLBACK = 4; // 0x4 - field public static final int SEND_STATUS_ERROR_RETRY = 3; // 0x3 - field public static final int SEND_STATUS_OK = 1; // 0x1 - field public static final int STATUS_REPORT_STATUS_ERROR = 2; // 0x2 - field public static final int STATUS_REPORT_STATUS_OK = 1; // 0x1 - } - - public class ImsUtImplBase { - ctor public ImsUtImplBase(); - method public void close(); - method public int queryCallBarring(int); - method public int queryCallBarringForServiceClass(int, int); - method public int queryCallForward(int, String); - method public int queryCallWaiting(); - method public int queryClip(); - method public int queryClir(); - method public int queryColp(); - method public int queryColr(); - method public void setListener(android.telephony.ims.ImsUtListener); - method public int transact(android.os.Bundle); - method public int updateCallBarring(int, int, String[]); - method public int updateCallBarringForServiceClass(int, int, String[], int); - method public int updateCallForward(int, int, String, int, int); - method public int updateCallWaiting(boolean, int); - method public int updateClip(boolean); - method public int updateClir(int); - method public int updateColp(boolean); - method public int updateColr(int); - } - -} - -package android.telephony.mbms { - - public static class DownloadRequest.Builder { - method public android.telephony.mbms.DownloadRequest.Builder setServiceId(String); - } - - public final class FileInfo implements android.os.Parcelable { - ctor public FileInfo(android.net.Uri, String); - } - - public final class FileServiceInfo extends android.telephony.mbms.ServiceInfo implements android.os.Parcelable { - ctor public FileServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date, java.util.List<android.telephony.mbms.FileInfo>); - } - - public final class StreamingServiceInfo extends android.telephony.mbms.ServiceInfo implements android.os.Parcelable { - ctor public StreamingServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date); - } - - public final class UriPathPair implements android.os.Parcelable { - method public int describeContents(); - method public android.net.Uri getContentUri(); - method public android.net.Uri getFilePathUri(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.mbms.UriPathPair> CREATOR; - } - -} - -package android.telephony.mbms.vendor { - - public class MbmsDownloadServiceBase extends android.os.Binder implements android.os.IInterface { - ctor public MbmsDownloadServiceBase(); - method public int addProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener) throws android.os.RemoteException; - method public int addServiceAnnouncement(int, @NonNull byte[]); - method public int addStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener) throws android.os.RemoteException; - method public android.os.IBinder asBinder(); - method public int cancelDownload(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException; - method public void dispose(int) throws android.os.RemoteException; - method public int download(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException; - method public int initialize(int, android.telephony.mbms.MbmsDownloadSessionCallback) throws android.os.RemoteException; - method @NonNull public java.util.List<android.telephony.mbms.DownloadRequest> listPendingDownloads(int) throws android.os.RemoteException; - method public void onAppCallbackDied(int, int); - method public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException; - method public int removeProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener) throws android.os.RemoteException; - method public int removeStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener) throws android.os.RemoteException; - method public int requestDownloadState(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo) throws android.os.RemoteException; - method public int requestUpdateFileServices(int, java.util.List<java.lang.String>) throws android.os.RemoteException; - method public int resetDownloadKnowledge(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException; - method public int setTempFileRootDirectory(int, String) throws android.os.RemoteException; - } - - public class MbmsGroupCallServiceBase extends android.app.Service { - ctor public MbmsGroupCallServiceBase(); - method public void dispose(int) throws android.os.RemoteException; - method public int initialize(@NonNull android.telephony.mbms.MbmsGroupCallSessionCallback, int) throws android.os.RemoteException; - method public void onAppCallbackDied(int, int); - method public android.os.IBinder onBind(android.content.Intent); - method public int startGroupCall(int, long, @NonNull java.util.List<java.lang.Integer>, @NonNull java.util.List<java.lang.Integer>, @NonNull android.telephony.mbms.GroupCallCallback); - method public void stopGroupCall(int, long); - method public void updateGroupCall(int, long, @NonNull java.util.List<java.lang.Integer>, @NonNull java.util.List<java.lang.Integer>); - } - - public class MbmsStreamingServiceBase extends android.os.Binder implements android.os.IInterface { - ctor public MbmsStreamingServiceBase(); - method public android.os.IBinder asBinder(); - method public void dispose(int) throws android.os.RemoteException; - method @Nullable public android.net.Uri getPlaybackUri(int, String) throws android.os.RemoteException; - method public int initialize(android.telephony.mbms.MbmsStreamingSessionCallback, int) throws android.os.RemoteException; - method public void onAppCallbackDied(int, int); - method public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException; - method public int requestUpdateStreamingServices(int, java.util.List<java.lang.String>) throws android.os.RemoteException; - method public int startStreaming(int, String, android.telephony.mbms.StreamingServiceCallback) throws android.os.RemoteException; - method public void stopStreaming(int, String) throws android.os.RemoteException; - } - - public class VendorUtils { - ctor public VendorUtils(); - method public static android.content.ComponentName getAppReceiverFromPackageName(android.content.Context, String); - field public static final String ACTION_CLEANUP = "android.telephony.mbms.action.CLEANUP"; - field public static final String ACTION_DOWNLOAD_RESULT_INTERNAL = "android.telephony.mbms.action.DOWNLOAD_RESULT_INTERNAL"; - field public static final String ACTION_FILE_DESCRIPTOR_REQUEST = "android.telephony.mbms.action.FILE_DESCRIPTOR_REQUEST"; - field public static final String EXTRA_FD_COUNT = "android.telephony.mbms.extra.FD_COUNT"; - field public static final String EXTRA_FINAL_URI = "android.telephony.mbms.extra.FINAL_URI"; - field public static final String EXTRA_FREE_URI_LIST = "android.telephony.mbms.extra.FREE_URI_LIST"; - field public static final String EXTRA_PAUSED_LIST = "android.telephony.mbms.extra.PAUSED_LIST"; - field public static final String EXTRA_PAUSED_URI_LIST = "android.telephony.mbms.extra.PAUSED_URI_LIST"; - field public static final String EXTRA_SERVICE_ID = "android.telephony.mbms.extra.SERVICE_ID"; - field public static final String EXTRA_TEMP_FILES_IN_USE = "android.telephony.mbms.extra.TEMP_FILES_IN_USE"; - field public static final String EXTRA_TEMP_FILE_ROOT = "android.telephony.mbms.extra.TEMP_FILE_ROOT"; - field public static final String EXTRA_TEMP_LIST = "android.telephony.mbms.extra.TEMP_LIST"; - } - } package android.text { @@ -5396,10 +2058,7 @@ package android.view.accessibility { public final class AccessibilityManager { method public void addAccessibilityServicesStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener, @Nullable android.os.Handler); method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_ACCESSIBILITY) public java.util.List<java.lang.String> getAccessibilityShortcutTargets(int); - method @RequiresPermission(android.Manifest.permission.MANAGE_ACCESSIBILITY) public void performAccessibilityShortcut(); - method @RequiresPermission(android.Manifest.permission.MANAGE_ACCESSIBILITY) public void registerSystemAction(@NonNull android.app.RemoteAction, int); method public void removeAccessibilityServicesStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener); - method @RequiresPermission(android.Manifest.permission.MANAGE_ACCESSIBILITY) public void unregisterSystemAction(int); } public static interface AccessibilityManager.AccessibilityServicesStateChangeListener { @@ -5445,7 +2104,6 @@ package android.view.autofill { } public final class AutofillManager { - method public void setAugmentedAutofillWhitelist(@Nullable java.util.Set<java.lang.String>, @Nullable java.util.Set<android.content.ComponentName>); field public static final String DEVICE_CONFIG_AUTOFILL_SMART_SUGGESTION_SUPPORTED_MODES = "smart_suggestion_supported_modes"; field public static final int FLAG_SMART_SUGGESTION_OFF = 0; // 0x0 field public static final int FLAG_SMART_SUGGESTION_SYSTEM = 1; // 0x1 @@ -5456,42 +2114,7 @@ package android.view.autofill { package android.view.contentcapture { - public final class ContentCaptureContext implements android.os.Parcelable { - method @Nullable public android.content.ComponentName getActivityComponent(); - method public int getDisplayId(); - method public int getFlags(); - method @Nullable public android.view.contentcapture.ContentCaptureSessionId getParentSessionId(); - method public int getTaskId(); - field public static final int FLAG_DISABLED_BY_APP = 1; // 0x1 - field public static final int FLAG_DISABLED_BY_FLAG_SECURE = 2; // 0x2 - field public static final int FLAG_RECONNECTED = 4; // 0x4 - } - - public final class ContentCaptureEvent implements android.os.Parcelable { - method public int describeContents(); - method @Nullable public android.view.contentcapture.ContentCaptureContext getContentCaptureContext(); - method public long getEventTime(); - method @Nullable public android.view.autofill.AutofillId getId(); - method @Nullable public java.util.List<android.view.autofill.AutofillId> getIds(); - method @Nullable public android.graphics.Insets getInsets(); - method @Nullable public CharSequence getText(); - method public int getType(); - method @Nullable public android.view.contentcapture.ViewNode getViewNode(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.view.contentcapture.ContentCaptureEvent> CREATOR; - field public static final int TYPE_CONTEXT_UPDATED = 6; // 0x6 - field public static final int TYPE_SESSION_PAUSED = 8; // 0x8 - field public static final int TYPE_SESSION_RESUMED = 7; // 0x7 - field public static final int TYPE_VIEW_APPEARED = 1; // 0x1 - field public static final int TYPE_VIEW_DISAPPEARED = 2; // 0x2 - field public static final int TYPE_VIEW_INSETS_CHANGED = 9; // 0x9 - field public static final int TYPE_VIEW_TEXT_CHANGED = 3; // 0x3 - field public static final int TYPE_VIEW_TREE_APPEARED = 5; // 0x5 - field public static final int TYPE_VIEW_TREE_APPEARING = 4; // 0x4 - } - public final class ContentCaptureManager { - method public boolean isContentCaptureFeatureEnabled(); field public static final String DEVICE_CONFIG_PROPERTY_IDLE_FLUSH_FREQUENCY = "idle_flush_frequency"; field public static final String DEVICE_CONFIG_PROPERTY_LOGGING_LEVEL = "logging_level"; field public static final String DEVICE_CONFIG_PROPERTY_LOG_HISTORY_SIZE = "log_history_size"; @@ -5504,7 +2127,6 @@ package android.view.contentcapture { } public final class ViewNode extends android.app.assist.AssistStructure.ViewNode { - method @Nullable public android.view.autofill.AutofillId getParentAutofillId(); method @Nullable public static android.view.contentcapture.ViewNode readFromParcel(@NonNull android.os.Parcel); method public static void writeToParcel(@NonNull android.os.Parcel, @Nullable android.view.contentcapture.ViewNode, int); } @@ -5753,7 +2375,7 @@ package android.window { public class TaskOrganizer extends android.window.WindowOrganizer { ctor public TaskOrganizer(); - method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public android.app.ActivityManager.RunningTaskInfo createRootTask(int, int); + method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public android.window.TaskAppearedInfo createRootTask(int, int); method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public boolean deleteRootTask(@NonNull android.window.WindowContainerToken); method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public java.util.List<android.app.ActivityManager.RunningTaskInfo> getChildTasks(@NonNull android.window.WindowContainerToken, @NonNull int[]); method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public android.window.WindowContainerToken getImeTarget(int); diff --git a/api/test-removed.txt b/api/test-removed.txt index e47f6edfbff1..d802177e249b 100644 --- a/api/test-removed.txt +++ b/api/test-removed.txt @@ -1,10 +1 @@ // Signature format: 2.0 -package android.app.prediction { - - public static final class AppTarget.Builder { - method @Deprecated @NonNull public android.app.prediction.AppTarget.Builder setTarget(@NonNull String, @NonNull android.os.UserHandle); - method @Deprecated @NonNull public android.app.prediction.AppTarget.Builder setTarget(@NonNull android.content.pm.ShortcutInfo); - } - -} - diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index aeafccbcfa07..3d67e6574652 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -504,7 +504,7 @@ message Atom { } // Pulled events will start at field 10000. - // Next: 10090 + // Next: 10092 oneof pulled { WifiBytesTransfer wifi_bytes_transfer = 10000 [(module) = "framework"]; WifiBytesTransferByFgBg wifi_bytes_transfer_by_fg_bg = 10001 [(module) = "framework"]; @@ -607,6 +607,8 @@ message Atom { OutgoingSms outgoing_sms = 10087 [(module) = "telephony"]; CarrierIdMatchingTable carrier_id_table_version = 10088 [(module) = "telephony"]; DataCallSession data_call_session = 10089 [(module) = "telephony"]; + CellularServiceState cellular_service_state = 10090 [(module) = "telephony"]; + CellularDataServiceSwitch cellular_data_service_switch = 10091 [(module) = "telephony"]; } // DO NOT USE field numbers above 100,000 in AOSP. @@ -10398,7 +10400,7 @@ message VoiceCallSession { // Number of other calls going on during call termination, for the same SIM slot. optional int32 concurrent_call_count_at_end = 14; - // Index of the SIM is used, 0 for single-SIM devices. + // Index of the SIM used, 0 for single-SIM devices. optional int32 sim_slot_index = 15; // Whether the device was in multi-SIM mode (with multiple active SIM profiles). @@ -10450,7 +10452,7 @@ message VoiceCallRatUsage { // Radio access technology. optional android.telephony.NetworkTypeEnum rat = 2; - // Total duration that voice calls spent on this carrier and RAT. + // Total duration that voice calls spent on this carrier and RAT, rounded to 5 minute. optional int64 total_duration_seconds = 3; // Total number of calls using this carrier and RAT. @@ -10459,6 +10461,82 @@ message VoiceCallRatUsage { } /** + * Pulls amount of time spend in each cellular service state. + * + * Each pull creates multiple atoms, one for each SIM slot/carrier/RAT(including ENDC), the order of + * which is irrelevant to time. If multi SIM settings changes during the period, durations will be + * counted separately before and after the change. Airplane mode does not count towards durations. + * + * Pulled from: + * frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java + */ +message CellularServiceState { + // Radio access technology (RAT) for voice. + // NETWORK_TYPE_UNKNOWN when the device is out of service. + // NETWORK_TYPE_IWLAN when the device is using VoWiFi. + optional android.telephony.NetworkTypeEnum voice_rat = 1; + + // Radio access technology (RAT) for data. + // NETWORK_TYPE_UNKNOWN when the device is out of service. + // Only cellular RATs are valid and show where the device is camped. + optional android.telephony.NetworkTypeEnum data_rat = 2; + + // Whether the device was in roaming (domestic or international) for voice. + optional android.telephony.RoamingTypeEnum voice_roaming_type = 3; + + // Whether the device was in roaming (domestic or international) for data. + optional android.telephony.RoamingTypeEnum data_roaming_type = 4; + + // Whether the device is on LTE and has access to NR NSA, i.e. cell supports 5G (ENDC) and UE + // registration (attach/TAU) indicates ENDC is not restricted. + optional bool is_endc = 5; + + // Index of the SIM used, 0 for single-SIM devices. + optional int32 sim_slot_index = 6; + + // Whether the device was in multi-SIM mode (with multiple active SIM profiles). + optional bool is_multi_sim = 7; + + // Carrier ID of the SIM card. + // See https://source.android.com/devices/tech/config/carrierid. + optional int32 carrier_id = 8; + + // Total time spent in this service state, rounded to 5 minutes. + optional int32 total_time_seconds = 9; +} + +/** + * Pulls the number of times cellular data service state switches. + * + * Each pull creates multiple atoms, one for each RAT combination, the order of which is irrelevant + * to time. Switches for different SIM slots, carrier IDs, or multi-SIM settings are counted + * separately. + * + * Pulled from: + * frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java + */ +message CellularDataServiceSwitch { + // Cellular RAT of the DATA domain from where the switch occurred. + optional android.telephony.NetworkTypeEnum rat_from = 1; + + // Cellular RAT of the DATA domain to where the switch occurred. + optional android.telephony.NetworkTypeEnum rat_to = 2; + + // Index of the SIM used, 0 for single-SIM devices. + optional int32 sim_slot_index = 3; + + // Whether the device was in multi-SIM mode (with multiple active SIM profiles). + optional bool is_multi_sim = 4; + + // Carrier ID of the SIM card. + // See https://source.android.com/devices/tech/config/carrierid. + optional int32 carrier_id = 5; + + // Number of switches from rat_from to rat_to. + optional int32 switch_count = 6; +} + +/** * Pulls the number of active SIM slots and SIMs/eSIM profiles. * * Pulled from: @@ -10527,7 +10605,7 @@ message IncomingSms { // Whether the SMS was received while roaming. optional bool is_roaming = 9; - // Index of the SIM is used, 0 for single-SIM devices. + // Index of the SIM used, 0 for single-SIM devices. optional int32 sim_slot_index = 10; // Whether the device was in multi-SIM mode (with multiple active SIM profiles). @@ -10579,7 +10657,7 @@ message OutgoingSms { // Whether the default SMS application generated the SMS (regardless of which application). optional bool is_from_default_app = 7; - // Index of the SIM is used, 0 for single-SIM devices. + // Index of the SIM used, 0 for single-SIM devices. optional int32 sim_slot_index = 8; // Whether the device was in multi-SIM mode (with multiple active SIM profiles). diff --git a/config/boot-image-profile.txt b/config/boot-image-profile.txt index f43bd2bd61b9..01272c7966ac 100644 --- a/config/boot-image-profile.txt +++ b/config/boot-image-profile.txt @@ -47131,8 +47131,8 @@ Landroid/view/IRemoteAnimationRunner; Landroid/view/IRotationWatcher$Stub$Proxy; Landroid/view/IRotationWatcher$Stub; Landroid/view/IRotationWatcher; -Landroid/view/IScrollCaptureController$Stub; -Landroid/view/IScrollCaptureController; +Landroid/view/IScrollCaptureCallbacks$Stub; +Landroid/view/IScrollCaptureCallbacks; Landroid/view/ISystemGestureExclusionListener$Stub$Proxy; Landroid/view/ISystemGestureExclusionListener$Stub; Landroid/view/ISystemGestureExclusionListener; diff --git a/core/java/android/accessibilityservice/AccessibilityGestureEvent.java b/core/java/android/accessibilityservice/AccessibilityGestureEvent.java index e3139eb798f7..d4713cb611c3 100644 --- a/core/java/android/accessibilityservice/AccessibilityGestureEvent.java +++ b/core/java/android/accessibilityservice/AccessibilityGestureEvent.java @@ -46,6 +46,7 @@ import static android.accessibilityservice.AccessibilityService.GESTURE_4_FINGER import static android.accessibilityservice.AccessibilityService.GESTURE_4_FINGER_TRIPLE_TAP; import static android.accessibilityservice.AccessibilityService.GESTURE_DOUBLE_TAP; import static android.accessibilityservice.AccessibilityService.GESTURE_DOUBLE_TAP_AND_HOLD; +import static android.accessibilityservice.AccessibilityService.GESTURE_PASSTHROUGH; import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_DOWN; import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_DOWN_AND_LEFT; import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_DOWN_AND_RIGHT; @@ -62,15 +63,21 @@ import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_UP import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_UP_AND_DOWN; import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_UP_AND_LEFT; import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_UP_AND_RIGHT; +import static android.accessibilityservice.AccessibilityService.GESTURE_TOUCH_EXPLORATION; +import static android.accessibilityservice.AccessibilityService.GESTURE_UNKNOWN; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.TestApi; +import android.content.pm.ParceledListSlice; import android.os.Parcel; import android.os.Parcelable; +import android.view.MotionEvent; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.ArrayList; +import java.util.List; /** * This class describes the gesture event including gesture id and which display it happens @@ -87,6 +94,8 @@ public final class AccessibilityGestureEvent implements Parcelable { /** @hide */ @IntDef(prefix = { "GESTURE_" }, value = { + GESTURE_UNKNOWN, + GESTURE_TOUCH_EXPLORATION, GESTURE_2_FINGER_SINGLE_TAP, GESTURE_2_FINGER_SINGLE_TAP_AND_HOLD, GESTURE_2_FINGER_DOUBLE_TAP, @@ -139,17 +148,27 @@ public final class AccessibilityGestureEvent implements Parcelable { @GestureId private final int mGestureId; private final int mDisplayId; + private List<MotionEvent> mMotionEvents = new ArrayList<>(); /** @hide */ - @TestApi - public AccessibilityGestureEvent(int gestureId, int displayId) { + public AccessibilityGestureEvent( + int gestureId, int displayId, @NonNull List<MotionEvent> motionEvents) { mGestureId = gestureId; mDisplayId = displayId; + mMotionEvents.addAll(motionEvents); + } + + /** @hide */ + @TestApi + public AccessibilityGestureEvent(int gestureId, int displayId) { + this(gestureId, displayId, new ArrayList<MotionEvent>()); } private AccessibilityGestureEvent(@NonNull Parcel parcel) { mGestureId = parcel.readInt(); mDisplayId = parcel.readInt(); + ParceledListSlice<MotionEvent> slice = parcel.readParcelable(getClass().getClassLoader()); + mMotionEvents = slice.getList(); } /** @@ -172,6 +191,15 @@ public final class AccessibilityGestureEvent implements Parcelable { return mGestureId; } + /** + * Returns the motion events that lead to this gesture. + * + */ + @NonNull + public List<MotionEvent> getMotionEvents() { + return mMotionEvents; + } + @NonNull @Override public String toString() { @@ -179,12 +207,26 @@ public final class AccessibilityGestureEvent implements Parcelable { stringBuilder.append("gestureId: ").append(eventTypeToString(mGestureId)); stringBuilder.append(", "); stringBuilder.append("displayId: ").append(mDisplayId); + stringBuilder.append(", "); + stringBuilder.append("Motion Events: ["); + for (int i = 0; i < mMotionEvents.size(); ++i) { + String action = MotionEvent.actionToString(mMotionEvents.get(i).getActionMasked()); + stringBuilder.append(action); + if (i < (mMotionEvents.size() - 1)) { + stringBuilder.append(", "); + } else { + stringBuilder.append("]"); + } + } stringBuilder.append(']'); return stringBuilder.toString(); } private static String eventTypeToString(int eventType) { switch (eventType) { + case GESTURE_UNKNOWN: return "GESTURE_UNKNOWN"; + case GESTURE_PASSTHROUGH: return "GESTURE_PASSTHROUGH"; + case GESTURE_TOUCH_EXPLORATION: return "GESTURE_TOUCH_EXPLORATION"; case GESTURE_2_FINGER_SINGLE_TAP: return "GESTURE_2_FINGER_SINGLE_TAP"; case GESTURE_2_FINGER_SINGLE_TAP_AND_HOLD: return "GESTURE_2_FINGER_SINGLE_TAP_AND_HOLD"; @@ -252,6 +294,7 @@ public final class AccessibilityGestureEvent implements Parcelable { public void writeToParcel(@NonNull Parcel parcel, int flags) { parcel.writeInt(mGestureId); parcel.writeInt(mDisplayId); + parcel.writeParcelable(new ParceledListSlice<MotionEvent>(mMotionEvents), 0); } /** diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index 7c6d4484ee12..0ad9e446dfc7 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -235,6 +235,29 @@ import java.util.function.Consumer; public abstract class AccessibilityService extends Service { /** + * The user has performed a touch-exploration gesture on the touch screen without ever + * triggering gesture detection. This gesture is only dispatched when {@link + * AccessibilityServiceInfo#FLAG_SEND_MOTION_EVENTS} is set. + * + * @hide + */ + public static final int GESTURE_TOUCH_EXPLORATION = -2; + + /** + * The user has performed a passthrough gesture on the touch screen without ever triggering + * gesture detection. This gesture is only dispatched when {@link + * AccessibilityServiceInfo#FLAG_SEND_MOTION_EVENTS} is set. + * @hide + */ + public static final int GESTURE_PASSTHROUGH = -1; + + /** + * The user has performed an unrecognized gesture on the touch screen. This gesture is only + * dispatched when {@link AccessibilityServiceInfo#FLAG_SEND_MOTION_EVENTS} is set. + */ + public static final int GESTURE_UNKNOWN = 0; + + /** * The user has performed a swipe up gesture on the touch screen. */ public static final int GESTURE_SWIPE_UP = 1; diff --git a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java index 769d006cb2b6..f953da48c217 100644 --- a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java +++ b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java @@ -376,6 +376,20 @@ public class AccessibilityServiceInfo implements Parcelable { */ public static final int FLAG_REQUEST_2_FINGER_PASSTHROUGH = 0x0002000; + /** + * This flag requests that when when {@link #FLAG_REQUEST_TOUCH_EXPLORATION_MODE} is enabled, a + * service will receive the motion events for each successfully-detected gesture. The service + * will also receive an AccessibilityGestureEvent of type GESTURE_INVALID for each cancelled + * gesture along with its motion events. A service will receive a gesture of type + * GESTURE_PASSTHROUGH and accompanying motion events for every passthrough gesture that does + * not start gesture detection. This information can be used to collect instances of improper + * gesture detection behavior and relay that information to framework developers. If {@link + * #FLAG_REQUEST_TOUCH_EXPLORATION_MODE} is disabled this flag has no effect. + * + * @see #FLAG_REQUEST_TOUCH_EXPLORATION_MODE + */ + public static final int FLAG_SEND_MOTION_EVENTS = 0x0004000; + /** {@hide} */ public static final int FLAG_FORCE_DIRECT_BOOT_AWARE = 0x00010000; @@ -1276,6 +1290,8 @@ public class AccessibilityServiceInfo implements Parcelable { return "FLAG_REQUEST_MULTI_FINGER_GESTURES"; case FLAG_REQUEST_2_FINGER_PASSTHROUGH: return "FLAG_REQUEST_2_FINGER_PASSTHROUGH"; + case FLAG_SEND_MOTION_EVENTS: + return "FLAG_SEND_MOTION_EVENTS"; case FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY: return "FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY"; case FLAG_REPORT_VIEW_IDS: diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index cb98093a1a24..250f2f0b2dc9 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -3608,7 +3608,7 @@ public class ActivityManager { * running its code, {@link RunningAppProcessInfo#IMPORTANCE_GONE} is returned. * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS) public @RunningAppProcessInfo.Importance int getPackageImportance(String packageName) { try { @@ -3628,7 +3628,7 @@ public class ActivityManager { * running its code, {@link RunningAppProcessInfo#IMPORTANCE_GONE} is returned. * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS) public @RunningAppProcessInfo.Importance int getUidImportance(int uid) { try { @@ -3645,7 +3645,7 @@ public class ActivityManager { * {@link #addOnUidImportanceListener}. * @hide */ - @SystemApi @TestApi + @SystemApi public interface OnUidImportanceListener { /** * The importance if a given uid has changed. Will be one of the importance @@ -3676,7 +3676,7 @@ public class ActivityManager { * {@link android.Manifest.permission#PACKAGE_USAGE_STATS}. * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS) public void addOnUidImportanceListener(OnUidImportanceListener listener, @RunningAppProcessInfo.Importance int importanceCutpoint) { @@ -3705,7 +3705,7 @@ public class ActivityManager { * @throws IllegalArgumentException If the listener is not registered. * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS) public void removeOnUidImportanceListener(OnUidImportanceListener listener) { synchronized (this) { @@ -3847,7 +3847,7 @@ public class ActivityManager { * @see #forceStopPackageAsUser(String, int) * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.FORCE_STOP_PACKAGES) public void forceStopPackage(String packageName) { forceStopPackageAsUser(packageName, mContext.getUserId()); @@ -4186,7 +4186,6 @@ public class ActivityManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean switchUser(@NonNull UserHandle user) { if (user == null) { @@ -4619,7 +4618,7 @@ public class ActivityManager { * * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.FORCE_STOP_PACKAGES) public void killProcessesWhenImperceptible(@NonNull int[] pids, @NonNull String reason) { try { diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index c5bc3564ceab..f3b37891876d 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -461,7 +461,6 @@ public class AppOpsManager { * state the more important the UID is for the user. * @hide */ - @TestApi @SystemApi public static final int UID_STATE_PERSISTENT = 100; @@ -470,7 +469,6 @@ public class AppOpsManager { * state the more important the UID is for the user. * @hide */ - @TestApi @SystemApi public static final int UID_STATE_TOP = 200; @@ -482,7 +480,6 @@ public class AppOpsManager { * @hide * @deprecated */ - @TestApi @SystemApi @Deprecated public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 300; @@ -492,7 +489,6 @@ public class AppOpsManager { * state the more important the UID is for the user. * @hide */ - @TestApi @SystemApi public static final int UID_STATE_FOREGROUND_SERVICE = 400; @@ -501,7 +497,6 @@ public class AppOpsManager { * state the more important the UID is for the user. * @hide */ - @TestApi @SystemApi public static final int UID_STATE_FOREGROUND = 500; @@ -517,7 +512,6 @@ public class AppOpsManager { * state the more important the UID is for the user. * @hide */ - @TestApi @SystemApi public static final int UID_STATE_BACKGROUND = 600; @@ -526,7 +520,6 @@ public class AppOpsManager { * state the more important the UID is for the user. * @hide */ - @TestApi @SystemApi public static final int UID_STATE_CACHED = 700; @@ -604,7 +597,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi public static final int OP_FLAG_SELF = 0x1; @@ -615,7 +607,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi public static final int OP_FLAG_TRUSTED_PROXY = 0x2; @@ -626,7 +617,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi public static final int OP_FLAG_UNTRUSTED_PROXY = 0x4; @@ -637,7 +627,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi public static final int OP_FLAG_TRUSTED_PROXIED = 0x8; @@ -648,7 +637,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi public static final int OP_FLAG_UNTRUSTED_PROXIED = 0x10; @@ -660,7 +648,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi public static final int OP_FLAGS_ALL = OP_FLAG_SELF @@ -1185,7 +1172,7 @@ public class AppOpsManager { public static final String OPSTR_GET_USAGE_STATS = "android:get_usage_stats"; /** Activate a VPN connection without user intervention. @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_ACTIVATE_VPN = "android:activate_vpn"; /** Allows an application to read the user's contacts data. */ @@ -1267,7 +1254,7 @@ public class AppOpsManager { public static final String OPSTR_WRITE_SETTINGS = "android:write_settings"; /** @hide Get device accounts. */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_GET_ACCOUNTS = "android:get_accounts"; public static final String OPSTR_READ_PHONE_NUMBERS @@ -1276,7 +1263,7 @@ public class AppOpsManager { public static final String OPSTR_PICTURE_IN_PICTURE = "android:picture_in_picture"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_INSTANT_APP_START_FOREGROUND = "android:instant_app_start_foreground"; /** Answer incoming phone calls */ @@ -1286,129 +1273,129 @@ public class AppOpsManager { * Accept call handover * @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_ACCEPT_HANDOVER = "android:accept_handover"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_GPS = "android:gps"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_VIBRATE = "android:vibrate"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_WIFI_SCAN = "android:wifi_scan"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_POST_NOTIFICATION = "android:post_notification"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_NEIGHBORING_CELLS = "android:neighboring_cells"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_WRITE_SMS = "android:write_sms"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_RECEIVE_EMERGENCY_BROADCAST = "android:receive_emergency_broadcast"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_READ_ICC_SMS = "android:read_icc_sms"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_WRITE_ICC_SMS = "android:write_icc_sms"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_ACCESS_NOTIFICATIONS = "android:access_notifications"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_PLAY_AUDIO = "android:play_audio"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_READ_CLIPBOARD = "android:read_clipboard"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_WRITE_CLIPBOARD = "android:write_clipboard"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_TAKE_MEDIA_BUTTONS = "android:take_media_buttons"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_TAKE_AUDIO_FOCUS = "android:take_audio_focus"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_AUDIO_MASTER_VOLUME = "android:audio_master_volume"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_AUDIO_VOICE_VOLUME = "android:audio_voice_volume"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_AUDIO_RING_VOLUME = "android:audio_ring_volume"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_AUDIO_MEDIA_VOLUME = "android:audio_media_volume"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_AUDIO_ALARM_VOLUME = "android:audio_alarm_volume"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_AUDIO_NOTIFICATION_VOLUME = "android:audio_notification_volume"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_AUDIO_BLUETOOTH_VOLUME = "android:audio_bluetooth_volume"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_WAKE_LOCK = "android:wake_lock"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_MUTE_MICROPHONE = "android:mute_microphone"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_TOAST_WINDOW = "android:toast_window"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_PROJECT_MEDIA = "android:project_media"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_WRITE_WALLPAPER = "android:write_wallpaper"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_ASSIST_STRUCTURE = "android:assist_structure"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_ASSIST_SCREENSHOT = "android:assist_screenshot"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_TURN_SCREEN_ON = "android:turn_screen_on"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_RUN_IN_BACKGROUND = "android:run_in_background"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_AUDIO_ACCESSIBILITY_VOLUME = "android:audio_accessibility_volume"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_REQUEST_INSTALL_PACKAGES = "android:request_install_packages"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_RUN_ANY_IN_BACKGROUND = "android:run_any_in_background"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_CHANGE_WIFI_STATE = "android:change_wifi_state"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_REQUEST_DELETE_PACKAGES = "android:request_delete_packages"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_BIND_ACCESSIBILITY_SERVICE = "android:bind_accessibility_service"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_MANAGE_IPSEC_TUNNELS = "android:manage_ipsec_tunnels"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_START_FOREGROUND = "android:start_foreground"; /** @hide */ public static final String OPSTR_BLUETOOTH_SCAN = "android:bluetooth_scan"; @@ -1424,25 +1411,25 @@ public class AppOpsManager { "android:sms_financial_transactions"; /** @hide Read media of audio type. */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_READ_MEDIA_AUDIO = "android:read_media_audio"; /** @hide Write media of audio type. */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_WRITE_MEDIA_AUDIO = "android:write_media_audio"; /** @hide Read media of video type. */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_READ_MEDIA_VIDEO = "android:read_media_video"; /** @hide Write media of video type. */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_WRITE_MEDIA_VIDEO = "android:write_media_video"; /** @hide Read media of image type. */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_READ_MEDIA_IMAGES = "android:read_media_images"; /** @hide Write media of image type. */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_WRITE_MEDIA_IMAGES = "android:write_media_images"; /** @hide Has a legacy (non-isolated) view of storage. */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_LEGACY_STORAGE = "android:legacy_storage"; /** @hide Read location metadata from media */ public static final String OPSTR_ACCESS_MEDIA_LOCATION = "android:access_media_location"; @@ -1456,7 +1443,6 @@ public class AppOpsManager { public static final String OPSTR_QUERY_ALL_PACKAGES = "android:query_all_packages"; /** @hide Access all external storage */ @SystemApi - @TestApi public static final String OPSTR_MANAGE_EXTERNAL_STORAGE = "android:manage_external_storage"; @@ -2683,7 +2669,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi public static int opToDefaultMode(@NonNull String appOp) { return opToDefaultMode(strOpToOp(appOp)); @@ -2775,7 +2760,6 @@ public class AppOpsManager { * Class holding all of the operation information associated with an app. * @hide */ - @TestApi @SystemApi public static final class PackageOps implements Parcelable { private final String mPackageName; @@ -2854,7 +2838,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi // @DataClass(genHiddenConstructor = true, genHiddenCopyConstructor = true) // genHiddenCopyConstructor does not work for @hide @SystemApi classes @@ -3222,7 +3205,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi @Immutable // @DataClass(genHiddenConstructor = true) codegen verifier is broken @@ -3796,7 +3778,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @Immutable @SystemApi // @DataClass(genHiddenConstructor = true) codegen verifier is broken @@ -4474,7 +4455,6 @@ public class AppOpsManager { * @hide */ @Immutable - @TestApi @SystemApi public static final class HistoricalOpsRequest { private final int mUid; @@ -4505,7 +4485,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi public static final class Builder { private int mUid = Process.INVALID_UID; @@ -4643,7 +4622,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi public static final class HistoricalOps implements Parcelable { private long mBeginTimeMillis; @@ -5079,7 +5057,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi public static final class HistoricalUidOps implements Parcelable { private final int mUid; @@ -5333,7 +5310,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi public static final class HistoricalPackageOps implements Parcelable { private final @NonNull String mPackageName; @@ -5664,7 +5640,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi /* codegen verifier cannot deal with nested class parameters @DataClass(genHiddenConstructor = true, @@ -5975,7 +5950,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi public static final class HistoricalOp implements Parcelable { private final int mOp; @@ -6612,7 +6586,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public @NonNull List<AppOpsManager.PackageOps> getOpsForPackage(int uid, @@ -6647,7 +6620,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public void getHistoricalOps(@NonNull HistoricalOpsRequest request, @@ -6756,7 +6728,6 @@ public class AppOpsManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.MANAGE_APP_OPS_MODES) public void setUidMode(@NonNull String appOp, int uid, @Mode int mode) { try { @@ -6810,7 +6781,6 @@ public class AppOpsManager { * be changed. * @hide */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.MANAGE_APP_OPS_MODES) public void setMode(@NonNull String op, int uid, @Nullable String packageName, @@ -8773,7 +8743,6 @@ public class AppOpsManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.GET_APP_OPS_STATS) public @Nullable RuntimeAppOpAccessMessage collectRuntimeAppOpAccessMessage() { try { @@ -8788,7 +8757,6 @@ public class AppOpsManager { * @hide */ @SystemApi - @TestApi public static String[] getOpStrs() { return Arrays.copyOf(sOpToString, sOpToString.length); } diff --git a/core/java/android/app/NotificationChannel.java b/core/java/android/app/NotificationChannel.java index 1bfdaf57e7f4..f0e457e9691a 100644 --- a/core/java/android/app/NotificationChannel.java +++ b/core/java/android/app/NotificationChannel.java @@ -134,7 +134,6 @@ public final class NotificationChannel implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int USER_LOCKED_SOUND = 0x00000020; /** @@ -391,7 +390,6 @@ public final class NotificationChannel implements Parcelable { * @hide */ @SystemApi - @TestApi public void setBlockable(boolean blockable) { mBlockableSystem = blockable; } diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index aefaf781eb35..f3bd04cd132e 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -1430,7 +1430,6 @@ public class NotificationManager { * @hide */ @SystemApi - @TestApi public boolean isNotificationAssistantAccessGranted(@NonNull ComponentName assistant) { INotificationManager service = getService(); try { @@ -1466,7 +1465,6 @@ public class NotificationManager { * @hide */ @SystemApi - @TestApi public @NonNull @Adjustment.Keys List<String> getAllowedAssistantAdjustments() { INotificationManager service = getService(); try { @@ -1577,7 +1575,6 @@ public class NotificationManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.MANAGE_NOTIFICATION_LISTENERS) public void setNotificationListenerAccessGranted( @NonNull ComponentName listener, boolean granted) { @@ -1611,7 +1608,6 @@ public class NotificationManager { * @hide */ @SystemApi - @TestApi public void setNotificationAssistantAccessGranted(@Nullable ComponentName assistant, boolean granted) { INotificationManager service = getService(); @@ -1631,7 +1627,6 @@ public class NotificationManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.MANAGE_NOTIFICATION_LISTENERS) public @NonNull List<ComponentName> getEnabledNotificationListeners() { return getEnabledNotificationListeners(mContext.getUserId()); @@ -1649,7 +1644,6 @@ public class NotificationManager { /** @hide */ @SystemApi - @TestApi public @Nullable ComponentName getAllowedNotificationAssistant() { INotificationManager service = getService(); try { diff --git a/core/java/android/app/RuntimeAppOpAccessMessage.java b/core/java/android/app/RuntimeAppOpAccessMessage.java index a19f815c4298..db3ba4a8cc3f 100644 --- a/core/java/android/app/RuntimeAppOpAccessMessage.java +++ b/core/java/android/app/RuntimeAppOpAccessMessage.java @@ -20,7 +20,6 @@ import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -32,7 +31,6 @@ import com.android.internal.util.DataClass; * @hide */ @Immutable -@TestApi @SystemApi /*@DataClass(genConstructor = false) @DataClass.Suppress("getOpCode")*/ diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java index 99d21272236d..864db2722d53 100644 --- a/core/java/android/app/StatusBarManager.java +++ b/core/java/android/app/StatusBarManager.java @@ -374,7 +374,6 @@ public class StatusBarManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void setDisabledForSetup(boolean disabled) { try { @@ -423,7 +422,6 @@ public class StatusBarManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.STATUS_BAR) @NonNull public DisableInfo getDisableInfo() { @@ -456,7 +454,6 @@ public class StatusBarManager { * @hide */ @SystemApi - @TestApi public static final class DisableInfo { private boolean mStatusBarExpansion; @@ -489,7 +486,6 @@ public class StatusBarManager { * @hide */ @SystemApi - @TestApi public boolean isStatusBarExpansionDisabled() { return mStatusBarExpansion; } @@ -505,7 +501,6 @@ public class StatusBarManager { * @hide */ @SystemApi - @TestApi public boolean isNavigateToHomeDisabled() { return mNavigateHome; } @@ -521,7 +516,6 @@ public class StatusBarManager { * @hide */ @SystemApi - @TestApi public boolean isNotificationPeekingDisabled() { return mNotificationPeeking; } @@ -537,7 +531,6 @@ public class StatusBarManager { * @hide */ @SystemApi - @TestApi public boolean isRecentsDisabled() { return mRecents; } @@ -553,7 +546,6 @@ public class StatusBarManager { * @hide */ @SystemApi - @TestApi public boolean isSearchDisabled() { return mSearch; } @@ -611,7 +603,6 @@ public class StatusBarManager { * @hide */ @SystemApi - @TestApi public boolean areAllComponentsEnabled() { return !mStatusBarExpansion && !mNavigateHome && !mNotificationPeeking && !mRecents && !mSearch && !mSystemIcons && !mClock && !mNotificationIcons; diff --git a/core/java/android/app/UiModeManager.java b/core/java/android/app/UiModeManager.java index 06d1b74abc86..e2fc5dbf10e2 100644 --- a/core/java/android/app/UiModeManager.java +++ b/core/java/android/app/UiModeManager.java @@ -314,7 +314,6 @@ public class UiModeManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.ENTER_CAR_MODE_PRIORITIZED) public void enableCarMode(@IntRange(from = 0) int priority, @EnableCarMode int flags) { if (mService != null) { diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java index 0a80ccc13487..54f3209e17be 100644 --- a/core/java/android/app/WallpaperManager.java +++ b/core/java/android/app/WallpaperManager.java @@ -1766,7 +1766,6 @@ public class WallpaperManager { * * @hide */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.SET_WALLPAPER_COMPONENT) public boolean setWallpaperComponent(ComponentName name) { diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index b74e18b099ce..ad902a028f13 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -1465,7 +1465,7 @@ public class DevicePolicyManager { * @see #createAdminSupportIntent(String) * @hide */ - @TestApi @SystemApi + @SystemApi public static final String EXTRA_RESTRICTION = "android.app.extra.RESTRICTION"; /** @@ -2688,13 +2688,11 @@ public class DevicePolicyManager { * </ul> */ @SystemApi - @TestApi public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_ALLOWED"; /** @hide See {@link #ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED} */ @SystemApi - @TestApi public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_DISALLOWED"; @@ -6671,7 +6669,6 @@ public class DevicePolicyManager { * @hide */ @SystemApi - @TestApi @SuppressLint("Doclava125") public boolean isDeviceManaged() { try { @@ -10381,7 +10378,6 @@ public class DevicePolicyManager { * @hide */ @SystemApi - @TestApi @SuppressLint("Doclava125") public @Nullable CharSequence getDeviceOwnerOrganizationName() { try { diff --git a/core/java/android/app/assist/AssistStructure.java b/core/java/android/app/assist/AssistStructure.java index b5234f8e2e17..c15504cc0843 100644 --- a/core/java/android/app/assist/AssistStructure.java +++ b/core/java/android/app/assist/AssistStructure.java @@ -3,7 +3,6 @@ package android.app.assist; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Activity; import android.content.ComponentName; import android.content.Context; @@ -722,7 +721,6 @@ public class AssistStructure implements Parcelable { // COntent Capture. /** @hide */ @SystemApi - @TestApi public ViewNode() { } diff --git a/core/java/android/app/backup/BackupManager.java b/core/java/android/app/backup/BackupManager.java index 9b67587c4dcd..05313592faa5 100644 --- a/core/java/android/app/backup/BackupManager.java +++ b/core/java/android/app/backup/BackupManager.java @@ -21,7 +21,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.content.ComponentName; import android.content.Context; @@ -919,7 +918,6 @@ public class BackupManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.BACKUP) public Intent getConfigurationIntent(String transportName) { checkServiceBinder(); @@ -941,7 +939,6 @@ public class BackupManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.BACKUP) public String getDestinationString(String transportName) { checkServiceBinder(); @@ -963,7 +960,6 @@ public class BackupManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.BACKUP) public Intent getDataManagementIntent(String transportName) { checkServiceBinder(); @@ -989,7 +985,6 @@ public class BackupManager { */ @Deprecated @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.BACKUP) @Nullable public String getDataManagementLabel(@NonNull String transportName) { @@ -1006,7 +1001,6 @@ public class BackupManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.BACKUP) @Nullable public CharSequence getDataManagementIntentLabel(@NonNull String transportName) { diff --git a/core/java/android/app/prediction/AppPredictionContext.java b/core/java/android/app/prediction/AppPredictionContext.java index d14238bb2672..99fa869cee93 100644 --- a/core/java/android/app/prediction/AppPredictionContext.java +++ b/core/java/android/app/prediction/AppPredictionContext.java @@ -19,7 +19,6 @@ import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.Context; import android.os.Bundle; import android.os.Parcel; @@ -32,7 +31,6 @@ import android.os.Parcelable; * @hide */ @SystemApi -@TestApi public final class AppPredictionContext implements Parcelable { private final int mPredictedTargetCount; @@ -129,7 +127,6 @@ public final class AppPredictionContext implements Parcelable { * @hide */ @SystemApi - @TestApi public static final class Builder { @NonNull @@ -147,7 +144,6 @@ public final class AppPredictionContext implements Parcelable { * @hide */ @SystemApi - @TestApi public Builder(@NonNull Context context) { mPackageName = context.getPackageName(); } diff --git a/core/java/android/app/prediction/AppPredictionManager.java b/core/java/android/app/prediction/AppPredictionManager.java index ca22721622b7..5da7aa97ea0f 100644 --- a/core/java/android/app/prediction/AppPredictionManager.java +++ b/core/java/android/app/prediction/AppPredictionManager.java @@ -17,7 +17,6 @@ package android.app.prediction; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.Context; import java.util.Objects; @@ -28,7 +27,6 @@ import java.util.Objects; * @hide */ @SystemApi -@TestApi public final class AppPredictionManager { private final Context mContext; diff --git a/core/java/android/app/prediction/AppPredictionSessionId.java b/core/java/android/app/prediction/AppPredictionSessionId.java index 876bafdfb7d1..6277a7de258f 100644 --- a/core/java/android/app/prediction/AppPredictionSessionId.java +++ b/core/java/android/app/prediction/AppPredictionSessionId.java @@ -18,7 +18,6 @@ package android.app.prediction; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -30,7 +29,6 @@ import java.util.Objects; * @hide */ @SystemApi -@TestApi public final class AppPredictionSessionId implements Parcelable { private final String mId; diff --git a/core/java/android/app/prediction/AppPredictor.java b/core/java/android/app/prediction/AppPredictor.java index fa135b10ae1f..fd1b9e3bede2 100644 --- a/core/java/android/app/prediction/AppPredictor.java +++ b/core/java/android/app/prediction/AppPredictor.java @@ -70,7 +70,6 @@ import java.util.function.Consumer; * @hide */ @SystemApi -@TestApi public final class AppPredictor { private static final String TAG = AppPredictor.class.getSimpleName(); diff --git a/core/java/android/app/prediction/AppTarget.java b/core/java/android/app/prediction/AppTarget.java index 14e32b8397a8..fef9e7020097 100644 --- a/core/java/android/app/prediction/AppTarget.java +++ b/core/java/android/app/prediction/AppTarget.java @@ -19,7 +19,6 @@ import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.pm.ShortcutInfo; import android.os.Parcel; import android.os.Parcelable; @@ -33,7 +32,6 @@ import java.util.Objects; * @hide */ @SystemApi -@TestApi public final class AppTarget implements Parcelable { private final AppTargetId mId; @@ -190,7 +188,6 @@ public final class AppTarget implements Parcelable { * @hide */ @SystemApi - @TestApi public static final class Builder { @NonNull @@ -221,7 +218,6 @@ public final class AppTarget implements Parcelable { * @hide */ @SystemApi - @TestApi public Builder(@NonNull AppTargetId id, @NonNull String packageName, @NonNull UserHandle user) { mId = Objects.requireNonNull(id); @@ -235,7 +231,6 @@ public final class AppTarget implements Parcelable { * @hide */ @SystemApi - @TestApi public Builder(@NonNull AppTargetId id, @NonNull ShortcutInfo info) { mId = Objects.requireNonNull(id); mShortcutInfo = Objects.requireNonNull(info); diff --git a/core/java/android/app/prediction/AppTargetEvent.java b/core/java/android/app/prediction/AppTargetEvent.java index f519145c4aa8..963e750e4fd1 100644 --- a/core/java/android/app/prediction/AppTargetEvent.java +++ b/core/java/android/app/prediction/AppTargetEvent.java @@ -19,7 +19,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -32,7 +31,6 @@ import java.lang.annotation.RetentionPolicy; * @hide */ @SystemApi -@TestApi public final class AppTargetEvent implements Parcelable { /** @@ -141,7 +139,6 @@ public final class AppTargetEvent implements Parcelable { * @hide */ @SystemApi - @TestApi public static final class Builder { private AppTarget mTarget; private String mLocation; diff --git a/core/java/android/app/prediction/AppTargetId.java b/core/java/android/app/prediction/AppTargetId.java index 052fdc11ef21..048e12c5c48e 100644 --- a/core/java/android/app/prediction/AppTargetId.java +++ b/core/java/android/app/prediction/AppTargetId.java @@ -18,7 +18,6 @@ package android.app.prediction; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -28,7 +27,6 @@ import android.os.Parcelable; * @hide */ @SystemApi -@TestApi public final class AppTargetId implements Parcelable { @NonNull @@ -40,7 +38,6 @@ public final class AppTargetId implements Parcelable { * @hide */ @SystemApi - @TestApi public AppTargetId(@NonNull String id) { mId = id; } diff --git a/core/java/android/app/role/OnRoleHoldersChangedListener.java b/core/java/android/app/role/OnRoleHoldersChangedListener.java index d6f76794da20..5958debc86dd 100644 --- a/core/java/android/app/role/OnRoleHoldersChangedListener.java +++ b/core/java/android/app/role/OnRoleHoldersChangedListener.java @@ -18,7 +18,6 @@ package android.app.role; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.UserHandle; /** @@ -27,7 +26,6 @@ import android.os.UserHandle; * @hide */ @SystemApi -@TestApi public interface OnRoleHoldersChangedListener { /** diff --git a/core/java/android/app/role/RoleManager.java b/core/java/android/app/role/RoleManager.java index 82159235ae28..408ce0f2ab1a 100644 --- a/core/java/android/app/role/RoleManager.java +++ b/core/java/android/app/role/RoleManager.java @@ -144,7 +144,6 @@ public final class RoleManager { * @hide */ @SystemApi - @TestApi public static final int MANAGE_HOLDERS_FLAG_DONT_KILL_APP = 1; /** @@ -255,7 +254,6 @@ public final class RoleManager { @NonNull @RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS) @SystemApi - @TestApi public List<String> getRoleHolders(@NonNull String roleName) { return getRoleHoldersAsUser(roleName, Process.myUserHandle()); } @@ -281,7 +279,6 @@ public final class RoleManager { @NonNull @RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS) @SystemApi - @TestApi public List<String> getRoleHoldersAsUser(@NonNull String roleName, @NonNull UserHandle user) { Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty"); Objects.requireNonNull(user, "user cannot be null"); @@ -315,7 +312,6 @@ public final class RoleManager { */ @RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS) @SystemApi - @TestApi public void addRoleHolderAsUser(@NonNull String roleName, @NonNull String packageName, @ManageHoldersFlags int flags, @NonNull UserHandle user, @CallbackExecutor @NonNull Executor executor, @NonNull Consumer<Boolean> callback) { @@ -354,7 +350,6 @@ public final class RoleManager { */ @RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS) @SystemApi - @TestApi public void removeRoleHolderAsUser(@NonNull String roleName, @NonNull String packageName, @ManageHoldersFlags int flags, @NonNull UserHandle user, @CallbackExecutor @NonNull Executor executor, @NonNull Consumer<Boolean> callback) { @@ -392,7 +387,6 @@ public final class RoleManager { */ @RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS) @SystemApi - @TestApi public void clearRoleHoldersAsUser(@NonNull String roleName, @ManageHoldersFlags int flags, @NonNull UserHandle user, @CallbackExecutor @NonNull Executor executor, @NonNull Consumer<Boolean> callback) { @@ -439,7 +433,6 @@ public final class RoleManager { */ @RequiresPermission(Manifest.permission.OBSERVE_ROLE_HOLDERS) @SystemApi - @TestApi public void addOnRoleHoldersChangedListenerAsUser(@CallbackExecutor @NonNull Executor executor, @NonNull OnRoleHoldersChangedListener listener, @NonNull UserHandle user) { Objects.requireNonNull(executor, "executor cannot be null"); @@ -485,7 +478,6 @@ public final class RoleManager { */ @RequiresPermission(Manifest.permission.OBSERVE_ROLE_HOLDERS) @SystemApi - @TestApi public void removeOnRoleHoldersChangedListenerAsUser( @NonNull OnRoleHoldersChangedListener listener, @NonNull UserHandle user) { Objects.requireNonNull(listener, "listener cannot be null"); @@ -527,7 +519,6 @@ public final class RoleManager { */ @RequiresPermission(PERMISSION_MANAGE_ROLES_FROM_CONTROLLER) @SystemApi - @TestApi public void setRoleNamesFromController(@NonNull List<String> roleNames) { Objects.requireNonNull(roleNames, "roleNames cannot be null"); try { @@ -558,7 +549,6 @@ public final class RoleManager { */ @RequiresPermission(PERMISSION_MANAGE_ROLES_FROM_CONTROLLER) @SystemApi - @TestApi public boolean addRoleHolderFromController(@NonNull String roleName, @NonNull String packageName) { Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty"); @@ -591,7 +581,6 @@ public final class RoleManager { */ @RequiresPermission(PERMISSION_MANAGE_ROLES_FROM_CONTROLLER) @SystemApi - @TestApi public boolean removeRoleHolderFromController(@NonNull String roleName, @NonNull String packageName) { Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty"); @@ -614,7 +603,6 @@ public final class RoleManager { @NonNull @RequiresPermission(PERMISSION_MANAGE_ROLES_FROM_CONTROLLER) @SystemApi - @TestApi public List<String> getHeldRolesFromController(@NonNull String packageName) { Preconditions.checkStringNotEmpty(packageName, "packageName cannot be null or empty"); try { diff --git a/core/java/android/app/slice/SliceProvider.java b/core/java/android/app/slice/SliceProvider.java index cef6ab094177..0589f4a3b2bb 100644 --- a/core/java/android/app/slice/SliceProvider.java +++ b/core/java/android/app/slice/SliceProvider.java @@ -519,7 +519,7 @@ public abstract class SliceProvider extends ContentProvider { intent.setData(sliceUri.buildUpon().appendQueryParameter("package", callingPackage) .build()); - return PendingIntent.getActivity(context, 0, intent, 0); + return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE); } /** diff --git a/core/java/android/app/usage/CacheQuotaHint.java b/core/java/android/app/usage/CacheQuotaHint.java index d5c72f286a32..0ccb058d11cf 100644 --- a/core/java/android/app/usage/CacheQuotaHint.java +++ b/core/java/android/app/usage/CacheQuotaHint.java @@ -19,7 +19,6 @@ package android.app.usage; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -33,7 +32,6 @@ import java.util.Objects; * allows apps to understand how much cache to use. * {@hide} */ -@TestApi @SystemApi public final class CacheQuotaHint implements Parcelable { public static final long QUOTA_NOT_SET = -1; diff --git a/core/java/android/companion/CompanionDeviceManager.java b/core/java/android/companion/CompanionDeviceManager.java index e94556b8d97b..c3c270e52eb6 100644 --- a/core/java/android/companion/CompanionDeviceManager.java +++ b/core/java/android/companion/CompanionDeviceManager.java @@ -21,7 +21,6 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.app.Activity; import android.app.Application; import android.app.PendingIntent; @@ -285,7 +284,6 @@ public final class CompanionDeviceManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.MANAGE_COMPANION_DEVICES) public boolean isDeviceAssociatedForWifiConnection( @NonNull String packageName, diff --git a/core/java/android/companion/ICompanionDeviceDiscoveryService.aidl b/core/java/android/companion/ICompanionDeviceDiscoveryService.aidl index 5e3d46caae91..a630873c7f67 100644 --- a/core/java/android/companion/ICompanionDeviceDiscoveryService.aidl +++ b/core/java/android/companion/ICompanionDeviceDiscoveryService.aidl @@ -23,7 +23,7 @@ import com.android.internal.infra.AndroidFuture; /** @hide */ -interface ICompanionDeviceDiscoveryService { +oneway interface ICompanionDeviceDiscoveryService { void startDiscovery( in AssociationRequest request, in String callingPackage, diff --git a/core/java/android/content/ApexEnvironment.java b/core/java/android/content/ApexEnvironment.java index 9f15a425d92b..b4cc3c2bb156 100644 --- a/core/java/android/content/ApexEnvironment.java +++ b/core/java/android/content/ApexEnvironment.java @@ -18,7 +18,6 @@ package android.content; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Environment; import android.os.UserHandle; @@ -31,7 +30,6 @@ import java.util.Objects; * @hide */ @SystemApi -@TestApi public class ApexEnvironment { private static final String APEX_DATA = "apexdata"; diff --git a/core/java/android/content/ContentProviderClient.java b/core/java/android/content/ContentProviderClient.java index d0f5ec467458..5af7861e1a20 100644 --- a/core/java/android/content/ContentProviderClient.java +++ b/core/java/android/content/ContentProviderClient.java @@ -21,7 +21,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.content.res.AssetFileDescriptor; import android.database.CrossProcessCursorWrapper; @@ -123,7 +122,6 @@ public class ContentProviderClient implements ContentInterface, AutoCloseable { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.REMOVE_TASKS) public void setDetectNotResponding(@DurationMillisLong long timeoutMillis) { synchronized (ContentProviderClient.class) { diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java index c39f176ac0d1..fd7074c29891 100644 --- a/core/java/android/content/ContentResolver.java +++ b/core/java/android/content/ContentResolver.java @@ -4098,7 +4098,6 @@ public abstract class ContentResolver implements ContentInterface { * @hide */ @SystemApi - @TestApi // We can't accept an already-opened FD here, since these methods are // rewriting actual filesystem paths @SuppressLint("StreamFiles") @@ -4118,7 +4117,6 @@ public abstract class ContentResolver implements ContentInterface { * @hide */ @SystemApi - @TestApi // We can't accept an already-opened FD here, since these methods are // rewriting actual filesystem paths @SuppressLint("StreamFiles") diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index bbc1406fb7ea..42fe0e1c465d 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -1849,7 +1849,6 @@ public abstract class Context { */ @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) @SystemApi - @TestApi public void startActivityAsUser(@RequiresPermission @NonNull Intent intent, @NonNull UserHandle user) { throw new RuntimeException("Not implemented. Must override in a subclass."); @@ -3982,7 +3981,6 @@ public abstract class Context { * @hide */ @SystemApi - @TestApi @SuppressLint("ServiceName") public static final String STATUS_BAR_SERVICE = "statusbar"; @@ -4194,7 +4192,6 @@ public abstract class Context { * @hide */ @SystemApi - @TestApi public static final String ETHERNET_SERVICE = "ethernet"; /** @@ -4517,7 +4514,6 @@ public abstract class Context { * @see #getSystemService(String) * @hide */ - @TestApi @SystemApi public static final String PERMISSION_SERVICE = "permission"; @@ -4548,7 +4544,7 @@ public abstract class Context { * @see #getSystemService(String) * @hide */ - @SystemApi @TestApi + @SystemApi public static final String ROLLBACK_SERVICE = "rollback"; /** @@ -5022,7 +5018,7 @@ public abstract class Context { * @see android.os.BugreportManager * @hide */ - @SystemApi @TestApi + @SystemApi public static final String BUGREPORT_SERVICE = "bugreport"; /** @@ -5184,7 +5180,6 @@ public abstract class Context { * @hide */ @SystemApi - @TestApi public static final String APP_INTEGRITY_SERVICE = "app_integrity"; /** @@ -5756,7 +5751,6 @@ public abstract class Context { * @hide */ @SystemApi - @TestApi @NonNull public Context createPackageContextAsUser( @NonNull String packageName, @CreatePackageOptions int flags, @NonNull UserHandle user) @@ -5775,7 +5769,6 @@ public abstract class Context { * @hide */ @SystemApi - @TestApi @NonNull public Context createContextAsUser(@NonNull UserHandle user, @CreatePackageOptions int flags) { if (Build.IS_ENG) { diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 653064d41bff..c62194b380dd 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -28,7 +28,6 @@ import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SuppressLint; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.AppGlobals; import android.compat.annotation.UnsupportedAppUsage; import android.content.pm.ActivityInfo; @@ -1748,7 +1747,6 @@ public class Intent implements Parcelable, Cloneable { * @hide */ @SystemApi - @TestApi public static final String EXTRA_ORIGINATING_UID = "android.intent.extra.ORIGINATING_UID"; @@ -1979,7 +1977,6 @@ public class Intent implements Parcelable, Cloneable { @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) @SystemApi - @TestApi public static final String ACTION_MANAGE_DEFAULT_APP = "android.intent.action.MANAGE_DEFAULT_APP"; @@ -1994,7 +1991,6 @@ public class Intent implements Parcelable, Cloneable { * @hide */ @SystemApi - @TestApi public static final String EXTRA_ROLE_NAME = "android.intent.extra.ROLE_NAME"; /** @@ -2541,7 +2537,7 @@ public class Intent implements Parcelable, Cloneable { * * @hide */ - @SystemApi @TestApi + @SystemApi @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_ROLLBACK_COMMITTED = "android.intent.action.ROLLBACK_COMMITTED"; diff --git a/core/java/android/content/integrity/AppIntegrityManager.java b/core/java/android/content/integrity/AppIntegrityManager.java index 4db4c7316433..1196064768e8 100644 --- a/core/java/android/content/integrity/AppIntegrityManager.java +++ b/core/java/android/content/integrity/AppIntegrityManager.java @@ -36,7 +36,6 @@ import java.util.List; * * @hide */ -@TestApi @SystemApi @SystemService(Context.APP_INTEGRITY_SERVICE) public class AppIntegrityManager { diff --git a/core/java/android/content/integrity/IntegrityFormula.java b/core/java/android/content/integrity/IntegrityFormula.java index fc177721240c..d965ef5c71a8 100644 --- a/core/java/android/content/integrity/IntegrityFormula.java +++ b/core/java/android/content/integrity/IntegrityFormula.java @@ -19,7 +19,6 @@ package android.content.integrity; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.integrity.AtomicFormula.BooleanAtomicFormula; import android.content.integrity.AtomicFormula.LongAtomicFormula; import android.content.integrity.AtomicFormula.StringAtomicFormula; @@ -38,7 +37,6 @@ import java.util.Arrays; * @hide */ @SystemApi -@TestApi @VisibleForTesting public abstract class IntegrityFormula { diff --git a/core/java/android/content/integrity/Rule.java b/core/java/android/content/integrity/Rule.java index 8f6d73f6f028..391d1d04d553 100644 --- a/core/java/android/content/integrity/Rule.java +++ b/core/java/android/content/integrity/Rule.java @@ -22,7 +22,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -39,7 +38,6 @@ import java.util.Objects; * * @hide */ -@TestApi @SystemApi @VisibleForTesting public final class Rule implements Parcelable { diff --git a/core/java/android/content/integrity/RuleSet.java b/core/java/android/content/integrity/RuleSet.java index e121ff8bbcaa..b423b54a7d92 100644 --- a/core/java/android/content/integrity/RuleSet.java +++ b/core/java/android/content/integrity/RuleSet.java @@ -18,7 +18,6 @@ package android.content.integrity; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import java.util.ArrayList; import java.util.Collections; @@ -30,7 +29,6 @@ import java.util.Objects; * * @hide */ -@TestApi @SystemApi public class RuleSet { private final String mVersion; diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index d5f2c12e8462..8f4fc261df37 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -1141,7 +1141,6 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public int targetSandboxVersion; /** diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index f03425b9e117..e2f85282948a 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -1722,7 +1722,6 @@ public class PackageInstaller { * * @hide */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS) public void setGrantedRuntimePermissions(String[] permissions) { @@ -1794,7 +1793,7 @@ public class PackageInstaller { * @see SessionParams#setEnableRollback(boolean, int) * @hide */ - @SystemApi @TestApi + @SystemApi public void setEnableRollback(boolean enable) { if (enable) { installFlags |= PackageManager.INSTALL_ENABLE_ROLLBACK; @@ -1818,7 +1817,7 @@ public class PackageInstaller { * @param dataPolicy the rollback data policy for this session * @hide */ - @SystemApi @TestApi + @SystemApi public void setEnableRollback(boolean enable, @PackageManager.RollbackDataPolicy int dataPolicy) { if (enable) { @@ -1841,7 +1840,7 @@ public class PackageInstaller { } /** {@hide} */ - @SystemApi @TestApi + @SystemApi public void setRequestDowngrade(boolean requestDowngrade) { if (requestDowngrade) { installFlags |= PackageManager.INSTALL_REQUEST_DOWNGRADE; @@ -1880,7 +1879,6 @@ public class PackageInstaller { /** {@hide} */ @SystemApi - @TestApi public void setInstallAsInstantApp(boolean isInstantApp) { if (isInstantApp) { installFlags |= PackageManager.INSTALL_INSTANT_APP; @@ -1965,7 +1963,7 @@ public class PackageInstaller { * * {@hide} */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.INSTALL_PACKAGES) public void setStaged() { this.isStaged = true; @@ -1976,7 +1974,7 @@ public class PackageInstaller { * * {@hide} */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.INSTALL_PACKAGES) public void setInstallAsApex() { installFlags |= PackageManager.INSTALL_APEX; @@ -2480,7 +2478,6 @@ public class PackageInstaller { * * @hide */ - @TestApi @SystemApi public @NonNull Set<String> getWhitelistedRestrictedPermissions() { if ((installFlags & PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS) != 0) { @@ -2504,7 +2501,6 @@ public class PackageInstaller { * * @hide */ - @TestApi @SystemApi public int getAutoRevokePermissionsMode() { return autoRevokePermissionsMode; @@ -2633,7 +2629,7 @@ public class PackageInstaller { * * @hide */ - @SystemApi @TestApi + @SystemApi @PackageManager.RollbackDataPolicy public int getRollbackDataPolicy() { return rollbackDataPolicy; diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 923f8cb38d38..fc7b3e011cad 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -120,7 +120,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi public interface OnPermissionsChangedListener { /** @@ -479,7 +478,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi public static final int MATCH_FACTORY_ONLY = 0x00200000; /** @@ -611,7 +609,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi public static final int MODULE_APEX_NAME = 0x00000001; /** @hide */ @@ -3319,7 +3316,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi public static final int FLAG_PERMISSION_USER_SET = 1 << 0; /** @@ -3330,7 +3326,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi public static final int FLAG_PERMISSION_USER_FIXED = 1 << 1; /** @@ -3341,7 +3336,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi public static final int FLAG_PERMISSION_POLICY_FIXED = 1 << 2; /** @@ -3358,7 +3352,6 @@ public abstract class PackageManager { */ @Deprecated @SystemApi - @TestApi public static final int FLAG_PERMISSION_REVOKE_ON_UPGRADE = 1 << 3; /** @@ -3368,7 +3361,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi public static final int FLAG_PERMISSION_SYSTEM_FIXED = 1 << 4; /** @@ -3380,7 +3372,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi public static final int FLAG_PERMISSION_GRANTED_BY_DEFAULT = 1 << 5; /** @@ -3390,7 +3381,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi public static final int FLAG_PERMISSION_REVIEW_REQUIRED = 1 << 6; /** @@ -3428,7 +3418,6 @@ public abstract class PackageManager { * * @hide */ - @TestApi @SystemApi public static final int FLAG_PERMISSION_RESTRICTION_INSTALLER_EXEMPT = 1 << 11; @@ -3440,7 +3429,6 @@ public abstract class PackageManager { * * @hide */ - @TestApi @SystemApi public static final int FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT = 1 << 12; @@ -3453,7 +3441,6 @@ public abstract class PackageManager { * * @hide */ - @TestApi @SystemApi public static final int FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT = 1 << 13; @@ -3466,7 +3453,6 @@ public abstract class PackageManager { * * @hide */ - @TestApi @SystemApi public static final int FLAG_PERMISSION_APPLY_RESTRICTION = 1 << 14; @@ -3476,7 +3462,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi public static final int FLAG_PERMISSION_GRANTED_BY_ROLE = 1 << 15; /** @@ -3488,7 +3473,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi public static final int FLAG_PERMISSION_REVOKED_COMPAT = FLAG_PERMISSION_REVOKE_ON_UPGRADE; /** @@ -3498,7 +3482,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi public static final int FLAG_PERMISSION_ONE_TIME = 1 << 16; /** @@ -3516,7 +3499,6 @@ public abstract class PackageManager { * * @hide */ - @TestApi @SystemApi public static final int FLAG_PERMISSION_RESTRICTION_ROLE_EXEMPT = 1 << 18; @@ -4083,7 +4065,7 @@ public abstract class PackageManager { * * @hide */ - @TestApi @SystemApi + @SystemApi public abstract boolean arePermissionsIndividuallyControlled(); /** @@ -4334,7 +4316,6 @@ public abstract class PackageManager { * @hide */ @NonNull - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public abstract List<PackageInfo> getInstalledPackagesAsUser(@PackageInfoFlags int flags, @@ -4495,7 +4476,6 @@ public abstract class PackageManager { * * @hide */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS) public abstract void grantRuntimePermission(@NonNull String packageName, @@ -4522,7 +4502,6 @@ public abstract class PackageManager { * * @hide */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) public abstract void revokeRuntimePermission(@NonNull String packageName, @@ -4550,7 +4529,6 @@ public abstract class PackageManager { * * @hide */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) public void revokeRuntimePermission(@NonNull String packageName, @@ -4569,7 +4547,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(anyOf = { android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS, @@ -4592,7 +4569,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(anyOf = { android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS @@ -6440,7 +6416,6 @@ public abstract class PackageManager { * @hide */ @Nullable - @TestApi @SystemApi @RequiresPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL) public abstract String getDefaultBrowserPackageNameAsUser(@UserIdInt int userId); @@ -7094,7 +7069,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS) public abstract void addOnPermissionsChangeListener( @NonNull OnPermissionsChangedListener listener); @@ -7107,7 +7081,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS) public abstract void removeOnPermissionsChangeListener( @NonNull OnPermissionsChangedListener listener); @@ -8126,7 +8099,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi @Nullable public String getIncidentReportApproverPackageName() { throw new UnsupportedOperationException( diff --git a/core/java/android/content/pm/PermissionInfo.java b/core/java/android/content/pm/PermissionInfo.java index 5d4c843d2eab..e730fee7f812 100644 --- a/core/java/android/content/pm/PermissionInfo.java +++ b/core/java/android/content/pm/PermissionInfo.java @@ -160,7 +160,6 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int PROTECTION_FLAG_OEM = 0x4000; /** @@ -181,7 +180,6 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER = 0x10000; /** @@ -192,7 +190,6 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int PROTECTION_FLAG_WELLBEING = 0x20000; /** @@ -202,7 +199,6 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int PROTECTION_FLAG_DOCUMENTER = 0x40000; /** @@ -212,7 +208,6 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int PROTECTION_FLAG_CONFIGURATOR = 0x80000; /** @@ -223,7 +218,6 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int PROTECTION_FLAG_INCIDENT_REPORT_APPROVER = 0x100000; /** @@ -234,7 +228,6 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int PROTECTION_FLAG_APP_PREDICTOR = 0x200000; /** @@ -245,7 +238,6 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int PROTECTION_FLAG_COMPANION = 0x800000; /** @@ -256,7 +248,6 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int PROTECTION_FLAG_RETAIL_DEMO = 0x1000000; /** @hide */ @@ -340,7 +331,6 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * value of {@link android.R.attr#permissionFlags}. * @hide */ - @TestApi @SystemApi public static final int FLAG_REMOVED = 1<<1; @@ -436,7 +426,6 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public final @Nullable String backgroundPermission; /** diff --git a/core/java/android/content/rollback/PackageRollbackInfo.java b/core/java/android/content/rollback/PackageRollbackInfo.java index 642a76b453c9..0140280cd3d5 100644 --- a/core/java/android/content/rollback/PackageRollbackInfo.java +++ b/core/java/android/content/rollback/PackageRollbackInfo.java @@ -18,7 +18,6 @@ package android.content.rollback; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.pm.PackageManager; import android.content.pm.VersionedPackage; import android.os.Parcel; @@ -32,7 +31,7 @@ import java.util.List; * * @hide */ -@SystemApi @TestApi +@SystemApi public final class PackageRollbackInfo implements Parcelable { private final VersionedPackage mVersionRolledBackFrom; diff --git a/core/java/android/content/rollback/RollbackInfo.java b/core/java/android/content/rollback/RollbackInfo.java index c09cfd54866c..a363718a8b1d 100644 --- a/core/java/android/content/rollback/RollbackInfo.java +++ b/core/java/android/content/rollback/RollbackInfo.java @@ -18,7 +18,6 @@ package android.content.rollback; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.pm.VersionedPackage; import android.os.Parcel; import android.os.Parcelable; @@ -31,7 +30,7 @@ import java.util.List; * * @hide */ -@SystemApi @TestApi +@SystemApi public final class RollbackInfo implements Parcelable { /** diff --git a/core/java/android/content/rollback/RollbackManager.java b/core/java/android/content/rollback/RollbackManager.java index 7ebeb212b64a..3636222f558c 100644 --- a/core/java/android/content/rollback/RollbackManager.java +++ b/core/java/android/content/rollback/RollbackManager.java @@ -24,7 +24,6 @@ import android.annotation.SystemService; import android.annotation.TestApi; import android.content.Context; import android.content.IntentSender; -import android.content.pm.PackageInstaller; import android.content.pm.ParceledListSlice; import android.content.pm.VersionedPackage; import android.os.RemoteException; @@ -43,7 +42,7 @@ import java.util.List; * @see PackageInstaller.SessionParams#setEnableRollback(boolean) * @hide */ -@SystemApi @TestApi +@SystemApi @SystemService(Context.ROLLBACK_SERVICE) public final class RollbackManager { private final String mCallerPackageName; diff --git a/core/java/android/hardware/biometrics/BiometricConstants.java b/core/java/android/hardware/biometrics/BiometricConstants.java index 3040932f69dd..bed9a0640693 100644 --- a/core/java/android/hardware/biometrics/BiometricConstants.java +++ b/core/java/android/hardware/biometrics/BiometricConstants.java @@ -172,8 +172,7 @@ public interface BiometricConstants { BIOMETRIC_ERROR_NEGATIVE_BUTTON, BIOMETRIC_ERROR_NO_DEVICE_CREDENTIAL, BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED, - BIOMETRIC_PAUSED_REJECTED, - BIOMETRIC_ERROR_VENDOR_BASE}) + BIOMETRIC_PAUSED_REJECTED}) @Retention(RetentionPolicy.SOURCE) @interface Errors {} @@ -182,6 +181,19 @@ public interface BiometricConstants { // /** + * @hide + */ + @IntDef({BIOMETRIC_ACQUIRED_GOOD, + BIOMETRIC_ACQUIRED_PARTIAL, + BIOMETRIC_ACQUIRED_INSUFFICIENT, + BIOMETRIC_ACQUIRED_IMAGER_DIRTY, + BIOMETRIC_ACQUIRED_TOO_SLOW, + BIOMETRIC_ACQUIRED_TOO_FAST, + BIOMETRIC_ACQUIRED_VENDOR}) + @Retention(RetentionPolicy.SOURCE) + @interface Acquired {} + + /** * The image acquired was good. */ int BIOMETRIC_ACQUIRED_GOOD = 0; diff --git a/core/java/android/hardware/biometrics/BiometricFingerprintConstants.java b/core/java/android/hardware/biometrics/BiometricFingerprintConstants.java index 46e8cc036809..c7b554b3aafc 100644 --- a/core/java/android/hardware/biometrics/BiometricFingerprintConstants.java +++ b/core/java/android/hardware/biometrics/BiometricFingerprintConstants.java @@ -16,11 +16,15 @@ package android.hardware.biometrics; +import android.annotation.IntDef; import android.app.KeyguardManager; import android.compat.annotation.UnsupportedAppUsage; import android.hardware.biometrics.BiometricManager.Authenticators; import android.hardware.fingerprint.FingerprintManager; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + /** * Interface containing all of the fingerprint-specific constants. * @@ -36,6 +40,27 @@ public interface BiometricFingerprintConstants { // /** + * @hide + */ + @IntDef({FINGERPRINT_ERROR_HW_UNAVAILABLE, + FINGERPRINT_ERROR_UNABLE_TO_PROCESS, + FINGERPRINT_ERROR_TIMEOUT, + FINGERPRINT_ERROR_NO_SPACE, + FINGERPRINT_ERROR_CANCELED, + FINGERPRINT_ERROR_UNABLE_TO_REMOVE, + FINGERPRINT_ERROR_LOCKOUT, + FINGERPRINT_ERROR_VENDOR, + FINGERPRINT_ERROR_LOCKOUT_PERMANENT, + FINGERPRINT_ERROR_USER_CANCELED, + FINGERPRINT_ERROR_NO_FINGERPRINTS, + FINGERPRINT_ERROR_HW_NOT_PRESENT, + FINGERPRINT_ERROR_NEGATIVE_BUTTON, + BIOMETRIC_ERROR_NO_DEVICE_CREDENTIAL, + BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED}) + @Retention(RetentionPolicy.SOURCE) + @interface FingerprintError {} + + /** * The hardware is unavailable. Try again later. */ int FINGERPRINT_ERROR_HW_UNAVAILABLE = 1; @@ -150,6 +175,20 @@ public interface BiometricFingerprintConstants { // /** + * @hide + */ + @IntDef({FINGERPRINT_ACQUIRED_GOOD, + FINGERPRINT_ACQUIRED_PARTIAL, + FINGERPRINT_ACQUIRED_INSUFFICIENT, + FINGERPRINT_ACQUIRED_IMAGER_DIRTY, + FINGERPRINT_ACQUIRED_TOO_SLOW, + FINGERPRINT_ACQUIRED_TOO_FAST, + FINGERPRINT_ACQUIRED_VENDOR, + FINGERPRINT_ACQUIRED_START}) + @Retention(RetentionPolicy.SOURCE) + @interface FingerprintAcquired {} + + /** * The image acquired was good. */ int FINGERPRINT_ACQUIRED_GOOD = 0; diff --git a/core/java/android/hardware/biometrics/BiometricTestSession.java b/core/java/android/hardware/biometrics/BiometricTestSession.java index 4c7aa27968fe..802655b0d364 100644 --- a/core/java/android/hardware/biometrics/BiometricTestSession.java +++ b/core/java/android/hardware/biometrics/BiometricTestSession.java @@ -22,6 +22,7 @@ import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.TestApi; import android.content.Context; +import android.hardware.fingerprint.FingerprintManager; import android.os.RemoteException; import android.util.ArraySet; @@ -128,11 +129,14 @@ public class BiometricTestSession implements AutoCloseable { * Simulates an acquired message from the HAL. * * @param userId User that this command applies to. + * @param acquireInfo See + * {@link BiometricPrompt.AuthenticationCallback#onAuthenticationAcquired(int)} and + * {@link FingerprintManager.AuthenticationCallback#onAuthenticationAcquired(int)} */ @RequiresPermission(TEST_BIOMETRIC) - public void notifyAcquired(int userId) { + public void notifyAcquired(int userId, int acquireInfo) { try { - mTestSession.notifyAcquired(userId); + mTestSession.notifyAcquired(userId, acquireInfo); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -142,11 +146,14 @@ public class BiometricTestSession implements AutoCloseable { * Simulates an error message from the HAL. * * @param userId User that this command applies to. + * @param errorCode See + * {@link BiometricPrompt.AuthenticationCallback#onAuthenticationError(int, CharSequence)} and + * {@link FingerprintManager.AuthenticationCallback#onAuthenticationError(int, CharSequence)} */ @RequiresPermission(TEST_BIOMETRIC) - public void notifyError(int userId) { + public void notifyError(int userId, int errorCode) { try { - mTestSession.notifyError(userId); + mTestSession.notifyError(userId, errorCode); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/hardware/biometrics/ITestSession.aidl b/core/java/android/hardware/biometrics/ITestSession.aidl index 5677f6517ae5..6112f17949d7 100644 --- a/core/java/android/hardware/biometrics/ITestSession.aidl +++ b/core/java/android/hardware/biometrics/ITestSession.aidl @@ -42,10 +42,10 @@ interface ITestSession { void rejectAuthentication(int userId); // Simulates an acquired message from the HAL. - void notifyAcquired(int userId); + void notifyAcquired(int userId, int acquireInfo); // Simulates an error message from the HAL. - void notifyError(int userId); + void notifyError(int userId, int errorCode); // Matches the framework's cached enrollments against the HAL's enrollments. Any enrollment // that isn't known by both sides are deleted. This should generally be used when the test diff --git a/core/java/android/hardware/camera2/CameraDevice.java b/core/java/android/hardware/camera2/CameraDevice.java index decf05396c1f..cd137078818c 100644 --- a/core/java/android/hardware/camera2/CameraDevice.java +++ b/core/java/android/hardware/camera2/CameraDevice.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.hardware.camera2.params.InputConfiguration; import android.hardware.camera2.params.OutputConfiguration; import android.hardware.camera2.params.SessionConfiguration; @@ -358,7 +357,6 @@ public abstract class CameraDevice implements AutoCloseable { * @hide */ @SystemApi - @TestApi public static final int SESSION_OPERATION_MODE_NORMAL = 0; // ICameraDeviceUser.NORMAL_MODE; @@ -369,7 +367,6 @@ public abstract class CameraDevice implements AutoCloseable { * @hide */ @SystemApi - @TestApi public static final int SESSION_OPERATION_MODE_CONSTRAINED_HIGH_SPEED = 1; // ICameraDeviceUser.CONSTRAINED_HIGH_SPEED_MODE; @@ -380,7 +377,6 @@ public abstract class CameraDevice implements AutoCloseable { * @hide */ @SystemApi - @TestApi public static final int SESSION_OPERATION_MODE_VENDOR_START = 0x8000; // ICameraDeviceUser.VENDOR_MODE_START; @@ -423,7 +419,6 @@ public abstract class CameraDevice implements AutoCloseable { * @hide */ @SystemApi - @TestApi @Deprecated public abstract void createCustomCaptureSession( InputConfiguration inputConfig, diff --git a/core/java/android/hardware/display/AmbientBrightnessDayStats.java b/core/java/android/hardware/display/AmbientBrightnessDayStats.java index 26fd2654239f..8aff911ea42c 100644 --- a/core/java/android/hardware/display/AmbientBrightnessDayStats.java +++ b/core/java/android/hardware/display/AmbientBrightnessDayStats.java @@ -19,7 +19,6 @@ package android.hardware.display; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -36,7 +35,6 @@ import java.util.Objects; * @hide */ @SystemApi -@TestApi public final class AmbientBrightnessDayStats implements Parcelable { /** The localdate for which brightness stats are being tracked */ diff --git a/core/java/android/hardware/display/BrightnessChangeEvent.java b/core/java/android/hardware/display/BrightnessChangeEvent.java index a6a44bea816b..e2d836c59099 100644 --- a/core/java/android/hardware/display/BrightnessChangeEvent.java +++ b/core/java/android/hardware/display/BrightnessChangeEvent.java @@ -19,7 +19,6 @@ package android.hardware.display; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -32,7 +31,6 @@ import java.util.Objects; * @hide */ @SystemApi -@TestApi public final class BrightnessChangeEvent implements Parcelable { /** Brightness in nits */ public final float brightness; diff --git a/core/java/android/hardware/display/BrightnessConfiguration.java b/core/java/android/hardware/display/BrightnessConfiguration.java index 6412a0ce7219..d9c1063cd39d 100644 --- a/core/java/android/hardware/display/BrightnessConfiguration.java +++ b/core/java/android/hardware/display/BrightnessConfiguration.java @@ -20,7 +20,6 @@ import android.annotation.FloatRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.pm.ApplicationInfo; import android.os.Parcel; import android.os.Parcelable; @@ -44,7 +43,6 @@ import java.util.Objects; /** @hide */ @SystemApi -@TestApi public final class BrightnessConfiguration implements Parcelable { private static final String TAG_BRIGHTNESS_CURVE = "brightness-curve"; private static final String TAG_BRIGHTNESS_POINT = "brightness-point"; diff --git a/core/java/android/hardware/display/BrightnessCorrection.java b/core/java/android/hardware/display/BrightnessCorrection.java index 0879787077aa..bbfc45edb89a 100644 --- a/core/java/android/hardware/display/BrightnessCorrection.java +++ b/core/java/android/hardware/display/BrightnessCorrection.java @@ -20,7 +20,6 @@ import android.annotation.FloatRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; import android.util.MathUtils; @@ -44,7 +43,6 @@ import java.io.IOException; * @hide */ @SystemApi -@TestApi public final class BrightnessCorrection implements Parcelable { private static final int SCALE_AND_TRANSLATE_LOG = 1; diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java index fc14b89d83f7..68b9d5227746 100644 --- a/core/java/android/hardware/display/DisplayManager.java +++ b/core/java/android/hardware/display/DisplayManager.java @@ -699,7 +699,6 @@ public final class DisplayManager { * @hide */ @SystemApi - @TestApi public Point getStableDisplaySize() { return mGlobal.getStableDisplaySize(); } @@ -709,7 +708,6 @@ public final class DisplayManager { * @hide until we make it a system api. */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.BRIGHTNESS_SLIDER_USAGE) public List<BrightnessChangeEvent> getBrightnessEvents() { return mGlobal.getBrightnessEvents(mContext.getOpPackageName()); @@ -721,7 +719,6 @@ public final class DisplayManager { * @hide until we make it a system api */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.ACCESS_AMBIENT_LIGHT_STATS) public List<AmbientBrightnessDayStats> getAmbientBrightnessStats() { return mGlobal.getAmbientBrightnessStats(); @@ -733,7 +730,6 @@ public final class DisplayManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) public void setBrightnessConfiguration(BrightnessConfiguration c) { setBrightnessConfigurationForUser(c, mContext.getUserId(), mContext.getPackageName()); @@ -758,7 +754,6 @@ public final class DisplayManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) public BrightnessConfiguration getBrightnessConfiguration() { return getBrightnessConfigurationForUser(mContext.getUserId()); @@ -784,7 +779,6 @@ public final class DisplayManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) @Nullable public BrightnessConfiguration getDefaultBrightnessConfiguration() { diff --git a/core/java/android/hardware/hdmi/HdmiControlManager.java b/core/java/android/hardware/hdmi/HdmiControlManager.java index e5e73200c8ef..5b186c78df54 100644 --- a/core/java/android/hardware/hdmi/HdmiControlManager.java +++ b/core/java/android/hardware/hdmi/HdmiControlManager.java @@ -28,7 +28,6 @@ import android.annotation.StringDef; import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.content.Context; import android.content.pm.PackageManager; import android.os.Binder; @@ -60,7 +59,6 @@ import java.util.concurrent.Executor; * @hide */ @SystemApi -@TestApi @SystemService(Context.HDMI_CONTROL_SERVICE) @RequiresFeature(PackageManager.FEATURE_HDMI_CEC) public final class HdmiControlManager { diff --git a/core/java/android/hardware/hdmi/HdmiPortInfo.java b/core/java/android/hardware/hdmi/HdmiPortInfo.java index 52c3628f358b..e97e120109bf 100644 --- a/core/java/android/hardware/hdmi/HdmiPortInfo.java +++ b/core/java/android/hardware/hdmi/HdmiPortInfo.java @@ -18,7 +18,6 @@ package android.hardware.hdmi; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -29,7 +28,6 @@ import android.os.Parcelable; * @hide */ @SystemApi -@TestApi public final class HdmiPortInfo implements Parcelable { /** HDMI port type: Input */ public static final int PORT_INPUT = 0; diff --git a/core/java/android/hardware/hdmi/HdmiSwitchClient.java b/core/java/android/hardware/hdmi/HdmiSwitchClient.java index 4685e1e04618..cbfbe3940e47 100644 --- a/core/java/android/hardware/hdmi/HdmiSwitchClient.java +++ b/core/java/android/hardware/hdmi/HdmiSwitchClient.java @@ -18,7 +18,6 @@ package android.hardware.hdmi; import android.annotation.CallbackExecutor; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.hardware.hdmi.HdmiControlManager.ControlCallbackResult; import android.os.Binder; import android.os.RemoteException; @@ -39,7 +38,6 @@ import java.util.concurrent.Executor; * @hide */ @SystemApi -@TestApi public class HdmiSwitchClient extends HdmiClient { private static final String TAG = "HdmiSwitchClient"; diff --git a/core/java/android/hardware/lights/Light.java b/core/java/android/hardware/lights/Light.java index 1c95fb632548..da270182052d 100644 --- a/core/java/android/hardware/lights/Light.java +++ b/core/java/android/hardware/lights/Light.java @@ -19,7 +19,6 @@ package android.hardware.lights; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -29,7 +28,6 @@ import android.os.Parcelable; * @hide */ @SystemApi -@TestApi public final class Light implements Parcelable { private final int mId; private final int mOrdinal; diff --git a/core/java/android/hardware/lights/LightState.java b/core/java/android/hardware/lights/LightState.java index e55aa702f15c..cd39e6df91a9 100644 --- a/core/java/android/hardware/lights/LightState.java +++ b/core/java/android/hardware/lights/LightState.java @@ -19,7 +19,6 @@ package android.hardware.lights; import android.annotation.ColorInt; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -36,7 +35,6 @@ import android.os.Parcelable; * @hide */ @SystemApi -@TestApi public final class LightState implements Parcelable { private final int mColor; diff --git a/core/java/android/hardware/lights/LightsManager.java b/core/java/android/hardware/lights/LightsManager.java index 8cd231224472..33e5fcaf2abb 100644 --- a/core/java/android/hardware/lights/LightsManager.java +++ b/core/java/android/hardware/lights/LightsManager.java @@ -45,7 +45,6 @@ import java.util.List; * @hide */ @SystemApi -@TestApi @SystemService(Context.LIGHTS_SERVICE) public final class LightsManager { private static final String TAG = "LightsManager"; diff --git a/core/java/android/hardware/lights/LightsRequest.java b/core/java/android/hardware/lights/LightsRequest.java index 5c4fc6707e96..a318992c35ee 100644 --- a/core/java/android/hardware/lights/LightsRequest.java +++ b/core/java/android/hardware/lights/LightsRequest.java @@ -18,7 +18,6 @@ package android.hardware.lights; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.util.SparseArray; import com.android.internal.util.Preconditions; @@ -29,7 +28,6 @@ import com.android.internal.util.Preconditions; * @hide */ @SystemApi -@TestApi public final class LightsRequest { /** Visible to {@link LightsManager.Session}. */ diff --git a/core/java/android/hardware/soundtrigger/SoundTrigger.java b/core/java/android/hardware/soundtrigger/SoundTrigger.java index ecdbf4cdf9ec..e58403fe387d 100644 --- a/core/java/android/hardware/soundtrigger/SoundTrigger.java +++ b/core/java/android/hardware/soundtrigger/SoundTrigger.java @@ -67,7 +67,6 @@ import java.util.UUID; * * @hide */ -@TestApi @SystemApi public class SoundTrigger { private static final String TAG = "SoundTrigger"; diff --git a/core/java/android/metrics/LogMaker.java b/core/java/android/metrics/LogMaker.java index d8a2082f4eae..a19eb5668d55 100644 --- a/core/java/android/metrics/LogMaker.java +++ b/core/java/android/metrics/LogMaker.java @@ -16,7 +16,6 @@ package android.metrics; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.ComponentName; import android.util.Log; import android.util.SparseArray; @@ -32,7 +31,6 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; * @hide */ @SystemApi -@TestApi public class LogMaker { private static final String TAG = "LogBuilder"; diff --git a/core/java/android/metrics/MetricsReader.java b/core/java/android/metrics/MetricsReader.java index 27f9a5dbf51c..5f356ca00d88 100644 --- a/core/java/android/metrics/MetricsReader.java +++ b/core/java/android/metrics/MetricsReader.java @@ -16,7 +16,6 @@ package android.metrics; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.util.EventLog; import com.android.internal.annotations.VisibleForTesting; @@ -36,7 +35,6 @@ import java.util.concurrent.TimeUnit; * @hide */ @SystemApi -@TestApi public class MetricsReader { private Queue<LogMaker> mPendingQueue = new LinkedList<>(); private Queue<LogMaker> mSeenQueue = new LinkedList<>(); diff --git a/core/java/android/net/CaptivePortal.java b/core/java/android/net/CaptivePortal.java index 8afeb3033cdb..c2586fa0c825 100644 --- a/core/java/android/net/CaptivePortal.java +++ b/core/java/android/net/CaptivePortal.java @@ -19,7 +19,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; @@ -42,7 +41,6 @@ public class CaptivePortal implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int APP_RETURN_DISMISSED = 0; /** * Response code from the captive portal application, indicating that the user did not login and @@ -52,7 +50,6 @@ public class CaptivePortal implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int APP_RETURN_UNWANTED = 1; /** * Response code from the captive portal application, indicating that the user does not wish to @@ -62,7 +59,6 @@ public class CaptivePortal implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int APP_RETURN_WANTED_AS_IS = 2; /** Event offset of request codes from captive portal application. */ private static final int APP_REQUEST_BASE = 100; @@ -74,7 +70,6 @@ public class CaptivePortal implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int APP_REQUEST_REEVALUATION_REQUIRED = APP_REQUEST_BASE + 0; private final IBinder mBinder; @@ -154,7 +149,6 @@ public class CaptivePortal implements Parcelable { * @hide */ @SystemApi - @TestApi public void useNetwork() { try { ICaptivePortal.Stub.asInterface(mBinder).appResponse(APP_RETURN_WANTED_AS_IS); @@ -167,7 +161,6 @@ public class CaptivePortal implements Parcelable { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public void reevaluateNetwork() { try { @@ -183,7 +176,6 @@ public class CaptivePortal implements Parcelable { * @hide */ @SystemApi - @TestApi public void logEvent(@EventId int eventId, @NonNull String packageName) { try { ICaptivePortal.Stub.asInterface(mBinder).logEvent(eventId, packageName); diff --git a/core/java/android/net/CaptivePortalData.java b/core/java/android/net/CaptivePortalData.java index 09f47625a8e4..59e62a675abc 100644 --- a/core/java/android/net/CaptivePortalData.java +++ b/core/java/android/net/CaptivePortalData.java @@ -19,7 +19,6 @@ package android.net; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -30,7 +29,6 @@ import java.util.Objects; * @hide */ @SystemApi -@TestApi public final class CaptivePortalData implements Parcelable { private final long mRefreshTimeMillis; @Nullable diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index b2eba6318730..1012f47f8c0a 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -269,7 +269,6 @@ public class ConnectivityManager { * {@hide} */ @SystemApi - @TestApi public static final String EXTRA_CAPTIVE_PORTAL_PROBE_SPEC = "android.net.extra.CAPTIVE_PORTAL_PROBE_SPEC"; @@ -278,7 +277,6 @@ public class ConnectivityManager { * {@hide} */ @SystemApi - @TestApi public static final String EXTRA_CAPTIVE_PORTAL_USER_AGENT = "android.net.extra.CAPTIVE_PORTAL_USER_AGENT"; @@ -4413,7 +4411,6 @@ public class ConnectivityManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK) public void startCaptivePortalApp(@NonNull Network network, @NonNull Bundle appExtras) { try { diff --git a/core/java/android/net/EthernetManager.java b/core/java/android/net/EthernetManager.java index d975017f9c8e..5860e20ad3b4 100644 --- a/core/java/android/net/EthernetManager.java +++ b/core/java/android/net/EthernetManager.java @@ -37,7 +37,6 @@ import java.util.concurrent.Executor; * @hide */ @SystemApi -@TestApi @SystemService(Context.ETHERNET_SERVICE) public class EthernetManager { private static final String TAG = "EthernetManager"; diff --git a/core/java/android/net/IpPrefix.java b/core/java/android/net/IpPrefix.java index 06f5f270d189..bcb65fab8571 100644 --- a/core/java/android/net/IpPrefix.java +++ b/core/java/android/net/IpPrefix.java @@ -20,7 +20,6 @@ import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; import android.util.Pair; @@ -89,7 +88,6 @@ public final class IpPrefix implements Parcelable { * @hide */ @SystemApi - @TestApi public IpPrefix(@NonNull InetAddress address, @IntRange(from = 0, to = 128) int prefixLength) { // We don't reuse the (byte[], int) constructor because it calls clone() on the byte array, // which is unnecessary because getAddress() already returns a clone. @@ -108,7 +106,6 @@ public final class IpPrefix implements Parcelable { * @hide */ @SystemApi - @TestApi public IpPrefix(@NonNull String prefix) { // We don't reuse the (InetAddress, int) constructor because "error: call to this must be // first statement in constructor". We could factor out setting the member variables to an diff --git a/core/java/android/net/IpSecAlgorithm.java b/core/java/android/net/IpSecAlgorithm.java index a4f7b7454bd9..e89451e4f4ef 100644 --- a/core/java/android/net/IpSecAlgorithm.java +++ b/core/java/android/net/IpSecAlgorithm.java @@ -201,14 +201,16 @@ public final class IpSecAlgorithm implements Parcelable { @VisibleForTesting public static final Map<String, Integer> ALGO_TO_REQUIRED_FIRST_SDK = new HashMap<>(); + private static final int SDK_VERSION_ZERO = 0; + static { - ALGO_TO_REQUIRED_FIRST_SDK.put(CRYPT_AES_CBC, Build.VERSION_CODES.P); - ALGO_TO_REQUIRED_FIRST_SDK.put(AUTH_HMAC_MD5, Build.VERSION_CODES.P); - ALGO_TO_REQUIRED_FIRST_SDK.put(AUTH_HMAC_SHA1, Build.VERSION_CODES.P); - ALGO_TO_REQUIRED_FIRST_SDK.put(AUTH_HMAC_SHA256, Build.VERSION_CODES.P); - ALGO_TO_REQUIRED_FIRST_SDK.put(AUTH_HMAC_SHA384, Build.VERSION_CODES.P); - ALGO_TO_REQUIRED_FIRST_SDK.put(AUTH_HMAC_SHA512, Build.VERSION_CODES.P); - ALGO_TO_REQUIRED_FIRST_SDK.put(AUTH_CRYPT_AES_GCM, Build.VERSION_CODES.P); + ALGO_TO_REQUIRED_FIRST_SDK.put(CRYPT_AES_CBC, SDK_VERSION_ZERO); + ALGO_TO_REQUIRED_FIRST_SDK.put(AUTH_HMAC_MD5, SDK_VERSION_ZERO); + ALGO_TO_REQUIRED_FIRST_SDK.put(AUTH_HMAC_SHA1, SDK_VERSION_ZERO); + ALGO_TO_REQUIRED_FIRST_SDK.put(AUTH_HMAC_SHA256, SDK_VERSION_ZERO); + ALGO_TO_REQUIRED_FIRST_SDK.put(AUTH_HMAC_SHA384, SDK_VERSION_ZERO); + ALGO_TO_REQUIRED_FIRST_SDK.put(AUTH_HMAC_SHA512, SDK_VERSION_ZERO); + ALGO_TO_REQUIRED_FIRST_SDK.put(AUTH_CRYPT_AES_GCM, SDK_VERSION_ZERO); // STOPSHIP: b/170424293 Use Build.VERSION_CODES.S when it is defined ALGO_TO_REQUIRED_FIRST_SDK.put(CRYPT_AES_CTR, Build.VERSION_CODES.R + 1); diff --git a/core/java/android/net/LinkAddress.java b/core/java/android/net/LinkAddress.java index 772c685856c7..d1bdaa078cdc 100644 --- a/core/java/android/net/LinkAddress.java +++ b/core/java/android/net/LinkAddress.java @@ -30,7 +30,6 @@ import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.os.Build; import android.os.Parcel; @@ -158,7 +157,6 @@ public class LinkAddress implements Parcelable { * @return true if the address is IPv6. * @hide */ - @TestApi @SystemApi public boolean isIpv6() { return address instanceof Inet6Address; @@ -180,7 +178,6 @@ public class LinkAddress implements Parcelable { * @return true if the address is IPv4 or is a mapped IPv4 address. * @hide */ - @TestApi @SystemApi public boolean isIpv4() { return address instanceof Inet4Address; @@ -243,7 +240,6 @@ public class LinkAddress implements Parcelable { * @hide */ @SystemApi - @TestApi public LinkAddress(@NonNull InetAddress address, @IntRange(from = 0, to = 128) int prefixLength, int flags, int scope) { init(address, prefixLength, flags, scope, LIFETIME_UNKNOWN, LIFETIME_UNKNOWN); @@ -275,7 +271,6 @@ public class LinkAddress implements Parcelable { * @hide */ @SystemApi - @TestApi public LinkAddress(@NonNull InetAddress address, @IntRange(from = 0, to = 128) int prefixLength, int flags, int scope, long deprecationTime, long expirationTime) { init(address, prefixLength, flags, scope, deprecationTime, expirationTime); @@ -289,7 +284,6 @@ public class LinkAddress implements Parcelable { * @hide */ @SystemApi - @TestApi public LinkAddress(@NonNull InetAddress address, @IntRange(from = 0, to = 128) int prefixLength) { this(address, prefixLength, 0, 0); @@ -314,7 +308,6 @@ public class LinkAddress implements Parcelable { * @hide */ @SystemApi - @TestApi public LinkAddress(@NonNull String address) { this(address, 0, 0); this.scope = scopeForUnicastAddress(this.address); @@ -329,7 +322,6 @@ public class LinkAddress implements Parcelable { * @hide */ @SystemApi - @TestApi public LinkAddress(@NonNull String address, int flags, int scope) { // This may throw an IllegalArgumentException; catching it is the caller's responsibility. // TODO: consider rejecting mapped IPv4 addresses such as "::ffff:192.0.2.5/24". @@ -389,7 +381,6 @@ public class LinkAddress implements Parcelable { * otherwise. * @hide */ - @TestApi @SystemApi public boolean isSameAddressAs(@Nullable LinkAddress other) { if (other == null) { @@ -469,7 +460,6 @@ public class LinkAddress implements Parcelable { * @hide */ @SystemApi - @TestApi public long getDeprecationTime() { return deprecationTime; } @@ -485,7 +475,6 @@ public class LinkAddress implements Parcelable { * @hide */ @SystemApi - @TestApi public long getExpirationTime() { return expirationTime; } @@ -496,7 +485,6 @@ public class LinkAddress implements Parcelable { * * @hide */ - @TestApi @SystemApi public boolean isGlobalPreferred() { /** diff --git a/core/java/android/net/LinkProperties.java b/core/java/android/net/LinkProperties.java index 7cb3f920cf93..25a76f43553a 100644 --- a/core/java/android/net/LinkProperties.java +++ b/core/java/android/net/LinkProperties.java @@ -19,7 +19,6 @@ package android.net; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.net.util.LinkPropertiesUtils; import android.os.Build; @@ -161,7 +160,6 @@ public final class LinkProperties implements Parcelable { * @hide */ @SystemApi - @TestApi public LinkProperties(@Nullable LinkProperties source) { this(source, false /* parcelSensitiveFields */); } @@ -177,7 +175,6 @@ public final class LinkProperties implements Parcelable { * @hide */ @SystemApi - @TestApi public LinkProperties(@Nullable LinkProperties source, boolean parcelSensitiveFields) { mParcelSensitiveFields = parcelSensitiveFields; if (source == null) return; @@ -292,7 +289,6 @@ public final class LinkProperties implements Parcelable { * @hide */ @SystemApi - @TestApi public boolean addLinkAddress(@NonNull LinkAddress address) { if (address == null) { return false; @@ -321,7 +317,6 @@ public final class LinkProperties implements Parcelable { * @hide */ @SystemApi - @TestApi public boolean removeLinkAddress(@NonNull LinkAddress toRemove) { int i = findLinkAddressIndex(toRemove); if (i >= 0) { @@ -375,7 +370,6 @@ public final class LinkProperties implements Parcelable { * @return true if the DNS server was added, false if it was already present. * @hide */ - @TestApi @SystemApi public boolean addDnsServer(@NonNull InetAddress dnsServer) { if (dnsServer != null && !mDnses.contains(dnsServer)) { @@ -392,7 +386,6 @@ public final class LinkProperties implements Parcelable { * @return true if the DNS server was removed, false if it did not exist. * @hide */ - @TestApi @SystemApi public boolean removeDnsServer(@NonNull InetAddress dnsServer) { return mDnses.remove(dnsServer); @@ -427,7 +420,6 @@ public final class LinkProperties implements Parcelable { * @param usePrivateDns The private DNS state. * @hide */ - @TestApi @SystemApi public void setUsePrivateDns(boolean usePrivateDns) { mUsePrivateDns = usePrivateDns; @@ -454,7 +446,6 @@ public final class LinkProperties implements Parcelable { * @param privateDnsServerName The private DNS server name. * @hide */ - @TestApi @SystemApi public void setPrivateDnsServerName(@Nullable String privateDnsServerName) { mPrivateDnsServerName = privateDnsServerName; @@ -533,7 +524,6 @@ public final class LinkProperties implements Parcelable { * object. * @hide */ - @TestApi @SystemApi public void setValidatedPrivateDnsServers(@NonNull Collection<InetAddress> dnsServers) { mValidatedPrivateDnses.clear(); @@ -550,7 +540,6 @@ public final class LinkProperties implements Parcelable { * DNS servers on this link. * @hide */ - @TestApi @SystemApi public @NonNull List<InetAddress> getValidatedPrivateDnsServers() { return Collections.unmodifiableList(mValidatedPrivateDnses); @@ -591,7 +580,6 @@ public final class LinkProperties implements Parcelable { * @hide */ @SystemApi - @TestApi public void setPcscfServers(@NonNull Collection<InetAddress> pcscfServers) { mPcscfs.clear(); for (InetAddress pcscfServer: pcscfServers) { @@ -607,7 +595,6 @@ public final class LinkProperties implements Parcelable { * @hide */ @SystemApi - @TestApi public @NonNull List<InetAddress> getPcscfServers() { return Collections.unmodifiableList(mPcscfs); } @@ -661,7 +648,6 @@ public final class LinkProperties implements Parcelable { * * @hide */ - @TestApi @SystemApi public void setTcpBufferSizes(@Nullable String tcpBufferSizes) { mTcpBufferSizes = tcpBufferSizes; @@ -674,7 +660,6 @@ public final class LinkProperties implements Parcelable { * * @hide */ - @TestApi @SystemApi public @Nullable String getTcpBufferSizes() { return mTcpBufferSizes; @@ -743,7 +728,6 @@ public final class LinkProperties implements Parcelable { * * @hide */ - @TestApi @SystemApi public boolean removeRoute(@NonNull RouteInfo route) { return Objects.equals(mIfaceName, route.getInterface()) && mRoutes.remove(route); @@ -1020,7 +1004,6 @@ public final class LinkProperties implements Parcelable { * @return {@code true} if there is an IPv4 address, {@code false} otherwise. * @hide */ - @TestApi @SystemApi public boolean hasIpv4Address() { for (LinkAddress address : mLinkAddresses) { @@ -1061,7 +1044,6 @@ public final class LinkProperties implements Parcelable { * @return {@code true} if there is a global preferred IPv6 address, {@code false} otherwise. * @hide */ - @TestApi @SystemApi public boolean hasGlobalIpv6Address() { for (LinkAddress address : mLinkAddresses) { @@ -1148,7 +1130,6 @@ public final class LinkProperties implements Parcelable { * @return {@code true} if there is an IPv6 default route, {@code false} otherwise. * @hide */ - @TestApi @SystemApi public boolean hasIpv6DefaultRoute() { for (RouteInfo r : mRoutes) { @@ -1264,7 +1245,6 @@ public final class LinkProperties implements Parcelable { * @return {@code true} if the link is provisioned, {@code false} otherwise. * @hide */ - @TestApi @SystemApi public boolean isIpv4Provisioned() { return (hasIpv4Address() @@ -1279,7 +1259,6 @@ public final class LinkProperties implements Parcelable { * @return {@code true} if the link is provisioned, {@code false} otherwise. * @hide */ - @TestApi @SystemApi public boolean isIpv6Provisioned() { return (hasGlobalIpv6Address() @@ -1307,7 +1286,6 @@ public final class LinkProperties implements Parcelable { * @return {@code true} if the link is provisioned, {@code false} otherwise. * @hide */ - @TestApi @SystemApi public boolean isProvisioned() { return (isIpv4Provisioned() || isIpv6Provisioned()); @@ -1320,7 +1298,6 @@ public final class LinkProperties implements Parcelable { * {@code false} otherwise. * @hide */ - @TestApi @SystemApi public boolean isReachable(@NonNull InetAddress ip) { final List<RouteInfo> allRoutes = getAllRoutes(); @@ -1577,7 +1554,6 @@ public final class LinkProperties implements Parcelable { * @hide */ @SystemApi - @TestApi public void setCaptivePortalApiUrl(@Nullable Uri url) { mCaptivePortalApiUrl = url; } @@ -1592,7 +1568,6 @@ public final class LinkProperties implements Parcelable { * @hide */ @SystemApi - @TestApi @Nullable public Uri getCaptivePortalApiUrl() { return mCaptivePortalApiUrl; @@ -1603,7 +1578,6 @@ public final class LinkProperties implements Parcelable { * @hide */ @SystemApi - @TestApi public void setCaptivePortalData(@Nullable CaptivePortalData data) { mCaptivePortalData = data; } @@ -1617,7 +1591,6 @@ public final class LinkProperties implements Parcelable { * @hide */ @SystemApi - @TestApi @Nullable public CaptivePortalData getCaptivePortalData() { return mCaptivePortalData; diff --git a/core/java/android/net/Network.java b/core/java/android/net/Network.java index 10ee72e48ecc..3e4f73555e58 100644 --- a/core/java/android/net/Network.java +++ b/core/java/android/net/Network.java @@ -19,7 +19,6 @@ package android.net; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; @@ -128,7 +127,6 @@ public class Network implements Parcelable { * @hide */ @SystemApi - @TestApi public Network(@NonNull Network that) { this(that.netId, that.mPrivateDnsBypass); } @@ -165,7 +163,6 @@ public class Network implements Parcelable { * * @hide */ - @TestApi @SystemApi public @NonNull Network getPrivateDnsBypassingCopy() { return new Network(netId, true); @@ -176,7 +173,6 @@ public class Network implements Parcelable { * * @hide */ - @TestApi @SystemApi public int getNetId() { return netId; diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java index 004f84422b44..be33f4edb5d1 100644 --- a/core/java/android/net/NetworkCapabilities.java +++ b/core/java/android/net/NetworkCapabilities.java @@ -850,7 +850,6 @@ public final class NetworkCapabilities implements Parcelable { * @return an array of transport type values for this instance. * @hide */ - @TestApi @SystemApi @NonNull public @Transport int[] getTransportTypes() { return BitUtils.unpackBits(mTransportTypes); @@ -1025,7 +1024,6 @@ public final class NetworkCapabilities implements Parcelable { */ @NonNull @SystemApi - @TestApi public int[] getAdministratorUids() { return Arrays.copyOf(mAdministratorUids, mAdministratorUids.length); } @@ -1506,7 +1504,6 @@ public final class NetworkCapabilities implements Parcelable { * @hide */ @SystemApi - @TestApi public @Nullable String getSsid() { return mSSID; } @@ -1590,7 +1587,6 @@ public final class NetworkCapabilities implements Parcelable { * * @hide */ - @TestApi @SystemApi public boolean satisfiedByNetworkCapabilities(@Nullable NetworkCapabilities nc) { return satisfiedByNetworkCapabilities(nc, false); @@ -2136,7 +2132,6 @@ public final class NetworkCapabilities implements Parcelable { * @hide */ @SystemApi - @TestApi public static final class Builder { private final NetworkCapabilities mCaps; diff --git a/core/java/android/net/NetworkStack.java b/core/java/android/net/NetworkStack.java index 86f3dfd412f6..79f9e6ef2a97 100644 --- a/core/java/android/net/NetworkStack.java +++ b/core/java/android/net/NetworkStack.java @@ -33,7 +33,6 @@ import java.util.Arrays; * @hide */ @SystemApi -@TestApi public class NetworkStack { /** * Permission granted only to the NetworkStack APK, defined in NetworkStackStub with signature @@ -41,7 +40,6 @@ public class NetworkStack { * @hide */ @SystemApi - @TestApi public static final String PERMISSION_MAINLINE_NETWORK_STACK = "android.permission.MAINLINE_NETWORK_STACK"; @@ -54,7 +52,6 @@ public class NetworkStack { */ @Nullable @SystemApi - @TestApi public static IBinder getService() { final IBinder mockService = sMockService; if (mockService != null) return mockService; diff --git a/core/java/android/net/RouteInfo.java b/core/java/android/net/RouteInfo.java index d9568756bbac..93ad41f7c524 100644 --- a/core/java/android/net/RouteInfo.java +++ b/core/java/android/net/RouteInfo.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.net.util.NetUtils; import android.os.Build; @@ -87,17 +86,14 @@ public final class RouteInfo implements Parcelable { /** Unicast route. @hide */ @SystemApi - @TestApi public static final int RTN_UNICAST = 1; /** Unreachable route. @hide */ @SystemApi - @TestApi public static final int RTN_UNREACHABLE = 7; /** Throw route. @hide */ @SystemApi - @TestApi public static final int RTN_THROW = 9; /** @@ -135,7 +131,6 @@ public final class RouteInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public RouteInfo(@Nullable IpPrefix destination, @Nullable InetAddress gateway, @Nullable String iface, @RouteType int type) { this(destination, gateway, iface, type, 0); @@ -397,7 +392,6 @@ public final class RouteInfo implements Parcelable { * * @hide */ - @TestApi @SystemApi @RouteType public int getType() { diff --git a/core/java/android/net/StaticIpConfiguration.java b/core/java/android/net/StaticIpConfiguration.java index a973455baa04..f56d656f07ed 100644 --- a/core/java/android/net/StaticIpConfiguration.java +++ b/core/java/android/net/StaticIpConfiguration.java @@ -19,7 +19,6 @@ package android.net; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; @@ -52,7 +51,6 @@ import java.util.Objects; * @hide */ @SystemApi -@TestApi public final class StaticIpConfiguration implements Parcelable { /** @hide */ @UnsupportedAppUsage diff --git a/core/java/android/net/apf/ApfCapabilities.java b/core/java/android/net/apf/ApfCapabilities.java index 92c543294ae1..bf5b26e278f9 100644 --- a/core/java/android/net/apf/ApfCapabilities.java +++ b/core/java/android/net/apf/ApfCapabilities.java @@ -19,7 +19,6 @@ package android.net.apf; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.res.Resources; import android.os.Parcel; import android.os.Parcelable; @@ -36,7 +35,6 @@ import com.android.internal.R; * @hide */ @SystemApi -@TestApi public final class ApfCapabilities implements Parcelable { /** * Version of APF instruction set supported for packet filtering. 0 indicates no support for diff --git a/core/java/android/net/metrics/ApfProgramEvent.java b/core/java/android/net/metrics/ApfProgramEvent.java index f93907a37f3f..c50bae90488b 100644 --- a/core/java/android/net/metrics/ApfProgramEvent.java +++ b/core/java/android/net/metrics/ApfProgramEvent.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; @@ -40,7 +39,6 @@ import java.util.List; * the APF program in place with a new APF program. * {@hide} */ -@TestApi @SystemApi public final class ApfProgramEvent implements IpConnectivityLog.Event { diff --git a/core/java/android/net/metrics/ApfStats.java b/core/java/android/net/metrics/ApfStats.java index b221cb97b28f..2a601b273ef4 100644 --- a/core/java/android/net/metrics/ApfStats.java +++ b/core/java/android/net/metrics/ApfStats.java @@ -19,7 +19,6 @@ package android.net.metrics; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; @@ -29,7 +28,6 @@ import android.os.Parcelable; * {@hide} */ @SystemApi -@TestApi public final class ApfStats implements IpConnectivityLog.Event { /** @@ -126,7 +124,6 @@ public final class ApfStats implements IpConnectivityLog.Event { * @hide */ @SystemApi - @TestApi public static final class Builder { private long mDurationMs; private int mReceivedRas; diff --git a/core/java/android/net/metrics/DhcpClientEvent.java b/core/java/android/net/metrics/DhcpClientEvent.java index 8fc1ef80bba9..e0a93dd1c18f 100644 --- a/core/java/android/net/metrics/DhcpClientEvent.java +++ b/core/java/android/net/metrics/DhcpClientEvent.java @@ -19,7 +19,6 @@ package android.net.metrics; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; @@ -30,7 +29,6 @@ import android.text.TextUtils; * {@hide} */ @SystemApi -@TestApi public final class DhcpClientEvent implements IpConnectivityLog.Event { // Names for recording DhcpClient pseudo-state transitions. diff --git a/core/java/android/net/metrics/DhcpErrorEvent.java b/core/java/android/net/metrics/DhcpErrorEvent.java index 32efb5adafcd..de3129d5e94d 100644 --- a/core/java/android/net/metrics/DhcpErrorEvent.java +++ b/core/java/android/net/metrics/DhcpErrorEvent.java @@ -18,7 +18,6 @@ package android.net.metrics; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; import android.util.SparseArray; @@ -30,7 +29,6 @@ import com.android.internal.util.MessageUtils; * {@hide} */ @SystemApi -@TestApi public final class DhcpErrorEvent implements IpConnectivityLog.Event { public static final int L2_ERROR = 1; public static final int L3_ERROR = 2; diff --git a/core/java/android/net/metrics/IpConnectivityLog.java b/core/java/android/net/metrics/IpConnectivityLog.java index 680c01573f98..a008d855025a 100644 --- a/core/java/android/net/metrics/IpConnectivityLog.java +++ b/core/java/android/net/metrics/IpConnectivityLog.java @@ -18,7 +18,6 @@ package android.net.metrics; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.net.ConnectivityMetricsEvent; import android.net.IIpConnectivityMetrics; import android.net.Network; @@ -35,7 +34,6 @@ import com.android.internal.util.BitUtils; * {@hide} */ @SystemApi -@TestApi public class IpConnectivityLog { private static final String TAG = IpConnectivityLog.class.getSimpleName(); private static final boolean DBG = false; @@ -52,7 +50,6 @@ public class IpConnectivityLog { /** @hide */ @SystemApi - @TestApi public IpConnectivityLog() { } diff --git a/core/java/android/net/metrics/IpManagerEvent.java b/core/java/android/net/metrics/IpManagerEvent.java index f14abb895cb4..4f7f3263117b 100644 --- a/core/java/android/net/metrics/IpManagerEvent.java +++ b/core/java/android/net/metrics/IpManagerEvent.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; import android.util.SparseArray; @@ -36,7 +35,6 @@ import java.lang.annotation.RetentionPolicy; * {@hide} */ @SystemApi -@TestApi public final class IpManagerEvent implements IpConnectivityLog.Event { public static final int PROVISIONING_OK = 1; diff --git a/core/java/android/net/metrics/IpReachabilityEvent.java b/core/java/android/net/metrics/IpReachabilityEvent.java index 79e01d7116b6..d5003badd614 100644 --- a/core/java/android/net/metrics/IpReachabilityEvent.java +++ b/core/java/android/net/metrics/IpReachabilityEvent.java @@ -19,7 +19,6 @@ package android.net.metrics; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; import android.util.SparseArray; @@ -32,7 +31,6 @@ import com.android.internal.util.MessageUtils; * {@hide} */ @SystemApi -@TestApi public final class IpReachabilityEvent implements IpConnectivityLog.Event { // Event types. diff --git a/core/java/android/net/metrics/NetworkEvent.java b/core/java/android/net/metrics/NetworkEvent.java index fe603cf9305c..8c28f7a7d643 100644 --- a/core/java/android/net/metrics/NetworkEvent.java +++ b/core/java/android/net/metrics/NetworkEvent.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; import android.util.SparseArray; @@ -34,7 +33,6 @@ import java.lang.annotation.RetentionPolicy; * {@hide} */ @SystemApi -@TestApi public final class NetworkEvent implements IpConnectivityLog.Event { public static final int NETWORK_CONNECTED = 1; diff --git a/core/java/android/net/metrics/RaEvent.java b/core/java/android/net/metrics/RaEvent.java index 661f648fc74e..b54874f5a573 100644 --- a/core/java/android/net/metrics/RaEvent.java +++ b/core/java/android/net/metrics/RaEvent.java @@ -19,7 +19,6 @@ package android.net.metrics; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -28,7 +27,6 @@ import android.os.Parcelable; * {@hide} */ @SystemApi -@TestApi public final class RaEvent implements IpConnectivityLog.Event { private static final long NO_LIFETIME = -1L; diff --git a/core/java/android/net/metrics/ValidationProbeEvent.java b/core/java/android/net/metrics/ValidationProbeEvent.java index 8fab64ae6c4e..7f4e4a73677e 100644 --- a/core/java/android/net/metrics/ValidationProbeEvent.java +++ b/core/java/android/net/metrics/ValidationProbeEvent.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; import android.util.SparseArray; @@ -35,7 +34,6 @@ import java.lang.annotation.RetentionPolicy; * {@hide} */ @SystemApi -@TestApi public final class ValidationProbeEvent implements IpConnectivityLog.Event { public static final int PROBE_DNS = 0; diff --git a/core/java/android/net/util/SocketUtils.java b/core/java/android/net/util/SocketUtils.java index 696708408c22..e64060f1b220 100644 --- a/core/java/android/net/util/SocketUtils.java +++ b/core/java/android/net/util/SocketUtils.java @@ -22,7 +22,6 @@ import static android.system.OsConstants.SO_BINDTODEVICE; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.net.NetworkUtils; import android.system.ErrnoException; import android.system.NetlinkSocketAddress; @@ -40,7 +39,6 @@ import java.net.SocketAddress; * @hide */ @SystemApi -@TestApi public final class SocketUtils { /** * Create a raw datagram socket that is bound to an interface. diff --git a/core/java/android/os/BatteryManager.java b/core/java/android/os/BatteryManager.java index 12ec0a0c21d5..9a16d3fee600 100644 --- a/core/java/android/os/BatteryManager.java +++ b/core/java/android/os/BatteryManager.java @@ -20,7 +20,6 @@ import android.Manifest.permission; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.Intent; @@ -392,7 +391,6 @@ public class BatteryManager { */ @RequiresPermission(permission.POWER_SAVER) @SystemApi - @TestApi public boolean setChargingStateUpdateDelayMillis(int delayMillis) { try { return mBatteryStats.setChargingStateUpdateDelayMillis(delayMillis); diff --git a/core/java/android/os/BugreportManager.java b/core/java/android/os/BugreportManager.java index 9e996d15fa84..fe4d7296503f 100644 --- a/core/java/android/os/BugreportManager.java +++ b/core/java/android/os/BugreportManager.java @@ -24,13 +24,13 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.app.ActivityManager; import android.content.Context; import android.content.Intent; import android.os.Handler; import android.util.Log; import android.widget.Toast; + import com.android.internal.R; import com.android.internal.util.Preconditions; @@ -48,7 +48,6 @@ import java.util.concurrent.Executor; * @hide */ @SystemApi -@TestApi @SystemService(Context.BUGREPORT_SERVICE) public final class BugreportManager { diff --git a/core/java/android/os/BugreportParams.java b/core/java/android/os/BugreportParams.java index c834781346f6..279ccae7c94f 100644 --- a/core/java/android/os/BugreportParams.java +++ b/core/java/android/os/BugreportParams.java @@ -18,7 +18,6 @@ package android.os; import android.annotation.IntDef; import android.annotation.SystemApi; -import android.annotation.TestApi; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -29,7 +28,6 @@ import java.lang.annotation.RetentionPolicy; * @hide */ @SystemApi -@TestApi public final class BugreportParams { private final int mMode; diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java index 085681d412e9..5745187fcbb9 100644 --- a/core/java/android/os/Environment.java +++ b/core/java/android/os/Environment.java @@ -256,7 +256,6 @@ public class Environment { * @hide */ @SystemApi - @TestApi public static @NonNull File getOemDirectory() { return DIR_OEM_ROOT; } @@ -268,7 +267,6 @@ public class Environment { * @hide */ @SystemApi - @TestApi public static @NonNull File getOdmDirectory() { return DIR_ODM_ROOT; } @@ -279,7 +277,6 @@ public class Environment { * @hide */ @SystemApi - @TestApi public static @NonNull File getVendorDirectory() { return DIR_VENDOR_ROOT; } @@ -291,7 +288,6 @@ public class Environment { * @hide */ @SystemApi - @TestApi public static @NonNull File getProductDirectory() { return DIR_PRODUCT_ROOT; } @@ -318,7 +314,6 @@ public class Environment { * @hide */ @SystemApi - @TestApi public static @NonNull File getSystemExtDirectory() { return DIR_SYSTEM_EXT_ROOT; } diff --git a/core/java/android/os/HidlMemory.java b/core/java/android/os/HidlMemory.java index 02d1e0ce9109..26fc6f0ae4ce 100644 --- a/core/java/android/os/HidlMemory.java +++ b/core/java/android/os/HidlMemory.java @@ -20,7 +20,6 @@ import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import java.io.Closeable; import java.io.IOException; @@ -41,7 +40,6 @@ import java.io.IOException; * @hide */ @SystemApi -@TestApi public class HidlMemory implements Closeable { private final @NonNull String mName; private final long mSize; diff --git a/core/java/android/os/HwBinder.java b/core/java/android/os/HwBinder.java index 64ab1d711765..0d2bfdf04905 100644 --- a/core/java/android/os/HwBinder.java +++ b/core/java/android/os/HwBinder.java @@ -17,7 +17,6 @@ package android.os; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import libcore.util.NativeAllocationRegistry; @@ -26,7 +25,6 @@ import java.util.NoSuchElementException; /** @hide */ @SystemApi -@TestApi public abstract class HwBinder implements IHwBinder { private static final String TAG = "HwBinder"; diff --git a/core/java/android/os/HwBlob.java b/core/java/android/os/HwBlob.java index 154227b2a786..a43fbdbde4d2 100644 --- a/core/java/android/os/HwBlob.java +++ b/core/java/android/os/HwBlob.java @@ -19,7 +19,6 @@ package android.os; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import libcore.util.NativeAllocationRegistry; @@ -30,7 +29,6 @@ import libcore.util.NativeAllocationRegistry; * @hide */ @SystemApi -@TestApi public class HwBlob { private static final String TAG = "HwBlob"; diff --git a/core/java/android/os/HwParcel.java b/core/java/android/os/HwParcel.java index 228548ad7802..9fd37d4548ac 100644 --- a/core/java/android/os/HwParcel.java +++ b/core/java/android/os/HwParcel.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import dalvik.annotation.optimization.FastNative; @@ -34,7 +33,6 @@ import java.util.Arrays; /** @hide */ @SystemApi -@TestApi public class HwParcel { private static final String TAG = "HwParcel"; diff --git a/core/java/android/os/IHwBinder.java b/core/java/android/os/IHwBinder.java index 46fa6ef3b783..249eb3aa3456 100644 --- a/core/java/android/os/IHwBinder.java +++ b/core/java/android/os/IHwBinder.java @@ -17,11 +17,9 @@ package android.os; import android.annotation.SystemApi; -import android.annotation.TestApi; /** @hide */ @SystemApi -@TestApi public interface IHwBinder { /** * Process a hwbinder transaction. diff --git a/core/java/android/os/IHwInterface.java b/core/java/android/os/IHwInterface.java index 0a5a71550b06..f21f6e30a041 100644 --- a/core/java/android/os/IHwInterface.java +++ b/core/java/android/os/IHwInterface.java @@ -17,11 +17,9 @@ package android.os; import android.annotation.SystemApi; -import android.annotation.TestApi; /** @hide */ @SystemApi -@TestApi public interface IHwInterface { /** * @return the binder object that corresponds to this interface. diff --git a/core/java/android/os/IncidentManager.java b/core/java/android/os/IncidentManager.java index 565d31a26dbc..a543a2d6a983 100644 --- a/core/java/android/os/IncidentManager.java +++ b/core/java/android/os/IncidentManager.java @@ -23,7 +23,6 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.content.Context; import android.net.Uri; import android.util.Slog; @@ -45,7 +44,6 @@ import java.util.concurrent.Executor; * @hide */ @SystemApi -@TestApi @SystemService(Context.INCIDENT_SERVICE) public class IncidentManager { private static final String TAG = "IncidentManager"; @@ -159,7 +157,6 @@ public class IncidentManager { * @hide */ @SystemApi - @TestApi public static class PendingReport { /** * Encoded data. @@ -277,7 +274,6 @@ public class IncidentManager { * @hide */ @SystemApi - @TestApi public static class IncidentReport implements Parcelable, Closeable { private final long mTimestampNs; private final int mPrivacyPolicy; diff --git a/core/java/android/os/IncidentReportArgs.java b/core/java/android/os/IncidentReportArgs.java index 7e858e1dc390..73e4914ce6ae 100644 --- a/core/java/android/os/IncidentReportArgs.java +++ b/core/java/android/os/IncidentReportArgs.java @@ -18,7 +18,6 @@ package android.os; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; import android.util.IntArray; @@ -30,7 +29,6 @@ import java.util.ArrayList; * {@hide} */ @SystemApi -@TestApi public final class IncidentReportArgs implements Parcelable { private final IntArray mSections = new IntArray(); diff --git a/core/java/android/os/NativeHandle.java b/core/java/android/os/NativeHandle.java index 8d341b603eb4..a26873a87552 100644 --- a/core/java/android/os/NativeHandle.java +++ b/core/java/android/os/NativeHandle.java @@ -20,7 +20,6 @@ import static android.system.OsConstants.F_DUPFD_CLOEXEC; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.system.ErrnoException; import android.system.Os; @@ -33,7 +32,6 @@ import java.io.FileDescriptor; * @hide */ @SystemApi -@TestApi public final class NativeHandle implements Closeable { // whether this object owns mFds private boolean mOwn = false; diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index 50f0c28cb8f8..000b23f5d5ca 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -1565,7 +1565,6 @@ public final class PowerManager { * @see #isPowerSaveMode() */ @SystemApi - @TestApi @RequiresPermission(anyOf = { android.Manifest.permission.DEVICE_POWER, android.Manifest.permission.POWER_SAVER @@ -1610,7 +1609,6 @@ public final class PowerManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(permission.POWER_SAVER) public boolean setDynamicPowerSaveHint(boolean powerSaveHint, int disableThreshold) { try { @@ -1670,7 +1668,6 @@ public final class PowerManager { * @hide */ @SystemApi - @TestApi public static final int POWER_SAVE_MODE_TRIGGER_PERCENTAGE = 0; /** @@ -1683,7 +1680,6 @@ public final class PowerManager { * @hide */ @SystemApi - @TestApi public static final int POWER_SAVE_MODE_TRIGGER_DYNAMIC = 1; /** @hide */ @@ -1708,7 +1704,6 @@ public final class PowerManager { */ @AutoPowerSaveModeTriggers @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.POWER_SAVER) public int getPowerSaveModeTrigger() { try { @@ -1732,7 +1727,6 @@ public final class PowerManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.DEVICE_POWER) public void setBatteryDischargePrediction(@NonNull Duration timeRemaining, boolean isPersonalized) { diff --git a/core/java/android/os/RemoteCallback.java b/core/java/android/os/RemoteCallback.java index 373060f4ff4b..49f84adf2c21 100644 --- a/core/java/android/os/RemoteCallback.java +++ b/core/java/android/os/RemoteCallback.java @@ -19,14 +19,12 @@ package android.os; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; /** * @hide */ @SystemApi -@TestApi public final class RemoteCallback implements Parcelable { public interface OnResultListener { diff --git a/core/java/android/os/SystemConfigManager.java b/core/java/android/os/SystemConfigManager.java index 12a1ffaf69c1..3f0632be90d1 100644 --- a/core/java/android/os/SystemConfigManager.java +++ b/core/java/android/os/SystemConfigManager.java @@ -20,7 +20,6 @@ import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.content.Context; import android.util.ArraySet; import android.util.Log; @@ -40,7 +39,6 @@ import java.util.Set; * @hide */ @SystemApi -@TestApi @SystemService(Context.SYSTEM_CONFIG_SERVICE) public class SystemConfigManager { private static final String TAG = SystemConfigManager.class.getSimpleName(); diff --git a/core/java/android/os/SystemProperties.java b/core/java/android/os/SystemProperties.java index c5e5cc40d54e..a16452705efc 100644 --- a/core/java/android/os/SystemProperties.java +++ b/core/java/android/os/SystemProperties.java @@ -19,7 +19,6 @@ package android.os; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.util.Log; import android.util.MutableInt; @@ -52,7 +51,6 @@ import java.util.HashMap; * {@hide} */ @SystemApi -@TestApi public class SystemProperties { private static final String TAG = "SystemProperties"; private static final boolean TRACK_KEY_ACCESS = false; @@ -146,7 +144,6 @@ public class SystemProperties { */ @NonNull @SystemApi - @TestApi public static String get(@NonNull String key) { if (TRACK_KEY_ACCESS) onKeyAccess(key); return native_get(key); @@ -163,7 +160,6 @@ public class SystemProperties { */ @NonNull @SystemApi - @TestApi public static String get(@NonNull String key, @Nullable String def) { if (TRACK_KEY_ACCESS) onKeyAccess(key); return native_get(key, def); @@ -179,7 +175,6 @@ public class SystemProperties { * @hide */ @SystemApi - @TestApi public static int getInt(@NonNull String key, int def) { if (TRACK_KEY_ACCESS) onKeyAccess(key); return native_get_int(key, def); @@ -195,7 +190,6 @@ public class SystemProperties { * @hide */ @SystemApi - @TestApi public static long getLong(@NonNull String key, long def) { if (TRACK_KEY_ACCESS) onKeyAccess(key); return native_get_long(key, def); @@ -216,7 +210,6 @@ public class SystemProperties { * @hide */ @SystemApi - @TestApi public static boolean getBoolean(@NonNull String key, boolean def) { if (TRACK_KEY_ACCESS) onKeyAccess(key); return native_get_boolean(key, def); diff --git a/core/java/android/os/UserHandle.java b/core/java/android/os/UserHandle.java index 60447e76f75e..d39c5328e330 100644 --- a/core/java/android/os/UserHandle.java +++ b/core/java/android/os/UserHandle.java @@ -47,7 +47,6 @@ public final class UserHandle implements Parcelable { /** @hide A user handle to indicate all users on the device */ @SystemApi - @TestApi public static final @NonNull UserHandle ALL = new UserHandle(USER_ALL); /** @hide A user id to indicate the currently active user */ @@ -56,7 +55,6 @@ public final class UserHandle implements Parcelable { /** @hide A user handle to indicate the current user of the device */ @SystemApi - @TestApi public static final @NonNull UserHandle CURRENT = new UserHandle(USER_CURRENT); /** @hide A user id to indicate that we would like to send to the current @@ -107,7 +105,6 @@ public final class UserHandle implements Parcelable { /** @hide A user handle to indicate the "system" user of the device */ @SystemApi - @TestApi public static final @NonNull UserHandle SYSTEM = new UserHandle(USER_SYSTEM); /** @@ -280,7 +277,6 @@ public final class UserHandle implements Parcelable { } /** @hide */ - @TestApi @SystemApi public static UserHandle of(@UserIdInt int userId) { if (userId == USER_SYSTEM) { @@ -325,7 +321,6 @@ public final class UserHandle implements Parcelable { * Returns the app id (or base uid) for a given uid, stripping out the user id from it. * @hide */ - @TestApi @SystemApi public static @AppIdInt int getAppId(int uid) { return uid % PER_USER_RANGE; @@ -483,7 +478,6 @@ public final class UserHandle implements Parcelable { * @hide */ @SystemApi - @TestApi public static @UserIdInt int myUserId() { return getUserId(Process.myUid()); } @@ -522,7 +516,6 @@ public final class UserHandle implements Parcelable { * @hide */ @SystemApi - @TestApi public @UserIdInt int getIdentifier() { return mHandle; } diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 42ae93030f38..b0e76e3ea851 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -1407,8 +1407,7 @@ public class UserManager { * * @hide */ - @SystemApi - @TestApi // To allow seeing it from CTS. + @SystemApi // To allow seeing it from CTS. public static final String ACTION_USER_RESTRICTIONS_CHANGED = "android.os.action.USER_RESTRICTIONS_CHANGED"; @@ -1468,6 +1467,48 @@ public class UserManager { public @interface UserSwitchabilityResult {} /** + * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that the specified + * user has been successfully removed. + * @hide + */ + public static final int REMOVE_RESULT_REMOVED = 0; + + /** + * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that the specified + * user has had its {@link UserInfo#FLAG_EPHEMERAL} flag set to {@code true}, so that it will be + * removed when the user is stopped or on boot. + * @hide + */ + public static final int REMOVE_RESULT_SET_EPHEMERAL = 1; + + /** + * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that the specified + * user is already in the process of being removed. + * @hide + */ + public static final int REMOVE_RESULT_ALREADY_BEING_REMOVED = 2; + + /** + * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that an error occurred + * that prevented the user from being removed or set as ephemeral. + * @hide + */ + public static final int REMOVE_RESULT_ERROR = 3; + + /** + * Possible response codes from {@link #removeUserOrSetEphemeral(int)}. + * @hide + */ + @IntDef(prefix = { "REMOVE_RESULT_" }, value = { + REMOVE_RESULT_REMOVED, + REMOVE_RESULT_SET_EPHEMERAL, + REMOVE_RESULT_ALREADY_BEING_REMOVED, + REMOVE_RESULT_ERROR, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface RemoveResult {} + + /** * Indicates user operation is successful. */ public static final int USER_OPERATION_SUCCESS = 0; @@ -3982,11 +4023,11 @@ public class UserManager { * the current user, then set the user as ephemeral so that it will be removed when it is * stopped. * - * @return the {@link com.android.server.pm.UserManagerService.RemoveResult} code + * @return the {@link RemoveResult} code * @hide */ @RequiresPermission(android.Manifest.permission.MANAGE_USERS) - public int removeUserOrSetEphemeral(@UserIdInt int userId) { + public @RemoveResult int removeUserOrSetEphemeral(@UserIdInt int userId) { try { return mService.removeUserOrSetEphemeral(userId); } catch (RemoteException re) { diff --git a/core/java/android/os/Vibrator.java b/core/java/android/os/Vibrator.java index 0c0e6b5d73a6..7d85d13094a1 100644 --- a/core/java/android/os/Vibrator.java +++ b/core/java/android/os/Vibrator.java @@ -23,7 +23,6 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.app.ActivityThread; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; @@ -469,7 +468,6 @@ public abstract class Vibrator { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.ACCESS_VIBRATOR_STATE) public boolean isVibrating() { return false; @@ -483,7 +481,6 @@ public abstract class Vibrator { * @hide */ @SystemApi - @TestApi public interface OnVibratorStateChangedListener { /** * Called when the vibrator state has changed. @@ -502,7 +499,6 @@ public abstract class Vibrator { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.ACCESS_VIBRATOR_STATE) public void addVibratorStateListener(@NonNull OnVibratorStateChangedListener listener) { } @@ -516,7 +512,6 @@ public abstract class Vibrator { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.ACCESS_VIBRATOR_STATE) public void addVibratorStateListener( @NonNull @CallbackExecutor Executor executor, @@ -531,7 +526,6 @@ public abstract class Vibrator { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.ACCESS_VIBRATOR_STATE) public void removeVibratorStateListener(@NonNull OnVibratorStateChangedListener listener) { } diff --git a/core/java/android/os/WorkSource.java b/core/java/android/os/WorkSource.java index a1b4dc3ffded..e0927ebd261a 100644 --- a/core/java/android/os/WorkSource.java +++ b/core/java/android/os/WorkSource.java @@ -98,7 +98,6 @@ public class WorkSource implements Parcelable { * @param uid the uid performing the work * @hide */ - @TestApi @SystemApi public WorkSource(int uid) { mNum = 1; @@ -152,7 +151,6 @@ public class WorkSource implements Parcelable { * Returns the number of uids in this work source. * @hide */ - @TestApi @SystemApi public int size() { return mNum; @@ -173,7 +171,6 @@ public class WorkSource implements Parcelable { * If {@code index} < 0 or {@code index} >= {@link #size() N}, then the behavior is undefined. * @hide */ - @TestApi @SystemApi public int getUid(int index) { return mUids[index]; @@ -209,7 +206,6 @@ public class WorkSource implements Parcelable { * If {@code index} < 0 or {@code index} >= {@link #size() N}, then the behavior is undefined. * @hide */ - @TestApi @SystemApi @Nullable public String getPackageName(int index) { @@ -455,7 +451,6 @@ public class WorkSource implements Parcelable { * @hide */ @SystemApi - @TestApi @NonNull public WorkSource withoutNames() { final WorkSource copy = new WorkSource(this); @@ -582,7 +577,6 @@ public class WorkSource implements Parcelable { * @hide for internal use only. */ @SystemApi - @TestApi public boolean isEmpty() { return mNum == 0 && (mChains == null || mChains.isEmpty()); } diff --git a/core/java/android/os/image/DynamicSystemClient.java b/core/java/android/os/image/DynamicSystemClient.java index 50d8d8079ed5..58268e2fc914 100644 --- a/core/java/android/os/image/DynamicSystemClient.java +++ b/core/java/android/os/image/DynamicSystemClient.java @@ -22,7 +22,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -68,7 +67,6 @@ import java.util.concurrent.Executor; * @hide */ @SystemApi -@TestApi public class DynamicSystemClient { /** @hide */ @IntDef(prefix = { "STATUS_" }, value = { @@ -286,7 +284,6 @@ public class DynamicSystemClient { * @hide */ @SystemApi - @TestApi public DynamicSystemClient(@NonNull Context context) { mContext = context; mConnection = new DynSystemServiceConnection(); @@ -322,7 +319,6 @@ public class DynamicSystemClient { */ @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM) @SystemApi - @TestApi public void bind() { if (!featureFlagEnabled()) { Slog.w(TAG, FeatureFlagUtils.DYNAMIC_SYSTEM + " not enabled; bind() aborted."); @@ -345,7 +341,6 @@ public class DynamicSystemClient { */ @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM) @SystemApi - @TestApi public void unbind() { if (!mBound) { return; @@ -381,7 +376,6 @@ public class DynamicSystemClient { */ @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM) @SystemApi - @TestApi public void start(@NonNull Uri systemUrl, @BytesLong long systemSize) { start(systemUrl, systemSize, 0 /* Use the default userdata size */); } diff --git a/core/java/android/os/incremental/IIncrementalService.aidl b/core/java/android/os/incremental/IIncrementalService.aidl index 52475e9cd89d..ca92ad5deae6 100644 --- a/core/java/android/os/incremental/IIncrementalService.aidl +++ b/core/java/android/os/incremental/IIncrementalService.aidl @@ -144,4 +144,14 @@ interface IIncrementalService { * Stop listening for the loading progress change for a storage. */ boolean unregisterLoadingProgressListener(int storageId); + + /** + * Register storage health status listener. + */ + boolean registerStorageHealthListener(int storageId, in StorageHealthCheckParams params, in IStorageHealthListener listener); + + /** + * Register storage health status listener. + */ + void unregisterStorageHealthListener(int storageId); } diff --git a/core/java/android/os/incremental/IStorageHealthListener.aidl b/core/java/android/os/incremental/IStorageHealthListener.aidl index 9f93ede5c9fc..c71e73f9ec8e 100644 --- a/core/java/android/os/incremental/IStorageHealthListener.aidl +++ b/core/java/android/os/incremental/IStorageHealthListener.aidl @@ -26,9 +26,15 @@ oneway interface IStorageHealthListener { /** There are reads pending for params.blockedTimeoutMs, waiting till * params.unhealthyTimeoutMs to confirm unhealthy state. */ const int HEALTH_STATUS_BLOCKED = 2; - /** There are reads pending for params.unhealthyTimeoutMs>, - * marking storage as unhealthy. */ + /** There are reads pending for params.unhealthyTimeoutMs, + * marking storage as unhealthy due to unknown issues. */ const int HEALTH_STATUS_UNHEALTHY = 3; + /** There are reads pending for params.unhealthyTimeoutMs, + * due to data transportation issues. */ + const int HEALTH_STATUS_UNHEALTHY_TRANSPORT = 4; + /** There are reads pending for params.unhealthyTimeoutMs, + * due to limited storage space. */ + const int HEALTH_STATUS_UNHEALTHY_STORAGE = 5; /** Health status callback. */ void onHealthStatus(in int storageId, in int status); diff --git a/core/java/android/os/incremental/IncrementalManager.java b/core/java/android/os/incremental/IncrementalManager.java index 768ef975bd99..fb47ef04b231 100644 --- a/core/java/android/os/incremental/IncrementalManager.java +++ b/core/java/android/os/incremental/IncrementalManager.java @@ -283,6 +283,7 @@ public final class IncrementalManager { return; } mLoadingProgressCallbacks.cleanUpCallbacks(storage); + unregisterHealthListener(codePath); mService.deleteStorage(storage.getId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); @@ -297,7 +298,7 @@ public final class IncrementalManager { * @param callback To report loading progress to. * @return True if the package name and associated storage id are valid. False otherwise. */ - public boolean registerCallback(@NonNull String codePath, + public boolean registerLoadingProgressCallback(@NonNull String codePath, @NonNull IPackageLoadingProgressCallback callback) { final IncrementalStorage storage = openStorage(codePath); if (storage == null) { @@ -314,7 +315,7 @@ public final class IncrementalManager { * @param codePath Path of the installed package * @return True if the package name and associated storage id are valid. False otherwise. */ - public boolean unregisterCallback(@NonNull String codePath, + public boolean unregisterLoadingProgressCallback(@NonNull String codePath, @NonNull IPackageLoadingProgressCallback callback) { final IncrementalStorage storage = openStorage(codePath); if (storage == null) { @@ -414,6 +415,38 @@ public final class IncrementalManager { } } + /** + * Specify the health check params and listener for listening to Incremental Storage health + * status changes. Notice that this will overwrite the previously registered listener. + * @param codePath Path of the installed package. This path is on an Incremental Storage. + * @param healthCheckParams The params for health state change timeouts. + * @param listener To report health status change. + * @return True if listener was successfully registered. + */ + public boolean registerHealthListener(@NonNull String codePath, + @NonNull StorageHealthCheckParams healthCheckParams, + @NonNull IStorageHealthListener.Stub listener) { + final IncrementalStorage storage = openStorage(codePath); + if (storage == null) { + // storage does not exist, package not installed + return false; + } + return storage.registerStorageHealthListener(healthCheckParams, listener); + } + + /** + * Stop listening to health status changes on an Incremental Storage. + * @param codePath Path of the installed package. This path is on an Incremental Storage. + */ + public void unregisterHealthListener(@NonNull String codePath) { + final IncrementalStorage storage = openStorage(codePath); + if (storage == null) { + // storage does not exist, package not installed + return; + } + storage.unregisterStorageHealthListener(); + } + /* Native methods */ private static native boolean nativeIsEnabled(); private static native boolean nativeIsIncrementalPath(@NonNull String path); diff --git a/core/java/android/os/incremental/IncrementalStorage.java b/core/java/android/os/incremental/IncrementalStorage.java index a1c3cc697e02..b913faf9cc83 100644 --- a/core/java/android/os/incremental/IncrementalStorage.java +++ b/core/java/android/os/incremental/IncrementalStorage.java @@ -545,4 +545,31 @@ public final class IncrementalStorage { return false; } } + + /** + * Register to listen to the status changes of the storage health. + * @param healthCheckParams Params to specify status change timeouts. + * @param listener To report health status change from Incremental Service to the caller. + */ + public boolean registerStorageHealthListener(StorageHealthCheckParams healthCheckParams, + IStorageHealthListener listener) { + try { + return mService.registerStorageHealthListener(mId, healthCheckParams, listener); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + return false; + } + } + + /** + * Stops listening to the status changes of the storage health. + */ + public void unregisterStorageHealthListener() { + try { + mService.unregisterStorageHealthListener(mId); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + return; + } + } } diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index 6b5eb16d7bff..270115beb09b 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -43,7 +43,6 @@ import android.annotation.SdkConstant; import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.annotation.WorkerThread; import android.app.Activity; import android.app.ActivityThread; @@ -1701,7 +1700,6 @@ public class StorageManager { * @hide */ @SystemApi - @TestApi public static boolean hasIsolatedStorage() { // Prefer to use snapshot for current boot when available return SystemProperties.getBoolean(PROP_ISOLATED_STORAGE_SNAPSHOT, diff --git a/core/java/android/permission/PermissionControllerManager.java b/core/java/android/permission/PermissionControllerManager.java index d6c95db95e85..0ba09fdab808 100644 --- a/core/java/android/permission/PermissionControllerManager.java +++ b/core/java/android/permission/PermissionControllerManager.java @@ -79,7 +79,6 @@ import java.util.function.Consumer; * * @hide */ -@TestApi @SystemApi @SystemService(Context.PERMISSION_CONTROLLER_SERVICE) public final class PermissionControllerManager { diff --git a/core/java/android/permission/PermissionManager.java b/core/java/android/permission/PermissionManager.java index 70b536d7ede0..c319e8580f76 100644 --- a/core/java/android/permission/PermissionManager.java +++ b/core/java/android/permission/PermissionManager.java @@ -24,7 +24,6 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.annotation.UserIdInt; import android.app.ActivityManager; import android.app.ActivityThread; @@ -57,7 +56,6 @@ import java.util.function.Consumer; * * @hide */ -@TestApi @SystemApi @SystemService(Context.PERMISSION_SERVICE) public final class PermissionManager { @@ -115,7 +113,6 @@ public final class PermissionManager { * * @hide */ - @TestApi @SystemApi @RequiresPermission(anyOf = { Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY, @@ -136,7 +133,6 @@ public final class PermissionManager { * * @hide */ - @TestApi @SystemApi @RequiresPermission(anyOf = { Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY, diff --git a/core/java/android/permission/RuntimePermissionPresentationInfo.java b/core/java/android/permission/RuntimePermissionPresentationInfo.java index d696feabfc30..4fce14cef3f0 100644 --- a/core/java/android/permission/RuntimePermissionPresentationInfo.java +++ b/core/java/android/permission/RuntimePermissionPresentationInfo.java @@ -18,7 +18,6 @@ package android.permission; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -33,7 +32,6 @@ import com.android.internal.util.Preconditions; * * @hide */ -@TestApi @SystemApi public final class RuntimePermissionPresentationInfo implements Parcelable { private static final int FLAG_GRANTED = 1 << 0; diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java index 99ffee3e2ad9..0315b561c120 100644 --- a/core/java/android/provider/DeviceConfig.java +++ b/core/java/android/provider/DeviceConfig.java @@ -55,7 +55,6 @@ import java.util.concurrent.Executor; * @hide */ @SystemApi -@TestApi public final class DeviceConfig { /** * The content:// style URL for the config table. @@ -116,7 +115,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi public static final String NAMESPACE_AUTOFILL = "autofill"; /** @@ -150,7 +148,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi public static final String NAMESPACE_CONTENT_CAPTURE = "content_capture"; /** @@ -250,7 +247,7 @@ public final class DeviceConfig { * * @hide */ - @SystemApi @TestApi + @SystemApi public static final String NAMESPACE_ROLLBACK = "rollback"; /** @@ -258,7 +255,7 @@ public final class DeviceConfig { * * @hide */ - @SystemApi @TestApi + @SystemApi public static final String NAMESPACE_ROLLBACK_BOOT = "rollback_boot"; /** @@ -403,7 +400,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi public static final String NAMESPACE_PRIVACY = "privacy"; /** @@ -412,7 +408,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi public static final String NAMESPACE_BIOMETRICS = "biometrics"; /** @@ -421,7 +416,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi public static final String NAMESPACE_PERMISSIONS = "permissions"; /** @@ -467,7 +461,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static String getProperty(@NonNull String namespace, @NonNull String name) { // Fetch all properties for the namespace at once and cache them in the local process, so we @@ -496,7 +489,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi @NonNull @RequiresPermission(READ_DEVICE_CONFIG) public static Properties getProperties(@NonNull String namespace, @NonNull String ... names) { @@ -516,7 +508,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static String getString(@NonNull String namespace, @NonNull String name, @Nullable String defaultValue) { @@ -535,7 +526,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static boolean getBoolean(@NonNull String namespace, @NonNull String name, boolean defaultValue) { @@ -554,7 +544,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static int getInt(@NonNull String namespace, @NonNull String name, int defaultValue) { String value = getProperty(namespace, name); @@ -580,7 +569,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static long getLong(@NonNull String namespace, @NonNull String name, long defaultValue) { String value = getProperty(namespace, name); @@ -606,7 +594,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static float getFloat(@NonNull String namespace, @NonNull String name, float defaultValue) { @@ -642,7 +629,6 @@ public final class DeviceConfig { * @see #resetToDefaults(int, String). */ @SystemApi - @TestApi @RequiresPermission(WRITE_DEVICE_CONFIG) public static boolean setProperty(@NonNull String namespace, @NonNull String name, @Nullable String value, boolean makeDefault) { @@ -666,7 +652,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi @RequiresPermission(WRITE_DEVICE_CONFIG) public static boolean setProperties(@NonNull Properties properties) throws BadConfigException { ContentResolver contentResolver = ActivityThread.currentApplication().getContentResolver(); @@ -686,7 +671,6 @@ public final class DeviceConfig { * @see #setProperty(String, String, String, boolean) */ @SystemApi - @TestApi @RequiresPermission(WRITE_DEVICE_CONFIG) public static void resetToDefaults(@ResetMode int resetMode, @Nullable String namespace) { ContentResolver contentResolver = ActivityThread.currentApplication().getContentResolver(); @@ -708,7 +692,6 @@ public final class DeviceConfig { * @see #removeOnPropertiesChangedListener(OnPropertiesChangedListener) */ @SystemApi - @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static void addOnPropertiesChangedListener( @NonNull String namespace, @@ -743,7 +726,6 @@ public final class DeviceConfig { * @see #addOnPropertiesChangedListener(String, Executor, OnPropertiesChangedListener) */ @SystemApi - @TestApi public static void removeOnPropertiesChangedListener( @NonNull OnPropertiesChangedListener onPropertiesChangedListener) { Preconditions.checkNotNull(onPropertiesChangedListener); @@ -878,7 +860,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi public interface OnPropertiesChangedListener { /** * Called when one or more properties have changed, providing a Properties object with all @@ -899,7 +880,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi public static class BadConfigException extends Exception {} /** @@ -908,7 +888,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi public static class Properties { private final String mNamespace; private final HashMap<String, String> mMap; diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java index 8f69edb982cb..062d92900643 100644 --- a/core/java/android/provider/DocumentsContract.java +++ b/core/java/android/provider/DocumentsContract.java @@ -22,7 +22,6 @@ import static com.android.internal.util.Preconditions.checkCollectionNotEmpty; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.content.ContentProvider; import android.content.ContentResolver; @@ -1304,7 +1303,6 @@ public final class DocumentsContract { * {@hide} */ @SystemApi - @TestApi public static @NonNull Uri setManageMode(@NonNull Uri uri) { Preconditions.checkNotNull(uri, "uri can not be null"); return uri.buildUpon().appendQueryParameter(PARAM_MANAGE, "true").build(); @@ -1316,7 +1314,6 @@ public final class DocumentsContract { * {@hide} */ @SystemApi - @TestApi public static boolean isManageMode(@NonNull Uri uri) { Preconditions.checkNotNull(uri, "uri can not be null"); return uri.getBooleanQueryParameter(PARAM_MANAGE, false); diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 2eee6436beae..0e3708e04dd9 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -229,7 +229,6 @@ public final class Settings { */ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) @SystemApi - @TestApi public static final String ACTION_TETHER_PROVISIONING_UI = "android.settings.TETHER_PROVISIONING_UI"; @@ -1053,7 +1052,6 @@ public final class Settings { * * @hide */ - @TestApi @SystemApi @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_MANAGE_APP_OVERLAY_PERMISSION = @@ -2017,7 +2015,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_ENTERPRISE_PRIVACY_SETTINGS = "android.settings.ENTERPRISE_PRIVACY_SETTINGS"; @@ -2100,7 +2097,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_REQUEST_ENABLE_CONTENT_CAPTURE = "android.settings.REQUEST_ENABLE_CONTENT_CAPTURE"; @@ -5580,7 +5576,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.WRITE_SECURE_SETTINGS) public static void resetToDefaults(@NonNull ContentResolver resolver, @Nullable String tag) { @@ -6051,7 +6046,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String AUTOFILL_FEATURE_FIELD_CLASSIFICATION = "autofill_field_classification"; @@ -6085,7 +6079,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String AUTOFILL_USER_DATA_MAX_USER_DATA_SIZE = "autofill_user_data_max_user_data_size"; @@ -6096,7 +6089,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String AUTOFILL_USER_DATA_MAX_FIELD_CLASSIFICATION_IDS_SIZE = "autofill_user_data_max_field_classification_size"; @@ -6107,7 +6099,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String AUTOFILL_USER_DATA_MAX_CATEGORY_COUNT = "autofill_user_data_max_category_count"; @@ -6117,7 +6108,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String AUTOFILL_USER_DATA_MAX_VALUE_LENGTH = "autofill_user_data_max_value_length"; @@ -6127,7 +6117,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String AUTOFILL_USER_DATA_MIN_VALUE_LENGTH = "autofill_user_data_min_value_length"; @@ -6177,7 +6166,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String USER_SETUP_COMPLETE = "user_setup_complete"; /** @@ -6553,7 +6541,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS = "lock_screen_allow_private_notifications"; @@ -7841,7 +7828,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String DOZE_ALWAYS_ON = "doze_always_on"; /** @@ -8274,7 +8260,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String LOCK_SCREEN_SHOW_NOTIFICATIONS = "lock_screen_show_notifications"; @@ -8961,7 +8946,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String LOCATION_ACCESS_CHECK_INTERVAL_MILLIS = "location_access_check_interval_millis"; @@ -8970,7 +8954,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String LOCATION_ACCESS_CHECK_DELAY_MILLIS = "location_access_check_delay_millis"; @@ -10391,7 +10374,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String TETHER_OFFLOAD_DISABLED = "tether_offload_disabled"; /** @@ -13369,7 +13351,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES = "autofill_compat_mode_allowed_packages"; diff --git a/core/java/android/provider/Telephony.java b/core/java/android/provider/Telephony.java index 79d6bb4a062a..2c735fd9012f 100644 --- a/core/java/android/provider/Telephony.java +++ b/core/java/android/provider/Telephony.java @@ -4045,7 +4045,6 @@ public final class Telephony { * @hide */ @SystemApi - @TestApi public static final class CellBroadcasts implements BaseColumns { /** diff --git a/core/java/android/service/appprediction/AppPredictionService.java b/core/java/android/service/appprediction/AppPredictionService.java index be20570ef62d..2d8aee567010 100644 --- a/core/java/android/service/appprediction/AppPredictionService.java +++ b/core/java/android/service/appprediction/AppPredictionService.java @@ -22,7 +22,6 @@ import android.annotation.MainThread; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Service; import android.app.prediction.AppPredictionContext; import android.app.prediction.AppPredictionSessionId; @@ -52,7 +51,6 @@ import java.util.function.Consumer; * @hide */ @SystemApi -@TestApi public abstract class AppPredictionService extends Service { private static final String TAG = "AppPredictionService"; diff --git a/core/java/android/service/autofill/AutofillFieldClassificationService.java b/core/java/android/service/autofill/AutofillFieldClassificationService.java index 28842a7fa1d7..9d9b881ebdfc 100644 --- a/core/java/android/service/autofill/AutofillFieldClassificationService.java +++ b/core/java/android/service/autofill/AutofillFieldClassificationService.java @@ -20,7 +20,6 @@ import static com.android.internal.util.function.pooled.PooledLambda.obtainMessa import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Service; import android.content.Intent; import android.os.Bundle; @@ -53,7 +52,6 @@ import java.util.Map; * {@hide} */ @SystemApi -@TestApi public abstract class AutofillFieldClassificationService extends Service { private static final String TAG = "AutofillFieldClassificationService"; @@ -121,7 +119,6 @@ public abstract class AutofillFieldClassificationService extends Service { /** @hide */ @SystemApi - @TestApi public AutofillFieldClassificationService() { } diff --git a/core/java/android/service/autofill/Dataset.java b/core/java/android/service/autofill/Dataset.java index 2d99c413cc89..18d79927388b 100644 --- a/core/java/android/service/autofill/Dataset.java +++ b/core/java/android/service/autofill/Dataset.java @@ -21,7 +21,6 @@ import static android.view.autofill.Helper.sDebug; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.IntentSender; import android.os.Parcel; import android.os.Parcelable; @@ -249,7 +248,6 @@ public final class Dataset implements Parcelable { * @hide */ @SystemApi - @TestApi public Builder(@NonNull InlinePresentation inlinePresentation) { Preconditions.checkNotNull(inlinePresentation, "inlinePresentation must be non-null"); mInlinePresentation = inlinePresentation; @@ -604,7 +602,6 @@ public final class Dataset implements Parcelable { * @hide */ @SystemApi - @TestApi public @NonNull Builder setFieldInlinePresentation(@NonNull AutofillId id, @Nullable AutofillValue value, @Nullable Pattern filter, @NonNull InlinePresentation inlinePresentation) { diff --git a/core/java/android/service/autofill/InlineSuggestionRenderService.java b/core/java/android/service/autofill/InlineSuggestionRenderService.java index 839caff5c3d4..cdcd65910974 100644 --- a/core/java/android/service/autofill/InlineSuggestionRenderService.java +++ b/core/java/android/service/autofill/InlineSuggestionRenderService.java @@ -20,7 +20,6 @@ import static com.android.internal.util.function.pooled.PooledLambda.obtainMessa import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Service; import android.content.Intent; import android.content.IntentSender; @@ -51,7 +50,6 @@ import java.lang.ref.WeakReference; * {@hide} */ @SystemApi -@TestApi public abstract class InlineSuggestionRenderService extends Service { private static final String TAG = "InlineSuggestionRenderService"; diff --git a/core/java/android/service/autofill/augmented/AugmentedAutofillService.java b/core/java/android/service/autofill/augmented/AugmentedAutofillService.java index 620c457024b8..b34c2dceeee8 100644 --- a/core/java/android/service/autofill/augmented/AugmentedAutofillService.java +++ b/core/java/android/service/autofill/augmented/AugmentedAutofillService.java @@ -25,7 +25,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Service; import android.content.ComponentName; import android.content.Intent; @@ -70,7 +69,6 @@ import java.util.List; * @hide */ @SystemApi -@TestApi public abstract class AugmentedAutofillService extends Service { private static final String TAG = AugmentedAutofillService.class.getSimpleName(); diff --git a/core/java/android/service/autofill/augmented/FillCallback.java b/core/java/android/service/autofill/augmented/FillCallback.java index fc3baf1c9836..9fc7f34ec0ef 100644 --- a/core/java/android/service/autofill/augmented/FillCallback.java +++ b/core/java/android/service/autofill/augmented/FillCallback.java @@ -20,7 +20,6 @@ import static android.service.autofill.augmented.AugmentedAutofillService.sDebug import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Bundle; import android.service.autofill.Dataset; import android.service.autofill.augmented.AugmentedAutofillService.AutofillProxy; @@ -34,7 +33,6 @@ import java.util.List; * @hide */ @SystemApi -@TestApi public final class FillCallback { private static final String TAG = FillCallback.class.getSimpleName(); diff --git a/core/java/android/service/autofill/augmented/FillController.java b/core/java/android/service/autofill/augmented/FillController.java index 7d552d62fa72..7cd674e847fd 100644 --- a/core/java/android/service/autofill/augmented/FillController.java +++ b/core/java/android/service/autofill/augmented/FillController.java @@ -19,7 +19,6 @@ import static android.service.autofill.augmented.AugmentedAutofillService.sDebug import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.RemoteException; import android.service.autofill.augmented.AugmentedAutofillService.AutofillProxy; import android.util.Log; @@ -37,7 +36,6 @@ import java.util.List; * @hide */ @SystemApi -@TestApi public final class FillController { private static final String TAG = FillController.class.getSimpleName(); diff --git a/core/java/android/service/autofill/augmented/FillResponse.java b/core/java/android/service/autofill/augmented/FillResponse.java index f72eb782c407..53484cf200c4 100644 --- a/core/java/android/service/autofill/augmented/FillResponse.java +++ b/core/java/android/service/autofill/augmented/FillResponse.java @@ -18,7 +18,6 @@ package android.service.autofill.augmented; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Bundle; import android.service.autofill.Dataset; @@ -33,7 +32,6 @@ import java.util.List; * @hide */ @SystemApi -@TestApi @DataClass( genBuilder = true, genHiddenGetters = true) diff --git a/core/java/android/service/autofill/augmented/FillWindow.java b/core/java/android/service/autofill/augmented/FillWindow.java index 8e866466e8df..d4f7e114c291 100644 --- a/core/java/android/service/autofill/augmented/FillWindow.java +++ b/core/java/android/service/autofill/augmented/FillWindow.java @@ -23,7 +23,6 @@ import static com.android.internal.util.function.pooled.PooledLambda.obtainMessa import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.graphics.Rect; import android.os.Handler; import android.os.Looper; @@ -64,7 +63,6 @@ import java.lang.ref.WeakReference; * @hide */ @SystemApi -@TestApi public final class FillWindow implements AutoCloseable { private static final String TAG = FillWindow.class.getSimpleName(); diff --git a/core/java/android/service/autofill/augmented/PresentationParams.java b/core/java/android/service/autofill/augmented/PresentationParams.java index 8b3a001f58e6..fe78d2218266 100644 --- a/core/java/android/service/autofill/augmented/PresentationParams.java +++ b/core/java/android/service/autofill/augmented/PresentationParams.java @@ -18,7 +18,6 @@ package android.service.autofill.augmented; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.graphics.Rect; import android.service.autofill.augmented.AugmentedAutofillService.AutofillProxy; import android.view.View; @@ -36,7 +35,6 @@ import java.io.PrintWriter; * @hide */ @SystemApi -@TestApi public abstract class PresentationParams { // /** @hide */ @@ -61,7 +59,6 @@ public abstract class PresentationParams { * @hide */ @SystemApi - @TestApi public abstract static class Area { /** @hide */ diff --git a/core/java/android/service/contentcapture/ActivityEvent.java b/core/java/android/service/contentcapture/ActivityEvent.java index b741cff9328e..1188a3f1021e 100644 --- a/core/java/android/service/contentcapture/ActivityEvent.java +++ b/core/java/android/service/contentcapture/ActivityEvent.java @@ -19,7 +19,6 @@ package android.service.contentcapture; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.usage.UsageEvents.Event; import android.content.ComponentName; import android.os.Parcel; @@ -34,7 +33,6 @@ import java.lang.annotation.RetentionPolicy; * @hide */ @SystemApi -@TestApi public final class ActivityEvent implements Parcelable { /** diff --git a/core/java/android/service/contentcapture/ContentCaptureService.java b/core/java/android/service/contentcapture/ContentCaptureService.java index 84f602820f4a..3c44cfd4c7f6 100644 --- a/core/java/android/service/contentcapture/ContentCaptureService.java +++ b/core/java/android/service/contentcapture/ContentCaptureService.java @@ -26,7 +26,6 @@ import android.annotation.CallSuper; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Service; import android.content.ComponentName; import android.content.ContentCaptureOptions; @@ -74,7 +73,6 @@ import java.util.function.Consumer; * @hide */ @SystemApi -@TestApi public abstract class ContentCaptureService extends Service { private static final String TAG = ContentCaptureService.class.getSimpleName(); @@ -344,7 +342,6 @@ public abstract class ContentCaptureService extends Service { * @hide */ @SystemApi - @TestApi public void onDataShareRequest(@NonNull DataShareRequest request, @NonNull DataShareCallback callback) { if (sVerbose) Log.v(TAG, "onDataShareRequest()"); diff --git a/core/java/android/service/contentcapture/DataShareCallback.java b/core/java/android/service/contentcapture/DataShareCallback.java index 5df8a4b174bf..e3c7bb3cd24f 100644 --- a/core/java/android/service/contentcapture/DataShareCallback.java +++ b/core/java/android/service/contentcapture/DataShareCallback.java @@ -19,7 +19,6 @@ package android.service.contentcapture; import android.annotation.CallbackExecutor; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import java.util.concurrent.Executor; @@ -33,7 +32,6 @@ import java.util.concurrent.Executor; * @hide **/ @SystemApi -@TestApi public interface DataShareCallback { /** Accept the data share. diff --git a/core/java/android/service/contentcapture/DataShareReadAdapter.java b/core/java/android/service/contentcapture/DataShareReadAdapter.java index 8cd9eea1e6e0..4526aba6933b 100644 --- a/core/java/android/service/contentcapture/DataShareReadAdapter.java +++ b/core/java/android/service/contentcapture/DataShareReadAdapter.java @@ -18,7 +18,6 @@ package android.service.contentcapture; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.ParcelFileDescriptor; import android.view.contentcapture.ContentCaptureManager.DataShareError; @@ -29,7 +28,6 @@ import android.view.contentcapture.ContentCaptureManager.DataShareError; * @hide **/ @SystemApi -@TestApi public interface DataShareReadAdapter { /** diff --git a/core/java/android/service/contentcapture/SnapshotData.java b/core/java/android/service/contentcapture/SnapshotData.java index 5b3930ab6336..bf469b4b3ad8 100644 --- a/core/java/android/service/contentcapture/SnapshotData.java +++ b/core/java/android/service/contentcapture/SnapshotData.java @@ -19,7 +19,6 @@ package android.service.contentcapture; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.assist.AssistContent; import android.app.assist.AssistStructure; import android.os.Bundle; @@ -32,7 +31,6 @@ import android.os.Parcelable; * @hide */ @SystemApi -@TestApi public final class SnapshotData implements Parcelable { private final @NonNull Bundle mAssistData; diff --git a/core/java/android/service/notification/Adjustment.java b/core/java/android/service/notification/Adjustment.java index 8464c6df4425..4b25c8832068 100644 --- a/core/java/android/service/notification/Adjustment.java +++ b/core/java/android/service/notification/Adjustment.java @@ -19,7 +19,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.StringDef; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Notification; import android.os.Bundle; import android.os.Parcel; @@ -42,7 +41,6 @@ import java.lang.annotation.RetentionPolicy; * @hide */ @SystemApi -@TestApi public final class Adjustment implements Parcelable { private final String mPackage; private final String mKey; @@ -148,7 +146,6 @@ public final class Adjustment implements Parcelable { * @hide */ @SystemApi - @TestApi public Adjustment(String pkg, String key, Bundle signals, CharSequence explanation, int user) { mPackage = pkg; mKey = key; @@ -232,7 +229,6 @@ public final class Adjustment implements Parcelable { /** @hide */ @SystemApi - @TestApi public int getUser() { return mUser; } diff --git a/core/java/android/service/notification/NotificationAssistantService.java b/core/java/android/service/notification/NotificationAssistantService.java index 975e75ccaeeb..632014936425 100644 --- a/core/java/android/service/notification/NotificationAssistantService.java +++ b/core/java/android/service/notification/NotificationAssistantService.java @@ -23,7 +23,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SdkConstant; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; @@ -66,7 +65,6 @@ import java.util.List; * @hide */ @SystemApi -@TestApi public abstract class NotificationAssistantService extends NotificationListenerService { private static final String TAG = "NotificationAssistants"; diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java index e1b2dfb3c3f0..25f140f29e00 100644 --- a/core/java/android/service/notification/NotificationListenerService.java +++ b/core/java/android/service/notification/NotificationListenerService.java @@ -22,7 +22,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SdkConstant; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.ActivityManager; import android.app.INotificationManager; import android.app.Notification; @@ -452,7 +451,6 @@ public abstract class NotificationListenerService extends Service { * * @hide */ - @TestApi @SystemApi public void onNotificationRemoved(@NonNull StatusBarNotification sbn, @NonNull RankingMap rankingMap, @NonNull NotificationStats stats, int reason) { diff --git a/core/java/android/service/notification/NotificationStats.java b/core/java/android/service/notification/NotificationStats.java index 2cd8b8ba42d9..206e4fa4fb11 100644 --- a/core/java/android/service/notification/NotificationStats.java +++ b/core/java/android/service/notification/NotificationStats.java @@ -19,7 +19,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.RemoteInput; import android.os.Parcel; import android.os.Parcelable; @@ -31,7 +30,6 @@ import java.lang.annotation.RetentionPolicy; * Information about how the user has interacted with a given notification. * @hide */ -@TestApi @SystemApi public final class NotificationStats implements Parcelable { diff --git a/core/java/android/service/notification/SnoozeCriterion.java b/core/java/android/service/notification/SnoozeCriterion.java index eb624c9d85f4..d3da07a6fb80 100644 --- a/core/java/android/service/notification/SnoozeCriterion.java +++ b/core/java/android/service/notification/SnoozeCriterion.java @@ -17,7 +17,6 @@ package android.service.notification; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -27,7 +26,6 @@ import android.os.Parcelable; * @hide */ @SystemApi -@TestApi public final class SnoozeCriterion implements Parcelable { private final String mId; private final CharSequence mExplanation; diff --git a/core/java/android/service/textclassifier/TextClassifierService.java b/core/java/android/service/textclassifier/TextClassifierService.java index 93faa5872a69..1fb18fab3775 100644 --- a/core/java/android/service/textclassifier/TextClassifierService.java +++ b/core/java/android/service/textclassifier/TextClassifierService.java @@ -22,7 +22,6 @@ import android.annotation.MainThread; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Service; import android.content.ComponentName; import android.content.Context; @@ -88,7 +87,6 @@ import java.util.concurrent.Executors; * @hide */ @SystemApi -@TestApi public abstract class TextClassifierService extends Service { private static final String LOG_TAG = "TextClassifierService"; diff --git a/core/java/android/service/watchdog/ExplicitHealthCheckService.java b/core/java/android/service/watchdog/ExplicitHealthCheckService.java index b1647fe0fcf9..49e00d6f6328 100644 --- a/core/java/android/service/watchdog/ExplicitHealthCheckService.java +++ b/core/java/android/service/watchdog/ExplicitHealthCheckService.java @@ -66,7 +66,6 @@ import java.util.concurrent.TimeUnit; * </pre> * @hide */ -@TestApi @SystemApi public abstract class ExplicitHealthCheckService extends Service { @@ -195,7 +194,6 @@ public abstract class ExplicitHealthCheckService extends Service { * * @hide */ - @TestApi @SystemApi public static final class PackageConfig implements Parcelable { private static final long DEFAULT_HEALTH_CHECK_TIMEOUT_MILLIS = TimeUnit.HOURS.toMillis(1); diff --git a/core/java/android/telephony/PhoneStateListener.java b/core/java/android/telephony/PhoneStateListener.java index 70c11f282a2b..6a5d5c63cb4d 100644 --- a/core/java/android/telephony/PhoneStateListener.java +++ b/core/java/android/telephony/PhoneStateListener.java @@ -20,7 +20,6 @@ import android.Manifest; import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.ChangeId; import android.compat.annotation.UnsupportedAppUsage; import android.os.Binder; @@ -437,7 +436,6 @@ public class PhoneStateListener { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public static final int LISTEN_OUTGOING_EMERGENCY_CALL = 0x10000000; @@ -450,7 +448,6 @@ public class PhoneStateListener { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public static final int LISTEN_OUTGOING_EMERGENCY_SMS = 0x20000000; @@ -969,7 +966,6 @@ public class PhoneStateListener { * @hide */ @SystemApi - @TestApi @Deprecated public void onOutgoingEmergencyCall(@NonNull EmergencyNumber placedEmergencyNumber) { // default implementation empty @@ -994,7 +990,6 @@ public class PhoneStateListener { * @hide */ @SystemApi - @TestApi public void onOutgoingEmergencyCall(@NonNull EmergencyNumber placedEmergencyNumber, int subscriptionId) { // Default implementation for backwards compatibility @@ -1011,7 +1006,6 @@ public class PhoneStateListener { * @hide */ @SystemApi - @TestApi @Deprecated public void onOutgoingEmergencySms(@NonNull EmergencyNumber sentEmergencyNumber) { // default implementation empty @@ -1033,7 +1027,6 @@ public class PhoneStateListener { * @hide */ @SystemApi - @TestApi public void onOutgoingEmergencySms(@NonNull EmergencyNumber sentEmergencyNumber, int subscriptionId) { // Default implementation for backwards compatibility diff --git a/core/java/android/uwb/AngleMeasurement.java b/core/java/android/uwb/AngleMeasurement.java new file mode 100644 index 000000000000..7ef145cfe470 --- /dev/null +++ b/core/java/android/uwb/AngleMeasurement.java @@ -0,0 +1,65 @@ +/* + * Copyright 2020 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 android.uwb; + +import android.annotation.FloatRange; + +/** + * Angle measurement + * + * <p>The actual angle is interpreted as: + * {@link #getRadians()} +/- {@link #getErrorRadians()} ()} at {@link #getConfidenceLevel()} + * + * @hide + */ +public final class AngleMeasurement { + /** + * Angle measurement in radians + * + * @return angle in radians + */ + @FloatRange(from = -Math.PI, to = +Math.PI) + public double getRadians() { + throw new UnsupportedOperationException(); + } + + /** + * Error of angle measurement in radians + * + * <p>Must be a positive value + * + * @return angle measurement error in radians + */ + @FloatRange(from = 0.0, to = +Math.PI) + public double getErrorRadians() { + throw new UnsupportedOperationException(); + } + + /** + * Angle measurement confidence level expressed as a value between + * 0.0 to 1.0. + * + * <p>A value of 0.0 indicates there is no confidence in the measurement. A value of 1.0 + * indicates there is maximum confidence in the measurement. + * + * @return the confidence level of the angle measurement + */ + @FloatRange(from = 0.0, to = 1.0) + public double getConfidenceLevel() { + throw new UnsupportedOperationException(); + } +} diff --git a/core/java/android/uwb/AngleOfArrivalMeasurement.java b/core/java/android/uwb/AngleOfArrivalMeasurement.java new file mode 100644 index 000000000000..030d5299d53b --- /dev/null +++ b/core/java/android/uwb/AngleOfArrivalMeasurement.java @@ -0,0 +1,63 @@ +/* + * Copyright 2020 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 android.uwb; + +import android.annotation.NonNull; +import android.annotation.Nullable; + +/** + * Represents an angle of arrival measurement between two devices using Ultra Wideband + * + * @hide + */ +public final class AngleOfArrivalMeasurement { + /** + * Azimuth angle measurement + * <p>Azimuth {@link AngleMeasurement} of remote device in horizontal coordinate system, this is + * the angle clockwise from the meridian when viewing above the north pole. + * + * <p>See: https://en.wikipedia.org/wiki/Horizontal_coordinate_system + * + * <p>On an Android device, azimuth north is defined as the angle perpendicular away from the + * back of the device when holding it in portrait mode upright. + * + * <p>Azimuth angle must be supported when Angle of Arrival is supported + * + * @return the azimuth {@link AngleMeasurement} + */ + @NonNull + public AngleMeasurement getAzimuth() { + throw new UnsupportedOperationException(); + } + + /** + * Altitude angle measurement + * <p>Altitude {@link AngleMeasurement} of remote device in horizontal coordinate system, this + * is the angle above the equator when the north pole is up. + * + * <p>See: https://en.wikipedia.org/wiki/Horizontal_coordinate_system + * + * <p>On an Android device, altitude is defined as the angle vertical from ground when holding + * the device in portrait mode upright. + * + * @return altitude {@link AngleMeasurement} or null when this is not available + */ + @Nullable + public AngleMeasurement getAltitude() { + throw new UnsupportedOperationException(); + } +} diff --git a/core/java/android/uwb/DistanceMeasurement.java b/core/java/android/uwb/DistanceMeasurement.java new file mode 100644 index 000000000000..f4e6d3ed644b --- /dev/null +++ b/core/java/android/uwb/DistanceMeasurement.java @@ -0,0 +1,61 @@ +/* + * Copyright 2020 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 android.uwb; + +import android.annotation.FloatRange; + +/** + * A data point for the distance measurement + * + * <p>The actual distance is interpreted as: + * {@link #getMeters()} +/- {@link #getErrorMeters()} at {@link #getConfidenceLevel()} + * + * @hide + */ +public final class DistanceMeasurement { + /** + * Distance measurement in meters + * + * @return distance in meters + */ + public double getMeters() { + throw new UnsupportedOperationException(); + } + + /** + * Error of distance measurement in meters + * <p>Must be positive + * + * @return error of distance measurement in meters + */ + public double getErrorMeters() { + throw new UnsupportedOperationException(); + } + + /** + * Distance measurement confidence level expressed as a value between 0.0 to 1.0. + * + * <p>A value of 0.0 indicates no confidence in the measurement. A value of 1.0 represents + * maximum confidence in the measurement + * + * @return confidence level + */ + @FloatRange(from = 0.0, to = 1.0) + public double getConfidenceLevel() { + throw new UnsupportedOperationException(); + } +} diff --git a/core/java/android/uwb/RangingMeasurement.java b/core/java/android/uwb/RangingMeasurement.java new file mode 100644 index 000000000000..a249802366e0 --- /dev/null +++ b/core/java/android/uwb/RangingMeasurement.java @@ -0,0 +1,113 @@ +/* + * Copyright 2020 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 android.uwb; + +import android.annotation.IntDef; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.SuppressLint; +import android.os.SystemClock; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Representation of a ranging measurement between the local device and a remote device + * + * @hide + */ +public final class RangingMeasurement { + /** + * Get the remote device's {@link UwbAddress} + * + * @return the remote device's {@link UwbAddress} + */ + @NonNull + public UwbAddress getRemoteDeviceAddress() { + throw new UnsupportedOperationException(); + } + + @Retention(RetentionPolicy.SOURCE) + @IntDef(value = { + RANGING_STATUS_SUCCESS, + RANGING_STATUS_FAILURE_OUT_OF_RANGE, + RANGING_STATUS_FAILURE_UNKNOWN_ERROR}) + public @interface Status {} + + /** + * Ranging attempt was successful for this device + */ + public static final int RANGING_STATUS_SUCCESS = 0; + + /** + * Ranging failed for this device because it is out of range + */ + public static final int RANGING_STATUS_FAILURE_OUT_OF_RANGE = 1; + + /** + * Ranging failed for this device because of unknown error + */ + public static final int RANGING_STATUS_FAILURE_UNKNOWN_ERROR = -1; + + /** + * Get the status of this ranging measurement + * + * <p>Possible values are + * {@link #RANGING_STATUS_SUCCESS}, + * {@link #RANGING_STATUS_FAILURE_OUT_OF_RANGE}, + * {@link #RANGING_STATUS_FAILURE_UNKNOWN_ERROR}. + * + * @return the status of the ranging measurement + */ + @Status + public int getStatus() { + throw new UnsupportedOperationException(); + } + + /** + * Timestamp of this ranging measurement in time since boot nanos in the same namespace as + * {@link SystemClock#elapsedRealtimeNanos()} + * + * @return timestamp of ranging measurement in nanoseconds + */ + @SuppressLint("MethodNameUnits") + public long getElapsedRealtimeNanos() { + throw new UnsupportedOperationException(); + } + + /** + * Get the distance measurement + * + * @return a {@link DistanceMeasurement} or null if {@link #getStatus()} != + * {@link #RANGING_STATUS_SUCCESS} + */ + @Nullable + public DistanceMeasurement getDistance() { + throw new UnsupportedOperationException(); + } + + /** + * Get the angle of arrival measurement + * + * @return an {@link AngleOfArrivalMeasurement} or null if {@link #getStatus()} != + * {@link #RANGING_STATUS_SUCCESS} + */ + @Nullable + public AngleOfArrivalMeasurement getAngleOfArrival() { + throw new UnsupportedOperationException(); + } +} diff --git a/core/java/android/uwb/RangingParams.java b/core/java/android/uwb/RangingParams.java new file mode 100644 index 000000000000..9727696f0391 --- /dev/null +++ b/core/java/android/uwb/RangingParams.java @@ -0,0 +1,175 @@ +/* + * Copyright 2020 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 android.uwb; + +import android.annotation.IntDef; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.os.PersistableBundle; +import android.util.Duration; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.List; + +/** + * An object used when requesting to open a new {@link RangingSession}. + * <p>Use {@link RangingParams.Builder} to create an instance of this class. + * + * @hide + */ +public final class RangingParams { + /** + * Standard builder interface as the class is not modifiable + */ + public static class Builder { + // TODO implement + } + + /** + * Get if the local device is the initiator + * + * @return true if the device is the initiator + */ + public boolean isInitiator() { + throw new UnsupportedOperationException(); + } + + /** + * Get if the local device is the controller + * + * @return true if the device is the controller + */ + public boolean isController() { + throw new UnsupportedOperationException(); + } + + /** + * The desired amount of time between two adjacent samples of measurement + * + * @return the ranging sample period + */ + @NonNull + public Duration getSamplingPeriod() { + throw new UnsupportedOperationException(); + } + + /** + * Local device's {@link UwbAddress} + * + * <p>Simultaneous {@link RangingSession}s on the same device can have different results for + * {@link #getLocalDeviceAddress()}. + * + * @return the local device's {@link UwbAddress} + */ + @NonNull + public UwbAddress getLocalDeviceAddress() { + throw new UnsupportedOperationException(); + } + + /** + * Gets a list of all remote device's {@link UwbAddress} + * + * @return a {@link List} of {@link UwbAddress} representing the remote devices + */ + @NonNull + public List<UwbAddress> getRemoteDeviceAddresses() { + throw new UnsupportedOperationException(); + } + + /** + * Channel number used between this device pair as defined by 802.15.4z + * + * Range: -1, 0-15 + * + * @return the channel to use + */ + public int getChannelNumber() { + throw new UnsupportedOperationException(); + } + + /** + * Preamble index used between this device pair as defined by 802.15.4z + * + * Range: 0, 0-32 + * + * @return the preamble index to use for transmitting + */ + public int getTxPreambleIndex() { + throw new UnsupportedOperationException(); + } + + /** + * preamble index used between this device pair as defined by 802.15.4z + * + * Range: 0, 13-16, 21-32 + * + * @return the preamble index to use for receiving + */ + public int getRxPreambleIndex() { + throw new UnsupportedOperationException(); + } + + @Retention(RetentionPolicy.SOURCE) + @IntDef(value = { + STS_PHY_PACKET_TYPE_SP0, + STS_PHY_PACKET_TYPE_SP1, + STS_PHY_PACKET_TYPE_SP2, + STS_PHY_PACKET_TYPE_SP3}) + public @interface StsPhyPacketType {} + + /** + * PHY packet type SP0 when STS is used as defined by 802.15.4z + */ + public static final int STS_PHY_PACKET_TYPE_SP0 = 0; + + /** + * PHY packet type SP1 when STS is used as defined by 802.15.4z + */ + public static final int STS_PHY_PACKET_TYPE_SP1 = 1; + + /** + * PHY packet type SP2 when STS is used as defined by 802.15.4z + */ + public static final int STS_PHY_PACKET_TYPE_SP2 = 2; + + /** + * PHY packet type SP3 when STS is used as defined by 802.15.4z + */ + public static final int STS_PHY_PACKET_TYPE_SP3 = 3; + + /** + * Get the type of PHY packet when STS is used as defined by 802.15.4z + * + * @return the {@link StsPhyPacketType} to use + */ + @StsPhyPacketType + public int getStsPhyPacketType() { + throw new UnsupportedOperationException(); + } + + /** + * Parameters for a specific UWB protocol constructed using a support library. + * + * <p>Android reserves the '^android.*' namespace + * + * @return a {@link PersistableBundle} of protocol specific parameters + */ + public @Nullable PersistableBundle getSpecificationParameters() { + throw new UnsupportedOperationException(); + } +} diff --git a/core/java/android/uwb/RangingReport.java b/core/java/android/uwb/RangingReport.java new file mode 100644 index 000000000000..037bdfd5f224 --- /dev/null +++ b/core/java/android/uwb/RangingReport.java @@ -0,0 +1,44 @@ +/* + * Copyright 2020 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 android.uwb; + +import android.annotation.NonNull; + +import java.util.List; + +/** + * This class contains the UWB ranging data + * + * @hide + */ +public final class RangingReport { + /** + * Get a {@link List} of {@link RangingMeasurement} objects in the last measurement interval + * <p>The underlying UWB adapter may choose to do multiple measurements in each ranging + * interval. + * + * <p>The entries in the {@link List} are ordered in ascending order based on + * {@link RangingMeasurement#getElapsedRealtimeNanos()} + * + * @return a {@link List} of {@link RangingMeasurement} objects + */ + @NonNull + public List<RangingMeasurement> getMeasurements() { + throw new UnsupportedOperationException(); + } +} + diff --git a/core/java/android/view/IScrollCaptureController.aidl b/core/java/android/view/IScrollCaptureCallbacks.aidl index 8474a00b302f..d97e3c66cc5d 100644 --- a/core/java/android/view/IScrollCaptureController.aidl +++ b/core/java/android/view/IScrollCaptureCallbacks.aidl @@ -20,32 +20,31 @@ import android.graphics.Point; import android.graphics.Rect; import android.view.Surface; -import android.view.IScrollCaptureClient; +import android.view.IScrollCaptureConnection; /** - * Interface to a controller passed to the {@link IScrollCaptureClient} which provides the client an - * asynchronous callback channel for responses. + * Asynchronous callback channel for responses to scroll capture requests. * * {@hide} */ -interface IScrollCaptureController { +interface IScrollCaptureCallbacks { /** - * Scroll capture is available, and a client connect has been returned. + * Scroll capture is available, and a connection has been provided. * - * @param client interface to a ScrollCaptureCallback in the window process + * @param connection a connection to a window process and scrollable content * @param scrollAreaInWindow the location of scrolling in global (window) coordinate space */ - oneway void onClientConnected(in IScrollCaptureClient client, in Rect scrollBounds, + oneway void onConnected(in IScrollCaptureConnection connection, in Rect scrollBounds, in Point positionInWindow); /** - * Nothing in the window can be scrolled, scroll capture not offered. + * The window does not support scroll capture. */ - oneway void onClientUnavailable(); + oneway void onUnavailable(); /** - * Notifies the system that the client has confirmed the request and is ready to begin providing - * image requests. + * Called when the remote end has confirmed the request and is ready to begin providing image + * requests. */ oneway void onCaptureStarted(); diff --git a/core/java/android/view/IScrollCaptureClient.aidl b/core/java/android/view/IScrollCaptureConnection.aidl index 5f135a37dfef..63a4f48aeb20 100644 --- a/core/java/android/view/IScrollCaptureClient.aidl +++ b/core/java/android/view/IScrollCaptureConnection.aidl @@ -26,7 +26,7 @@ import android.view.Surface; * * {@hide} */ -interface IScrollCaptureClient { +interface IScrollCaptureConnection { /** * Informs the client that it has been selected for scroll capture and should prepare to diff --git a/core/java/android/view/IWindow.aidl b/core/java/android/view/IWindow.aidl index 193e674dd1b0..e685b30421be 100644 --- a/core/java/android/view/IWindow.aidl +++ b/core/java/android/view/IWindow.aidl @@ -26,7 +26,7 @@ import android.view.DisplayCutout; import android.view.DragEvent; import android.view.InsetsSourceControl; import android.view.InsetsState; -import android.view.IScrollCaptureController; +import android.view.IScrollCaptureCallbacks; import android.view.KeyEvent; import android.view.MotionEvent; import android.window.ClientWindowFrames; @@ -137,7 +137,7 @@ oneway interface IWindow { /** * Called when Scroll Capture support is requested for a window. * - * @param controller the controller to receive responses + * @param callbacks to receive responses */ - void requestScrollCapture(in IScrollCaptureController controller); + void requestScrollCapture(in IScrollCaptureCallbacks callbacks); } diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index c460f74e7460..3c5d336b840d 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -42,7 +42,7 @@ import android.view.IDisplayFoldListener; import android.view.IDisplayWindowRotationController; import android.view.IOnKeyguardExitResult; import android.view.IPinnedStackListener; -import android.view.IScrollCaptureController; +import android.view.IScrollCaptureCallbacks; import android.view.RemoteAnimationAdapter; import android.view.IRotationWatcher; import android.view.ISystemGestureExclusionListener; @@ -751,12 +751,10 @@ interface IWindowManager * @param behindClient token for a window, used to filter the search to windows behind it, or * {@code null} to accept a window at any zOrder * @param taskId specifies the id of a task the result must belong to, or -1 to ignore task ids - * @param controller the controller to receive results, a call to either - * {@link IScrollCaptureController#onClientConnected} or - * {@link IScrollCaptureController#onClientUnavailable}. + * @param callbacks the object to receive replies */ void requestScrollCapture(int displayId, IBinder behindClient, int taskId, - IScrollCaptureController controller); + IScrollCaptureCallbacks callbacks); /** * Holds the WM lock for the specified amount of milliseconds. diff --git a/core/java/android/view/NotificationHeaderView.java b/core/java/android/view/NotificationHeaderView.java index 8b0de0807872..546e26a85d6e 100644 --- a/core/java/android/view/NotificationHeaderView.java +++ b/core/java/android/view/NotificationHeaderView.java @@ -27,7 +27,6 @@ import android.graphics.Outline; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.util.AttributeSet; -import android.widget.ImageView; import android.widget.RemoteViews; import com.android.internal.R; @@ -344,14 +343,6 @@ public class NotificationHeaderView extends ViewGroup { } } - public View getWorkProfileIcon() { - return mProfileBadge; - } - - public CachingIconView getIcon() { - return mIcon; - } - /** * Sets the margin end for the text portion of the header, excluding right-aligned elements * @param headerTextMarginEnd margin size @@ -490,10 +481,6 @@ public class NotificationHeaderView extends ViewGroup { return this; } - public ImageView getExpandButton() { - return mExpandButton; - } - @Override public boolean hasOverlappingRendering() { return false; diff --git a/core/java/android/view/ScrollCaptureCallback.java b/core/java/android/view/ScrollCaptureCallback.java index e1a4e7443600..d3aad2c72d27 100644 --- a/core/java/android/view/ScrollCaptureCallback.java +++ b/core/java/android/view/ScrollCaptureCallback.java @@ -29,8 +29,8 @@ import java.util.function.Consumer; * callbacks registered within the window. * <p> * A callback is assigned to a View using {@link View#setScrollCaptureCallback}, or to the window as - * {@link Window#addScrollCaptureCallback}. The point where the callback is registered defines the - * frame of reference for the bounds measurements used. + * {@link Window#registerScrollCaptureCallback}. The point where the callback is registered defines + * the frame of reference for the bounds measurements used. * <p> * <b>Terminology</b> * <dl> @@ -39,9 +39,9 @@ import java.util.function.Consumer; * is assigned directly to a window.</dd> * * <dt>Scroll Bounds</dt> - * <dd>A rectangle which describes an area within the containing view where scrolling content may - * be positioned. This may be the Containing View bounds itself, or any rectangle within. - * Requested by {@link #onScrollCaptureSearch}.</dd> + * <dd>A rectangle which describes an area within the containing view where scrolling content + * appears. This may be the entire view or any rectangle within. This defines a frame of reference + * for requests as well as the width and maximum height of a single request.</dd> * * <dt>Scroll Delta</dt> * <dd>The distance the scroll position has moved since capture started. Implementations are @@ -57,7 +57,7 @@ import java.util.function.Consumer; * * @see View#setScrollCaptureHint(int) * @see View#setScrollCaptureCallback(ScrollCaptureCallback) - * @see Window#addScrollCaptureCallback(ScrollCaptureCallback) + * @see Window#registerScrollCaptureCallback(ScrollCaptureCallback) * * @hide */ diff --git a/core/java/android/view/ScrollCaptureClient.java b/core/java/android/view/ScrollCaptureConnection.java index f163124f3a98..0e6cdd1dbec5 100644 --- a/core/java/android/view/ScrollCaptureClient.java +++ b/core/java/android/view/ScrollCaptureConnection.java @@ -19,7 +19,6 @@ package android.view; import static java.util.Objects.requireNonNull; import android.annotation.NonNull; -import android.annotation.Nullable; import android.annotation.UiThread; import android.annotation.WorkerThread; import android.graphics.Point; @@ -33,15 +32,15 @@ import com.android.internal.annotations.VisibleForTesting; import java.util.concurrent.atomic.AtomicBoolean; /** - * A client of the system providing Scroll Capture capability on behalf of a Window. + * Mediator between a selected scroll capture target view and a remote process. * <p> * An instance is created to wrap the selected {@link ScrollCaptureCallback}. * * @hide */ -public class ScrollCaptureClient extends IScrollCaptureClient.Stub { +public class ScrollCaptureConnection extends IScrollCaptureConnection.Stub { - private static final String TAG = "ScrollCaptureClient"; + private static final String TAG = "ScrollCaptureConnection"; private static final int DEFAULT_TIMEOUT = 1000; private final Handler mHandler; @@ -49,7 +48,7 @@ public class ScrollCaptureClient extends IScrollCaptureClient.Stub { private int mTimeoutMillis = DEFAULT_TIMEOUT; protected Surface mSurface; - private IScrollCaptureController mController; + private IScrollCaptureCallbacks mCallbacks; private final Rect mScrollBounds; private final Point mPositionInWindow; @@ -62,18 +61,18 @@ public class ScrollCaptureClient extends IScrollCaptureClient.Stub { private DelayedAction mTimeoutAction; /** - * Constructs a ScrollCaptureClient. + * Constructs a ScrollCaptureConnection. * * @param selectedTarget the target the client is controlling - * @param controller the callbacks to reply to system requests + * @param callbacks the callbacks to reply to system requests * * @hide */ - public ScrollCaptureClient( + public ScrollCaptureConnection( @NonNull ScrollCaptureTarget selectedTarget, - @NonNull IScrollCaptureController controller) { + @NonNull IScrollCaptureCallbacks callbacks) { requireNonNull(selectedTarget, "<selectedTarget> must non-null"); - requireNonNull(controller, "<controller> must non-null"); + requireNonNull(callbacks, "<callbacks> must non-null"); final Rect scrollBounds = requireNonNull(selectedTarget.getScrollBounds(), "target.getScrollBounds() must be non-null to construct a client"); @@ -82,7 +81,7 @@ public class ScrollCaptureClient extends IScrollCaptureClient.Stub { mScrollBounds = new Rect(scrollBounds); mPositionInWindow = new Point(selectedTarget.getPositionInWindow()); - mController = controller; + mCallbacks = callbacks; mCloseGuard = new CloseGuard(); mCloseGuard.open("close"); @@ -106,14 +105,13 @@ public class ScrollCaptureClient extends IScrollCaptureClient.Stub { mTimeoutMillis = timeoutMillis; } - @Nullable @VisibleForTesting public DelayedAction getTimeoutAction() { return mTimeoutAction; } private void checkConnected() { - if (mSelectedTarget == null || mController == null) { + if (mSelectedTarget == null || mCallbacks == null) { throw new IllegalStateException("This client has been disconnected."); } } @@ -124,7 +122,7 @@ public class ScrollCaptureClient extends IScrollCaptureClient.Stub { } } - @WorkerThread // IScrollCaptureClient + @WorkerThread // IScrollCaptureConnection @Override public void startCapture(Surface surface) throws RemoteException { checkConnected(); @@ -140,7 +138,7 @@ public class ScrollCaptureClient extends IScrollCaptureClient.Stub { if (cancelTimeout()) { mHandler.post(() -> { try { - mController.onCaptureStarted(); + mCallbacks.onCaptureStarted(); } catch (RemoteException e) { doShutdown(); } @@ -153,7 +151,7 @@ public class ScrollCaptureClient extends IScrollCaptureClient.Stub { endCapture(); } - @WorkerThread // IScrollCaptureClient + @WorkerThread // IScrollCaptureConnection @Override public void requestImage(Rect requestRect) { checkConnected(); @@ -170,7 +168,7 @@ public class ScrollCaptureClient extends IScrollCaptureClient.Stub { if (cancelTimeout()) { mHandler.post(() -> { try { - mController.onCaptureBufferSent(frameNumber, finalCapturedArea); + mCallbacks.onCaptureBufferSent(frameNumber, finalCapturedArea); } catch (RemoteException e) { doShutdown(); } @@ -183,7 +181,7 @@ public class ScrollCaptureClient extends IScrollCaptureClient.Stub { endCapture(); } - @WorkerThread // IScrollCaptureClient + @WorkerThread // IScrollCaptureConnection @Override public void endCapture() { if (isStarted()) { @@ -196,7 +194,7 @@ public class ScrollCaptureClient extends IScrollCaptureClient.Stub { } private boolean isStarted() { - return mController != null && mSelectedTarget != null; + return mCallbacks != null && mSelectedTarget != null; } @UiThread @@ -214,8 +212,8 @@ public class ScrollCaptureClient extends IScrollCaptureClient.Stub { private void doShutdown() { try { - if (mController != null) { - mController.onConnectionClosed(); + if (mCallbacks != null) { + mCallbacks.onConnectionClosed(); } } catch (RemoteException e) { // Ignore @@ -235,15 +233,15 @@ public class ScrollCaptureClient extends IScrollCaptureClient.Stub { } mSelectedTarget = null; - mController = null; + mCallbacks = null; } /** @return a string representation of the state of this client */ public String toString() { - return "ScrollCaptureClient{" + return "ScrollCaptureConnection{" + ", session=" + mSession + ", selectedTarget=" + mSelectedTarget - + ", clientCallbacks=" + mController + + ", clientCallbacks=" + mCallbacks + "}"; } diff --git a/core/java/android/view/ScrollCaptureSession.java b/core/java/android/view/ScrollCaptureSession.java index 628e23fb3f5e..92617a325265 100644 --- a/core/java/android/view/ScrollCaptureSession.java +++ b/core/java/android/view/ScrollCaptureSession.java @@ -36,15 +36,15 @@ public class ScrollCaptureSession { private final Point mPositionInWindow; @Nullable - private ScrollCaptureClient mClient; + private ScrollCaptureConnection mConnection; /** @hide */ public ScrollCaptureSession(Surface surface, Rect scrollBounds, Point positionInWindow, - ScrollCaptureClient client) { + ScrollCaptureConnection connection) { mSurface = surface; mScrollBounds = scrollBounds; mPositionInWindow = positionInWindow; - mClient = client; + mConnection = connection; } /** @@ -88,8 +88,8 @@ public class ScrollCaptureSession { * @param capturedArea the area captured, relative to scroll bounds */ public void notifyBufferSent(long frameNumber, @NonNull Rect capturedArea) { - if (mClient != null) { - mClient.onRequestImageCompleted(frameNumber, capturedArea); + if (mConnection != null) { + mConnection.onRequestImageCompleted(frameNumber, capturedArea); } } @@ -97,7 +97,7 @@ public class ScrollCaptureSession { * @hide */ public void disconnect() { - mClient = null; + mConnection = null; if (mSurface.isValid()) { mSurface.release(); } diff --git a/core/java/android/view/ScrollCaptureTargetResolver.java b/core/java/android/view/ScrollCaptureTargetResolver.java index 71e82c511e2c..5106534694a1 100644 --- a/core/java/android/view/ScrollCaptureTargetResolver.java +++ b/core/java/android/view/ScrollCaptureTargetResolver.java @@ -57,7 +57,6 @@ import java.util.function.Consumer; @UiThread public class ScrollCaptureTargetResolver { private static final String TAG = "ScrollCaptureTargetRes"; - private static final boolean DEBUG = true; private final Object mLock = new Object(); @@ -86,18 +85,11 @@ public class ScrollCaptureTargetResolver { * Binary operator which selects the best {@link ScrollCaptureTarget}. */ private static ScrollCaptureTarget chooseTarget(ScrollCaptureTarget a, ScrollCaptureTarget b) { - Log.d(TAG, "chooseTarget: " + a + " or " + b); - // Nothing plus nothing is still nothing. if (a == null && b == null) { - Log.d(TAG, "chooseTarget: (both null) return " + null); return null; - } - // Prefer non-null. - if (a == null || b == null) { + } else if (a == null || b == null) { ScrollCaptureTarget c = (a == null) ? b : a; - Log.d(TAG, "chooseTarget: (other is null) return " + c); return c; - } boolean emptyScrollBoundsA = nullOrEmpty(a.getScrollBounds()); @@ -155,8 +147,7 @@ public class ScrollCaptureTargetResolver { * * @param targets a list of {@link ScrollCaptureTarget} as collected by {@link * View#dispatchScrollCaptureSearch}. - * @param uiHandler the UI thread handler for the view tree - * @see #start(long, Consumer) + * @see #start(Handler, long, Consumer) */ public ScrollCaptureTargetResolver(Queue<ScrollCaptureTarget> targets) { mTargets = targets; @@ -184,7 +175,6 @@ public class ScrollCaptureTargetResolver { return mResult; } - private void supplyResult(ScrollCaptureTarget target) { checkThread(); if (mFinished) { @@ -232,12 +222,11 @@ public class ScrollCaptureTargetResolver { return; } mStarted = true; - uiHandler.post(() -> run(timeLimitMillis, resultConsumer)); + uiHandler.post(this::run); } } - - private void run(long timeLimitMillis, Consumer<ScrollCaptureTarget> resultConsumer) { + private void run() { checkThread(); mPendingBoundsRequests = mTargets.size(); @@ -248,15 +237,11 @@ public class ScrollCaptureTargetResolver { mHandler.postAtTime(mTimeoutRunnable, mDeadlineMillis); } - private final Runnable mTimeoutRunnable = new Runnable() { - @Override - public void run() { - checkThread(); - supplyResult(null); - } + private final Runnable mTimeoutRunnable = () -> { + checkThread(); + supplyResult(null); }; - /** * Adds a target to the list and requests {@link ScrollCaptureCallback#onScrollCaptureSearch} * scrollBounds} from it. Results are returned by a call to {@link #onScrollBoundsProvided}. @@ -274,7 +259,6 @@ public class ScrollCaptureTargetResolver { // Queue and consume on the UI thread ((scrollBounds) -> mHandler.post( () -> onScrollBoundsProvided(target, scrollBounds))))); - } @UiThread @@ -300,14 +284,8 @@ public class ScrollCaptureTargetResolver { supplyResult(target); } - System.err.println("mPendingBoundsRequests: " + mPendingBoundsRequests); - System.err.println("mDeadlineMillis: " + mDeadlineMillis); - System.err.println("SystemClock.elapsedRealtime(): " + SystemClock.elapsedRealtime()); - if (!mFinished) { // Reschedule the timeout. - System.err.println( - "We think we're NOT done yet and will check back at " + mDeadlineMillis); mHandler.postAtTime(mTimeoutRunnable, mDeadlineMillis); } } @@ -334,44 +312,17 @@ public class ScrollCaptureTargetResolver { return otherParent == view; } - private static int findRelation(@NonNull View a, @NonNull View b) { - if (a == b) { - return 0; - } - - ViewParent parentA = a.getParent(); - ViewParent parentB = b.getParent(); - - while (parentA != null || parentB != null) { - if (parentA == parentB) { - return 0; - } - if (parentA == b) { - return 1; // A is descendant of B - } - if (parentB == a) { - return -1; // B is descendant of A - } - if (parentA != null) { - parentA = parentA.getParent(); - } - if (parentB != null) { - parentB = parentB.getParent(); - } - } - return 0; - } - /** * A safe wrapper for a consumer callbacks intended to accept a single value. It ensures * that the receiver of the consumer does not retain a reference to {@code target} after use nor * cause race conditions by invoking {@link Consumer#accept accept} more than once. - * - * @param target the target consumer */ static class SingletonConsumer<T> implements Consumer<T> { final AtomicReference<Consumer<T>> mAtomicRef; + /** + * @param target the target consumer + **/ SingletonConsumer(Consumer<T> target) { mAtomicRef = new AtomicReference<>(target); } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 80f5c0fb8257..f0203011b4f2 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -649,7 +649,7 @@ public final class ViewRootImpl implements ViewParent, private final InsetsController mInsetsController; private final ImeFocusController mImeFocusController; - private ScrollCaptureClient mScrollCaptureClient; + private ScrollCaptureConnection mScrollCaptureConnection; /** * @return {@link ImeFocusController} for this instance. @@ -659,10 +659,10 @@ public final class ViewRootImpl implements ViewParent, return mImeFocusController; } - /** @return The current {@link ScrollCaptureClient} for this instance, if any is active. */ + /** @return The current {@link ScrollCaptureConnection} for this instance, if any is active. */ @Nullable - public ScrollCaptureClient getScrollCaptureClient() { - return mScrollCaptureClient; + public ScrollCaptureConnection getScrollCaptureConnection() { + return mScrollCaptureConnection; } private final GestureExclusionTracker mGestureExclusionTracker = new GestureExclusionTracker(); @@ -5192,7 +5192,7 @@ public final class ViewRootImpl implements ViewParent, updateLocationInParentDisplay(msg.arg1, msg.arg2); } break; case MSG_REQUEST_SCROLL_CAPTURE: - handleScrollCaptureRequest((IScrollCaptureController) msg.obj); + handleScrollCaptureRequest((IScrollCaptureCallbacks) msg.obj); break; } } @@ -8979,10 +8979,10 @@ public final class ViewRootImpl implements ViewParent, /** * Dispatches a scroll capture request to the view hierarchy on the ui thread. * - * @param controller the controller to receive replies + * @param callbacks for replies */ - public void dispatchScrollCaptureRequest(@NonNull IScrollCaptureController controller) { - mHandler.obtainMessage(MSG_REQUEST_SCROLL_CAPTURE, controller).sendToTarget(); + public void dispatchScrollCaptureRequest(@NonNull IScrollCaptureCallbacks callbacks) { + mHandler.obtainMessage(MSG_REQUEST_SCROLL_CAPTURE, callbacks).sendToTarget(); } /** @@ -9007,14 +9007,14 @@ public final class ViewRootImpl implements ViewParent, * Handles an inbound request for scroll capture from the system. If a client is not already * active, a search will be dispatched through the view tree to locate scrolling content. * <p> - * Either {@link IScrollCaptureController#onClientConnected(IScrollCaptureClient, Rect, - * Point)} or {@link IScrollCaptureController#onClientUnavailable()} will be returned + * Either {@link IScrollCaptureCallbacks#onClientConnected(IScrollCaptureConnection, Rect, + * Point)} or {@link IScrollCaptureCallbacks#onUnavailable()} will be returned * depending on the results of the search. * - * @param controller the interface to the system controller + * @param callbacks to receive responses * @see ScrollCaptureTargetResolver */ - private void handleScrollCaptureRequest(@NonNull IScrollCaptureController controller) { + private void handleScrollCaptureRequest(@NonNull IScrollCaptureCallbacks callbacks) { LinkedList<ScrollCaptureTarget> targetList = new LinkedList<>(); // Window (root) level callbacks @@ -9029,7 +9029,7 @@ public final class ViewRootImpl implements ViewParent, // No-op path. Scroll capture not offered for this window. if (targetList.isEmpty()) { - dispatchScrollCaptureSearchResult(controller, null); + dispatchScrollCaptureSearchResult(callbacks, null); return; } @@ -9037,12 +9037,12 @@ public final class ViewRootImpl implements ViewParent, // Continues with the consumer once all responses are consumed, or the timeout expires. ScrollCaptureTargetResolver resolver = new ScrollCaptureTargetResolver(targetList); resolver.start(mHandler, 1000, - (selected) -> dispatchScrollCaptureSearchResult(controller, selected)); + (selected) -> dispatchScrollCaptureSearchResult(callbacks, selected)); } /** Called by {@link #handleScrollCaptureRequest} when a result is returned */ private void dispatchScrollCaptureSearchResult( - @NonNull IScrollCaptureController controller, + @NonNull IScrollCaptureCallbacks callbacks, @Nullable ScrollCaptureTarget selectedTarget) { // If timeout or no eligible targets found. @@ -9051,31 +9051,31 @@ public final class ViewRootImpl implements ViewParent, if (DEBUG_SCROLL_CAPTURE) { Log.d(TAG, "scrollCaptureSearch returned no targets available."); } - controller.onClientUnavailable(); + callbacks.onUnavailable(); } catch (RemoteException e) { if (DEBUG_SCROLL_CAPTURE) { - Log.w(TAG, "Failed to notify controller of scroll capture search result.", e); + Log.w(TAG, "Failed to send scroll capture search result.", e); } } return; } // Create a client instance and return it to the caller - mScrollCaptureClient = new ScrollCaptureClient(selectedTarget, controller); + mScrollCaptureConnection = new ScrollCaptureConnection(selectedTarget, callbacks); try { if (DEBUG_SCROLL_CAPTURE) { - Log.d(TAG, "scrollCaptureSearch returning client: " + getScrollCaptureClient()); + Log.d(TAG, "scrollCaptureSearch returning client: " + getScrollCaptureConnection()); } - controller.onClientConnected( - mScrollCaptureClient, + callbacks.onConnected( + mScrollCaptureConnection, selectedTarget.getScrollBounds(), selectedTarget.getPositionInWindow()); } catch (RemoteException e) { if (DEBUG_SCROLL_CAPTURE) { - Log.w(TAG, "Failed to notify controller of scroll capture search result.", e); + Log.w(TAG, "Failed to send scroll capture search result.", e); } - mScrollCaptureClient.disconnect(); - mScrollCaptureClient = null; + mScrollCaptureConnection.disconnect(); + mScrollCaptureConnection = null; } } @@ -9373,10 +9373,10 @@ public final class ViewRootImpl implements ViewParent, } @Override - public void requestScrollCapture(IScrollCaptureController controller) { + public void requestScrollCapture(IScrollCaptureCallbacks callbacks) { final ViewRootImpl viewAncestor = mViewAncestor.get(); if (viewAncestor != null) { - viewAncestor.dispatchScrollCaptureRequest(controller); + viewAncestor.dispatchScrollCaptureRequest(callbacks); } } } diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java index 1dbf37aca689..5331a1b8d538 100644 --- a/core/java/android/view/Window.java +++ b/core/java/android/view/Window.java @@ -2560,19 +2560,20 @@ public abstract class Window { /** * System request to begin scroll capture. * - * @param controller the controller to receive responses + * @param callbacks to receive responses * @hide */ - public void requestScrollCapture(IScrollCaptureController controller) { + public void requestScrollCapture(IScrollCaptureCallbacks callbacks) { } /** - * Registers a {@link ScrollCaptureCallback} with the root of this window. + * Used to provide scroll capture support for an arbitrary window. This registeres the given + * callback with the root view of the window. * * @param callback the callback to add * @hide */ - public void addScrollCaptureCallback(@NonNull ScrollCaptureCallback callback) { + public void registerScrollCaptureCallback(@NonNull ScrollCaptureCallback callback) { } /** @@ -2581,7 +2582,7 @@ public abstract class Window { * @param callback the callback to remove * @hide */ - public void removeScrollCaptureCallback(@NonNull ScrollCaptureCallback callback) { + public void unregisterScrollCaptureCallback(@NonNull ScrollCaptureCallback callback) { } /** @hide */ diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index e96e98b437a1..964ea3488710 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -224,12 +224,6 @@ public interface WindowManager extends ViewManager { int TRANSIT_ACTIVITY_RELAUNCH = 18; /** - * A task is being docked from recents. - * @hide - */ - int TRANSIT_DOCK_TASK_FROM_RECENTS = 19; - - /** * Keyguard is going away. * @hide */ @@ -302,7 +296,6 @@ public interface WindowManager extends ViewManager { TRANSIT_WALLPAPER_INTRA_CLOSE, TRANSIT_TASK_OPEN_BEHIND, TRANSIT_ACTIVITY_RELAUNCH, - TRANSIT_DOCK_TASK_FROM_RECENTS, TRANSIT_KEYGUARD_GOING_AWAY, TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER, TRANSIT_KEYGUARD_OCCLUDE, diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java index aed9b89747d0..a9e8d5498a57 100644 --- a/core/java/android/view/accessibility/AccessibilityManager.java +++ b/core/java/android/view/accessibility/AccessibilityManager.java @@ -1249,7 +1249,6 @@ public final class AccessibilityManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY) public void performAccessibilityShortcut() { performAccessibilityShortcut(null); @@ -1294,7 +1293,6 @@ public final class AccessibilityManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY) public void registerSystemAction(@NonNull RemoteAction action, int actionId) { final IAccessibilityManager service; @@ -1322,7 +1320,6 @@ public final class AccessibilityManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY) public void unregisterSystemAction(int actionId) { final IAccessibilityManager service; diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java index 9ba886aba81a..fb66b5298839 100644 --- a/core/java/android/view/autofill/AutofillManager.java +++ b/core/java/android/view/autofill/AutofillManager.java @@ -2076,7 +2076,6 @@ public final class AutofillManager { * @hide */ @SystemApi - @TestApi public void setAugmentedAutofillWhitelist(@Nullable Set<String> packages, @Nullable Set<ComponentName> activities) { if (!hasAutofillFeature()) { diff --git a/core/java/android/view/contentcapture/ContentCaptureContext.java b/core/java/android/view/contentcapture/ContentCaptureContext.java index b84cb88ccd84..9bf3626fe868 100644 --- a/core/java/android/view/contentcapture/ContentCaptureContext.java +++ b/core/java/android/view/contentcapture/ContentCaptureContext.java @@ -21,7 +21,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.TaskInfo; import android.content.ComponentName; import android.content.Context; @@ -58,7 +57,6 @@ public final class ContentCaptureContext implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int FLAG_DISABLED_BY_APP = 0x1; /** @@ -69,7 +67,6 @@ public final class ContentCaptureContext implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int FLAG_DISABLED_BY_FLAG_SECURE = 0x2; /** @@ -79,7 +76,6 @@ public final class ContentCaptureContext implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int FLAG_RECONNECTED = 0x4; /** @hide */ @@ -173,7 +169,6 @@ public final class ContentCaptureContext implements Parcelable { * @hide */ @SystemApi - @TestApi public int getTaskId() { return mTaskId; } @@ -184,7 +179,6 @@ public final class ContentCaptureContext implements Parcelable { * @hide */ @SystemApi - @TestApi public @Nullable ComponentName getActivityComponent() { return mComponentName; } @@ -197,7 +191,6 @@ public final class ContentCaptureContext implements Parcelable { * @hide */ @SystemApi - @TestApi public @Nullable ContentCaptureSessionId getParentSessionId() { return mParentSessionId == NO_SESSION_ID ? null : new ContentCaptureSessionId(mParentSessionId); @@ -215,7 +208,6 @@ public final class ContentCaptureContext implements Parcelable { * @hide */ @SystemApi - @TestApi public int getDisplayId() { return mDisplayId; } @@ -229,7 +221,6 @@ public final class ContentCaptureContext implements Parcelable { * @hide */ @SystemApi - @TestApi public @ContextCreationFlags int getFlags() { return mFlags; } diff --git a/core/java/android/view/contentcapture/ContentCaptureEvent.java b/core/java/android/view/contentcapture/ContentCaptureEvent.java index f49b1beee8ad..2b12230510bf 100644 --- a/core/java/android/view/contentcapture/ContentCaptureEvent.java +++ b/core/java/android/view/contentcapture/ContentCaptureEvent.java @@ -22,7 +22,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.graphics.Insets; import android.os.Parcel; import android.os.Parcelable; @@ -39,7 +38,6 @@ import java.util.List; /** @hide */ @SystemApi -@TestApi public final class ContentCaptureEvent implements Parcelable { private static final String TAG = ContentCaptureEvent.class.getSimpleName(); diff --git a/core/java/android/view/contentcapture/ContentCaptureManager.java b/core/java/android/view/contentcapture/ContentCaptureManager.java index 029552d4902e..10f6c610d5d3 100644 --- a/core/java/android/view/contentcapture/ContentCaptureManager.java +++ b/core/java/android/view/contentcapture/ContentCaptureManager.java @@ -644,7 +644,6 @@ public final class ContentCaptureManager { * @hide */ @SystemApi - @TestApi public boolean isContentCaptureFeatureEnabled() { final SyncResultReceiver resultReceiver = syncRun( (r) -> mService.isContentCaptureFeatureEnabled(r)); diff --git a/core/java/android/view/contentcapture/ViewNode.java b/core/java/android/view/contentcapture/ViewNode.java index e035c620d1fd..e731d4b76fb9 100644 --- a/core/java/android/view/contentcapture/ViewNode.java +++ b/core/java/android/view/contentcapture/ViewNode.java @@ -42,7 +42,6 @@ import com.android.internal.util.Preconditions; // instead /** @hide */ @SystemApi -@TestApi public final class ViewNode extends AssistStructure.ViewNode { private static final String TAG = ViewNode.class.getSimpleName(); diff --git a/core/java/android/window/ITaskOrganizerController.aidl b/core/java/android/window/ITaskOrganizerController.aidl index 3a84c1f98ce6..b5a11b1a8136 100644 --- a/core/java/android/window/ITaskOrganizerController.aidl +++ b/core/java/android/window/ITaskOrganizerController.aidl @@ -39,8 +39,12 @@ interface ITaskOrganizerController { */ void unregisterTaskOrganizer(ITaskOrganizer organizer); - /** Creates a persistent root task in WM for a particular windowing-mode. */ - ActivityManager.RunningTaskInfo createRootTask(int displayId, int windowingMode); + /** + * Creates a persistent root task in WM for a particular windowing-mode. + * {@link TaskOrganizer#onTaskAppeared} won't be called since we are returning + * {@link TaskAppearedInfo} here. + */ + TaskAppearedInfo createRootTask(int displayId, int windowingMode); /** Deletes a persistent root task in WM */ boolean deleteRootTask(in WindowContainerToken task); diff --git a/core/java/android/window/TaskOrganizer.java b/core/java/android/window/TaskOrganizer.java index 909bb47bf1a5..5c86e1c124f7 100644 --- a/core/java/android/window/TaskOrganizer.java +++ b/core/java/android/window/TaskOrganizer.java @@ -99,7 +99,7 @@ public class TaskOrganizer extends WindowOrganizer { /** Creates a persistent root task in WM for a particular windowing-mode. */ @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) @Nullable - public ActivityManager.RunningTaskInfo createRootTask(int displayId, int windowingMode) { + public TaskAppearedInfo createRootTask(int displayId, int windowingMode) { try { return mTaskOrganizerController.createRootTask(displayId, windowingMode); } catch (RemoteException e) { diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java index 50eed27976ad..e848da9b8ee3 100644 --- a/core/java/com/android/internal/policy/PhoneWindow.java +++ b/core/java/com/android/internal/policy/PhoneWindow.java @@ -77,7 +77,7 @@ import android.util.TypedValue; import android.view.ContextThemeWrapper; import android.view.Gravity; import android.view.IRotationWatcher.Stub; -import android.view.IScrollCaptureController; +import android.view.IScrollCaptureCallbacks; import android.view.IWindowManager; import android.view.InputDevice; import android.view.InputEvent; @@ -1511,11 +1511,13 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { if (drawable != mBackgroundDrawable) { mBackgroundDrawable = drawable; if (mDecor != null) { + mDecor.startChanging(); mDecor.setWindowBackground(drawable); if (mBackgroundFallbackDrawable != null) { mDecor.setBackgroundFallback(drawable != null ? null : mBackgroundFallbackDrawable); } + mDecor.finishChanging(); } } } @@ -3910,12 +3912,12 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { /** * System request to begin scroll capture. * - * @param controller the controller to receive responses + * @param callbacks to receive responses * @hide */ @Override - public void requestScrollCapture(IScrollCaptureController controller) { - getViewRootImpl().dispatchScrollCaptureRequest(controller); + public void requestScrollCapture(IScrollCaptureCallbacks callbacks) { + getViewRootImpl().dispatchScrollCaptureRequest(callbacks); } /** @@ -3924,7 +3926,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { * @param callback the callback to add */ @Override - public void addScrollCaptureCallback(@NonNull ScrollCaptureCallback callback) { + public void registerScrollCaptureCallback(@NonNull ScrollCaptureCallback callback) { getViewRootImpl().addScrollCaptureCallback(callback); } @@ -3934,7 +3936,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { * @param callback the callback to remove */ @Override - public void removeScrollCaptureCallback(@NonNull ScrollCaptureCallback callback) { + public void unregisterScrollCaptureCallback(@NonNull ScrollCaptureCallback callback) { getViewRootImpl().removeScrollCaptureCallback(callback); } diff --git a/core/java/com/android/internal/view/BaseIWindow.java b/core/java/com/android/internal/view/BaseIWindow.java index fff9ac9e49b7..8962dc3d59da 100644 --- a/core/java/com/android/internal/view/BaseIWindow.java +++ b/core/java/com/android/internal/view/BaseIWindow.java @@ -24,7 +24,7 @@ import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.util.MergedConfiguration; import android.view.DragEvent; -import android.view.IScrollCaptureController; +import android.view.IScrollCaptureCallbacks; import android.view.IWindow; import android.view.IWindowSession; import android.view.InsetsSourceControl; @@ -162,9 +162,9 @@ public class BaseIWindow extends IWindow.Stub { } @Override - public void requestScrollCapture(IScrollCaptureController controller) { + public void requestScrollCapture(IScrollCaptureCallbacks callbacks) { try { - controller.onClientUnavailable(); + callbacks.onUnavailable(); } catch (RemoteException ex) { // ignore } diff --git a/core/jni/android_graphics_BLASTBufferQueue.cpp b/core/jni/android_graphics_BLASTBufferQueue.cpp index b07c29307339..0fc0451c6d4b 100644 --- a/core/jni/android_graphics_BLASTBufferQueue.cpp +++ b/core/jni/android_graphics_BLASTBufferQueue.cpp @@ -55,7 +55,7 @@ static void nativeDestroy(JNIEnv* env, jclass clazz, jlong ptr) { static jobject nativeGetSurface(JNIEnv* env, jclass clazz, jlong ptr) { sp<BLASTBufferQueue> queue = reinterpret_cast<BLASTBufferQueue*>(ptr); - return android_view_Surface_createFromIGraphicBufferProducer(env, queue->getIGraphicBufferProducer()); + return android_view_Surface_createFromSurface(env, queue->getSurface()); } static void nativeSetNextTransaction(JNIEnv* env, jclass clazz, jlong ptr, jlong transactionPtr) { diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index 6a07cf7bbf40..5c87f1973bed 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -313,7 +313,7 @@ static jlong nativeGetFromBlastBufferQueue(JNIEnv* env, jclass clazz, jlong nati return nativeObject; } - sp<Surface> surface(new Surface(bufferProducer, true)); + sp<Surface> surface = queue->getSurface(); if (surface != NULL) { surface->incStrong(&sRefBaseOwner); } diff --git a/core/proto/android/telephony/enums.proto b/core/proto/android/telephony/enums.proto index e7fdde6473b5..d2c02769aa78 100644 --- a/core/proto/android/telephony/enums.proto +++ b/core/proto/android/telephony/enums.proto @@ -91,6 +91,14 @@ enum NetworkTypeEnum { NETWORK_TYPE_NR = 20; } +// Roaming type enums, see android.telephony.ServiceState.RoamingType for definitions. +enum RoamingTypeEnum { + ROAMING_TYPE_NOT_ROAMING = 0; + ROAMING_TYPE_ROAMING = 1; + ROAMING_TYPE_ROAMING_DOMESTIC = 2; + ROAMING_TYPE_ROAMING_INTERNATIONAL = 3; +} + // Signal strength levels, primarily used by android/telephony/SignalStrength.java. enum SignalStrengthEnum { SIGNAL_STRENGTH_NONE_OR_UNKNOWN = 0; diff --git a/core/proto/android/view/enums.proto b/core/proto/android/view/enums.proto index 0172e7899a18..a601abee17f6 100644 --- a/core/proto/android/view/enums.proto +++ b/core/proto/android/view/enums.proto @@ -60,7 +60,7 @@ enum TransitionTypeEnum { TRANSIT_TASK_OPEN_BEHIND = 16; TRANSIT_TASK_IN_PLACE = 17; TRANSIT_ACTIVITY_RELAUNCH = 18; - TRANSIT_DOCK_TASK_FROM_RECENTS = 19; + TRANSIT_DOCK_TASK_FROM_RECENTS = 19 [deprecated=true]; TRANSIT_KEYGUARD_GOING_AWAY = 20; TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER = 21; TRANSIT_KEYGUARD_OCCLUDE = 22; diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 64de32c9ad09..b74f96de33b1 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -3748,6 +3748,7 @@ <flag name="flagServiceHandlesDoubleTap" value="0x00000800" /> <!-- Has flag {@link android.accessibilityservice.AccessibilityServiceInfo#FLAG_REQUEST_MULTI_FINGER_GESTURES}. --> <flag name="flagRequestMultiFingerGestures" value="0x00001000" /> + <flag name="flagSendMotionEvents" value="0x0004000" /> </attr> <!-- Component name of an activity that allows the user to modify the settings for this service. This setting cannot be changed at runtime. --> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 645bae728c02..c2120de74d01 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -4494,8 +4494,9 @@ shown in the warning dialog about the accessibility shortcut. --> <string name="color_correction_feature_name">Color Correction</string> + <!-- TODO(b/170970602): remove translatable=false when RBC has official name and strings --> <!-- Title of Reduce Bright Colors feature, shown in the warning dialog about the accessibility shortcut. [CHAR LIMIT=none] --> - <string name="reduce_bright_colors_feature_name">Reduce Bright Colors</string> + <string name="reduce_bright_colors_feature_name" translatable="false">Reduce Bright Colors</string> <!-- Text in toast to alert the user that the accessibility shortcut turned on an accessibility service. [CHAR LIMIT=none] --> <string name="accessibility_shortcut_enabling_service">Held volume keys. <xliff:g id="service_name" example="TalkBack">%1$s</xliff:g> turned on.</string> diff --git a/core/tests/coretests/src/android/view/ScrollCaptureClientTest.java b/core/tests/coretests/src/android/view/ScrollCaptureConnectionTest.java index e6ac2d6c43da..b9cf1e4a234c 100644 --- a/core/tests/coretests/src/android/view/ScrollCaptureClientTest.java +++ b/core/tests/coretests/src/android/view/ScrollCaptureConnectionTest.java @@ -47,11 +47,11 @@ import org.mockito.MockitoAnnotations; import org.mockito.stubbing.Answer; /** - * Tests of {@link ScrollCaptureClient}. + * Tests of {@link ScrollCaptureConnection}. */ @SuppressWarnings("UnnecessaryLocalVariable") @RunWith(AndroidJUnit4.class) -public class ScrollCaptureClientTest { +public class ScrollCaptureConnectionTest { private final Point mPositionInWindow = new Point(1, 2); private final Rect mLocalVisibleRect = new Rect(2, 3, 4, 5); @@ -63,7 +63,7 @@ public class ScrollCaptureClientTest { @Mock private Surface mSurface; @Mock - private IScrollCaptureController mClientCallbacks; + private IScrollCaptureCallbacks mConnectionCallbacks; @Mock private View mMockView1; @Mock @@ -86,8 +86,8 @@ public class ScrollCaptureClientTest { @Test public void testDelayedAction() { Runnable action = Mockito.mock(Runnable.class); - ScrollCaptureClient.DelayedAction delayed = - new ScrollCaptureClient.DelayedAction(mHandler, 100, action); + ScrollCaptureConnection.DelayedAction delayed = + new ScrollCaptureConnection.DelayedAction(mHandler, 100, action); try { Thread.sleep(200); } catch (InterruptedException ex) { @@ -103,8 +103,8 @@ public class ScrollCaptureClientTest { @Test public void testDelayedAction_cancel() { Runnable action = Mockito.mock(Runnable.class); - ScrollCaptureClient.DelayedAction delayed = - new ScrollCaptureClient.DelayedAction(mHandler, 100, action); + ScrollCaptureConnection.DelayedAction delayed = + new ScrollCaptureConnection.DelayedAction(mHandler, 100, action); try { Thread.sleep(50); } catch (InterruptedException ex) { @@ -125,8 +125,8 @@ public class ScrollCaptureClientTest { @Test public void testDelayedAction_timeoutNow() { Runnable action = Mockito.mock(Runnable.class); - ScrollCaptureClient.DelayedAction delayed = - new ScrollCaptureClient.DelayedAction(mHandler, 100, action); + ScrollCaptureConnection.DelayedAction delayed = + new ScrollCaptureConnection.DelayedAction(mHandler, 100, action); try { Thread.sleep(50); } catch (InterruptedException ex) { @@ -141,7 +141,7 @@ public class ScrollCaptureClientTest { /** Test creating a client with valid info */ @Test public void testConstruction() { - new ScrollCaptureClient(mTarget1, mClientCallbacks); + new ScrollCaptureConnection(mTarget1, mConnectionCallbacks); } /** Test creating a client fails if arguments are not valid. */ @@ -149,7 +149,7 @@ public class ScrollCaptureClientTest { public void testConstruction_requiresScrollBounds() { try { mTarget1.setScrollBounds(null); - new ScrollCaptureClient(mTarget1, mClientCallbacks); + new ScrollCaptureConnection(mTarget1, mConnectionCallbacks); fail("An exception was expected."); } catch (RuntimeException ex) { // Ignore, expected. @@ -174,48 +174,51 @@ public class ScrollCaptureClientTest { }; } - /** @see ScrollCaptureClient#startCapture(Surface) */ + /** @see ScrollCaptureConnection#startCapture(Surface) */ @Test public void testStartCapture() throws Exception { - final ScrollCaptureClient client = new ScrollCaptureClient(mTarget1, mClientCallbacks); + final ScrollCaptureConnection connection = new ScrollCaptureConnection(mTarget1, + mConnectionCallbacks); // Have the session start accepted immediately doAnswer(runRunnable(1)).when(mCallback1) .onScrollCaptureStart(any(ScrollCaptureSession.class), any(Runnable.class)); - client.startCapture(mSurface); + connection.startCapture(mSurface); getInstrumentation().waitForIdleSync(); verify(mCallback1, times(1)) .onScrollCaptureStart(any(ScrollCaptureSession.class), any(Runnable.class)); - verify(mClientCallbacks, times(1)).onCaptureStarted(); - verifyNoMoreInteractions(mClientCallbacks); + verify(mConnectionCallbacks, times(1)).onCaptureStarted(); + verifyNoMoreInteractions(mConnectionCallbacks); } @Test public void testStartCaptureTimeout() throws Exception { - final ScrollCaptureClient client = new ScrollCaptureClient(mTarget1, mClientCallbacks); - client.startCapture(mSurface); + final ScrollCaptureConnection connection = new ScrollCaptureConnection(mTarget1, + mConnectionCallbacks); + connection.startCapture(mSurface); // Force timeout to fire - client.getTimeoutAction().timeoutNow(); + connection.getTimeoutAction().timeoutNow(); getInstrumentation().waitForIdleSync(); verify(mCallback1, times(1)).onScrollCaptureEnd(any(Runnable.class)); } - private void startClient(ScrollCaptureClient client) throws Exception { + private void startCapture(ScrollCaptureConnection connection) throws Exception { doAnswer(runRunnable(1)).when(mCallback1) .onScrollCaptureStart(any(ScrollCaptureSession.class), any(Runnable.class)); - client.startCapture(mSurface); + connection.startCapture(mSurface); getInstrumentation().waitForIdleSync(); - reset(mCallback1, mClientCallbacks); + reset(mCallback1, mConnectionCallbacks); } - /** @see ScrollCaptureClient#requestImage(Rect) */ + /** @see ScrollCaptureConnection#requestImage(Rect) */ @Test public void testRequestImage() throws Exception { - final ScrollCaptureClient client = new ScrollCaptureClient(mTarget1, mClientCallbacks); - startClient(client); + final ScrollCaptureConnection connection = new ScrollCaptureConnection(mTarget1, + mConnectionCallbacks); + startCapture(connection); // Stub the callback to complete the request immediately doAnswer(reportBufferSent(/* sessionArg */ 0, /* frameNum */ 1L, new Rect(1, 2, 3, 4))) @@ -223,7 +226,7 @@ public class ScrollCaptureClientTest { .onScrollCaptureImageRequest(any(ScrollCaptureSession.class), any(Rect.class)); // Make the inbound binder call - client.requestImage(new Rect(1, 2, 3, 4)); + connection.requestImage(new Rect(1, 2, 3, 4)); // Wait for handler thread dispatch getInstrumentation().waitForIdleSync(); @@ -232,18 +235,20 @@ public class ScrollCaptureClientTest { // Wait for binder thread dispatch getInstrumentation().waitForIdleSync(); - verify(mClientCallbacks, times(1)).onCaptureBufferSent(eq(1L), eq(new Rect(1, 2, 3, 4))); + verify(mConnectionCallbacks, times(1)) + .onCaptureBufferSent(eq(1L), eq(new Rect(1, 2, 3, 4))); - verifyNoMoreInteractions(mCallback1, mClientCallbacks); + verifyNoMoreInteractions(mCallback1, mConnectionCallbacks); } @Test public void testRequestImageTimeout() throws Exception { - final ScrollCaptureClient client = new ScrollCaptureClient(mTarget1, mClientCallbacks); - startClient(client); + final ScrollCaptureConnection connection = new ScrollCaptureConnection(mTarget1, + mConnectionCallbacks); + startCapture(connection); // Make the inbound binder call - client.requestImage(new Rect(1, 2, 3, 4)); + connection.requestImage(new Rect(1, 2, 3, 4)); // Wait for handler thread dispatch getInstrumentation().waitForIdleSync(); @@ -251,20 +256,21 @@ public class ScrollCaptureClientTest { any(ScrollCaptureSession.class), eq(new Rect(1, 2, 3, 4))); // Force timeout to fire - client.getTimeoutAction().timeoutNow(); + connection.getTimeoutAction().timeoutNow(); getInstrumentation().waitForIdleSync(); // (callback not stubbed, does nothing) // Timeout triggers request to end capture verify(mCallback1, times(1)).onScrollCaptureEnd(any(Runnable.class)); - verifyNoMoreInteractions(mCallback1, mClientCallbacks); + verifyNoMoreInteractions(mCallback1, mConnectionCallbacks); } - /** @see ScrollCaptureClient#endCapture() */ + /** @see ScrollCaptureConnection#endCapture() */ @Test public void testEndCapture() throws Exception { - final ScrollCaptureClient client = new ScrollCaptureClient(mTarget1, mClientCallbacks); - startClient(client); + final ScrollCaptureConnection connection = new ScrollCaptureConnection(mTarget1, + mConnectionCallbacks); + startCapture(connection); // Stub the callback to complete the request immediately doAnswer(runRunnable(0)) @@ -272,7 +278,7 @@ public class ScrollCaptureClientTest { .onScrollCaptureEnd(any(Runnable.class)); // Make the inbound binder call - client.endCapture(); + connection.endCapture(); // Wait for handler thread dispatch getInstrumentation().waitForIdleSync(); @@ -280,30 +286,31 @@ public class ScrollCaptureClientTest { // Wait for binder thread dispatch getInstrumentation().waitForIdleSync(); - verify(mClientCallbacks, times(1)).onConnectionClosed(); + verify(mConnectionCallbacks, times(1)).onConnectionClosed(); - verifyNoMoreInteractions(mCallback1, mClientCallbacks); + verifyNoMoreInteractions(mCallback1, mConnectionCallbacks); } @Test public void testEndCaptureTimeout() throws Exception { - final ScrollCaptureClient client = new ScrollCaptureClient(mTarget1, mClientCallbacks); - startClient(client); + final ScrollCaptureConnection connection = new ScrollCaptureConnection(mTarget1, + mConnectionCallbacks); + startCapture(connection); // Make the inbound binder call - client.endCapture(); + connection.endCapture(); // Wait for handler thread dispatch getInstrumentation().waitForIdleSync(); verify(mCallback1, times(1)).onScrollCaptureEnd(any(Runnable.class)); // Force timeout to fire - client.getTimeoutAction().timeoutNow(); + connection.getTimeoutAction().timeoutNow(); // Wait for binder thread dispatch getInstrumentation().waitForIdleSync(); - verify(mClientCallbacks, times(1)).onConnectionClosed(); + verify(mConnectionCallbacks, times(1)).onConnectionClosed(); - verifyNoMoreInteractions(mCallback1, mClientCallbacks); + verifyNoMoreInteractions(mCallback1, mConnectionCallbacks); } } diff --git a/keystore/java/android/security/keystore/AttestationUtils.java b/keystore/java/android/security/keystore/AttestationUtils.java index c8d4be319bab..f48da74eb397 100644 --- a/keystore/java/android/security/keystore/AttestationUtils.java +++ b/keystore/java/android/security/keystore/AttestationUtils.java @@ -20,7 +20,6 @@ import android.Manifest; import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.Context; import android.os.Build; import android.security.KeyStore; @@ -44,7 +43,6 @@ import java.util.Set; * @hide */ @SystemApi -@TestApi public abstract class AttestationUtils { private AttestationUtils() { } diff --git a/keystore/java/android/security/keystore/DeviceIdAttestationException.java b/keystore/java/android/security/keystore/DeviceIdAttestationException.java index 8ba0317845d0..4f9f9e633a98 100644 --- a/keystore/java/android/security/keystore/DeviceIdAttestationException.java +++ b/keystore/java/android/security/keystore/DeviceIdAttestationException.java @@ -18,7 +18,6 @@ package android.security.keystore; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; /** * Thrown when {@link AttestationUtils} is unable to attest the given device ids. @@ -26,7 +25,6 @@ import android.annotation.TestApi; * @hide */ @SystemApi -@TestApi public class DeviceIdAttestationException extends Exception { /** * Constructs a new {@code DeviceIdAttestationException} with the current stack trace and the diff --git a/libs/WindowManager/Shell/res/raw/wm_shell_protolog.json b/libs/WindowManager/Shell/res/raw/wm_shell_protolog.json index 3f6ca0fc5246..02bf38504725 100644 --- a/libs/WindowManager/Shell/res/raw/wm_shell_protolog.json +++ b/libs/WindowManager/Shell/res/raw/wm_shell_protolog.json @@ -31,6 +31,12 @@ "group": "WM_SHELL_TASK_ORG", "at": "com\/android\/wm\/shell\/ShellTaskOrganizer.java" }, + "-1312360667": { + "message": "createRootTask() displayId=%d winMode=%d listener=%s", + "level": "VERBOSE", + "group": "WM_SHELL_TASK_ORG", + "at": "com\/android\/wm\/shell\/ShellTaskOrganizer.java" + }, "-880817403": { "message": "Task vanished taskId=%d", "level": "VERBOSE", diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java index 9f3c83c09507..8bd7193843f7 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java @@ -128,11 +128,24 @@ public class ShellTaskOrganizer extends TaskOrganizer { final TaskAppearedInfo info = taskInfos.get(i); ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, "Existing task: id=%d component=%s", info.getTaskInfo().taskId, info.getTaskInfo().baseIntent); - onTaskAppeared(info.getTaskInfo(), info.getLeash()); + onTaskAppeared(info); } return taskInfos; } + public TaskAppearedInfo createRootTask( + int displayId, int windowingMode, TaskListener listener) { + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, + "createRootTask() displayId=%d winMode=%d listener=%s", + displayId, windowingMode, listener.toString()); + final TaskAppearedInfo info = super.createRootTask(displayId, windowingMode); + + // Add the listener and send the task appeared signal + mTaskListeners.put(info.getTaskInfo().taskId, listener); + onTaskAppeared(info); + return info; + } + /** * Adds a listener for a specific task id. */ @@ -216,12 +229,17 @@ public class ShellTaskOrganizer extends TaskOrganizer { @Override public void onTaskAppeared(RunningTaskInfo taskInfo, SurfaceControl leash) { - ProtoLog.v(WM_SHELL_TASK_ORG, "Task appeared taskId=%d", taskInfo.taskId); - mTasks.put(taskInfo.taskId, new TaskAppearedInfo(taskInfo, leash)); + onTaskAppeared(new TaskAppearedInfo(taskInfo, leash)); + } + + private void onTaskAppeared(TaskAppearedInfo info) { + final int taskId = info.getTaskInfo().taskId; + ProtoLog.v(WM_SHELL_TASK_ORG, "Task appeared taskId=%d", taskId); + mTasks.put(taskId, info); final TaskListener listener = - getTaskListener(taskInfo, true /*removeLaunchCookieIfNeeded*/); + getTaskListener(info.getTaskInfo(), true /*removeLaunchCookieIfNeeded*/); if (listener != null) { - listener.onTaskAppeared(taskInfo, leash); + listener.onTaskAppeared(info.getTaskInfo(), info.getLeash()); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java index 17fd16bccc4a..eaf5d7960aa9 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java @@ -32,7 +32,7 @@ import android.util.Slog; import android.util.SparseArray; import android.view.Display; import android.view.DragEvent; -import android.view.IScrollCaptureController; +import android.view.IScrollCaptureCallbacks; import android.view.IWindow; import android.view.IWindowManager; import android.view.IWindowSession; @@ -373,9 +373,9 @@ public class SystemWindows { public void dispatchPointerCaptureChanged(boolean hasCapture) {} @Override - public void requestScrollCapture(IScrollCaptureController controller) { + public void requestScrollCapture(IScrollCaptureCallbacks callbacks) { try { - controller.onClientUnavailable(); + callbacks.onUnavailable(); } catch (RemoteException ex) { // ignore } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsHandler.java index 2ab087cf245d..6d6cc204538a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsHandler.java @@ -119,6 +119,13 @@ public class PipBoundsHandler { } /** + * Get the current saved display info. + */ + public DisplayInfo getDisplayInfo() { + return mDisplayInfo; + } + + /** * Update the Min edge size for {@link PipSnapAlgorithm} to calculate corresponding bounds * @param minEdgeSize */ diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java index 6990186ece3d..cd5d35bf0c4c 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java @@ -79,6 +79,7 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.function.Consumer; +import java.util.function.IntConsumer; /** * Manages PiP tasks such as resize and offset. @@ -248,6 +249,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, private PipSurfaceTransactionHelper.SurfaceControlTransactionFactory mSurfaceControlTransactionFactory; private PictureInPictureParams mPictureInPictureParams; + private IntConsumer mOnDisplayIdChangeCallback; /** * If set to {@code true}, the entering animation will be skipped and we will wait for @@ -315,6 +317,13 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, } /** + * Registers a callback when a display change has been detected when we enter PiP. + */ + public void registerOnDisplayIdChangeCallback(IntConsumer onDisplayIdChangeCallback) { + mOnDisplayIdChangeCallback = onDisplayIdChangeCallback; + } + + /** * Sets the preferred animation type for one time. * This is typically used to set the animation type to * {@link PipAnimationController#ANIM_TYPE_ALPHA}. @@ -403,9 +412,13 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, @Override public void onTransactionReady(int id, SurfaceControl.Transaction t) { t.apply(); - scheduleAnimateResizePip(mPipBoundsState.getBounds(), - destinationBounds, getValidSourceHintRect(mTaskInfo, destinationBounds), - direction, animationDurationMs, null /* updateBoundsCallback */); + // Make sure to grab the latest source hint rect as it could have been updated + // right after applying the windowing mode change. + final Rect sourceHintRect = getValidSourceHintRect(mPictureInPictureParams, + destinationBounds); + scheduleAnimateResizePip(mPipBoundsState.getBounds(), destinationBounds, + sourceHintRect, direction, animationDurationMs, + null /* updateBoundsCallback */); mState = State.EXITING_PIP; } }); @@ -473,6 +486,13 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, mPipUiEventLoggerLogger.setTaskInfo(mTaskInfo); mPipUiEventLoggerLogger.log(PipUiEventLogger.PipUiEventEnum.PICTURE_IN_PICTURE_ENTER); + // If the displayId of the task is different than what PipBoundsHandler has, then update + // it. This is possible if we entered PiP on an external display. + if (info.displayId != mPipBoundsHandler.getDisplayInfo().displayId + && mOnDisplayIdChangeCallback != null) { + mOnDisplayIdChangeCallback.accept(info.displayId); + } + if (mShouldIgnoreEnteringPipTransition) { // Animation has been finished together with Recents, directly apply the sync // transaction to PiP here. @@ -501,7 +521,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, final Rect currentBounds = mTaskInfo.configuration.windowConfiguration.getBounds(); if (mOneShotAnimationType == ANIM_TYPE_BOUNDS) { - final Rect sourceHintRect = getValidSourceHintRect(info, currentBounds); + final Rect sourceHintRect = getValidSourceHintRect(info.pictureInPictureParams, + currentBounds); scheduleAnimateResizePip(currentBounds, destinationBounds, sourceHintRect, TRANSITION_DIRECTION_TO_PIP, mEnterExitAnimationDuration, null /* updateBoundsCallback */); @@ -518,10 +539,10 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, * Returns the source hint rect if it is valid (if provided and is contained by the current * task bounds). */ - private Rect getValidSourceHintRect(ActivityManager.RunningTaskInfo info, Rect sourceBounds) { - final Rect sourceHintRect = info.pictureInPictureParams != null - && info.pictureInPictureParams.hasSourceBoundsHint() - ? info.pictureInPictureParams.getSourceRectHint() + private Rect getValidSourceHintRect(PictureInPictureParams params, Rect sourceBounds) { + final Rect sourceHintRect = params != null + && params.hasSourceBoundsHint() + ? params.getSourceRectHint() : null; if (sourceHintRect != null && sourceBounds.contains(sourceHintRect)) { return sourceHintRect; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java index a3d21f2d8466..a08983740f9a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java @@ -228,6 +228,14 @@ public class PipController implements Pip, PipTaskOrganizer.PipTransitionCallbac mPipBoundsState = pipBoundsState; mPipTaskOrganizer = pipTaskOrganizer; mPipTaskOrganizer.registerPipTransitionCallback(this); + mPipTaskOrganizer.registerOnDisplayIdChangeCallback((int displayId) -> { + final DisplayInfo newDisplayInfo = new DisplayInfo(); + displayController.getDisplay(displayId).getDisplayInfo(newDisplayInfo); + mPipBoundsHandler.onDisplayInfoChanged(newDisplayInfo); + updateMovementBounds(null /* toBounds */, false /* fromRotation */, + false /* fromImeAdjustment */, false /* fromShelfAdustment */, + null /* wct */); + }); mMediaController = pipMediaController; mMenuController = pipMenuActivityController; mTouchHandler = pipTouchHandler; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTaskOrganizer.java index f763d6d714c4..0a1aadc90a62 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTaskOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTaskOrganizer.java @@ -33,6 +33,7 @@ import android.util.Log; import android.view.Display; import android.view.SurfaceControl; import android.view.SurfaceSession; +import android.window.TaskAppearedInfo; import androidx.annotation.NonNull; @@ -68,10 +69,15 @@ class SplitScreenTaskOrganizer implements ShellTaskOrganizer.TaskListener { void init() throws RemoteException { synchronized (this) { try { - mPrimary = mTaskOrganizer.createRootTask(Display.DEFAULT_DISPLAY, - WINDOWING_MODE_SPLIT_SCREEN_PRIMARY); - mSecondary = mTaskOrganizer.createRootTask(Display.DEFAULT_DISPLAY, - WINDOWING_MODE_SPLIT_SCREEN_SECONDARY); + final TaskAppearedInfo primary = mTaskOrganizer.createRootTask( + Display.DEFAULT_DISPLAY, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, this); + final TaskAppearedInfo secondary = mTaskOrganizer.createRootTask( + Display.DEFAULT_DISPLAY, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, this); + mPrimary = primary.getTaskInfo(); + mPrimarySurface = primary.getLeash(); + mSecondary = secondary.getTaskInfo(); + mSecondarySurface = secondary.getLeash(); + enableSplitScreenSupportIfNeeded(); } catch (Exception e) { // teardown to prevent callbacks mTaskOrganizer.removeListener(this); @@ -92,43 +98,29 @@ class SplitScreenTaskOrganizer implements ShellTaskOrganizer.TaskListener { mSplitScreenController.mTransactionPool.release(t); } - @Override - public void onTaskAppeared(RunningTaskInfo taskInfo, SurfaceControl leash) { - synchronized (this) { - if (mPrimary == null || mSecondary == null) { - Log.w(TAG, "Received onTaskAppeared before creating root tasks " + taskInfo); - return; - } - - if (taskInfo.token.equals(mPrimary.token)) { - mPrimarySurface = leash; - } else if (taskInfo.token.equals(mSecondary.token)) { - mSecondarySurface = leash; - } - - if (!mSplitScreenSupported && mPrimarySurface != null && mSecondarySurface != null) { - mSplitScreenSupported = true; - - // Initialize dim surfaces: - mPrimaryDim = new SurfaceControl.Builder(mSurfaceSession) - .setParent(mPrimarySurface).setColorLayer() - .setName("Primary Divider Dim") - .setCallsite("SplitScreenTaskOrganizer.onTaskAppeared") - .build(); - mSecondaryDim = new SurfaceControl.Builder(mSurfaceSession) - .setParent(mSecondarySurface).setColorLayer() - .setName("Secondary Divider Dim") - .setCallsite("SplitScreenTaskOrganizer.onTaskAppeared") - .build(); - SurfaceControl.Transaction t = getTransaction(); - t.setLayer(mPrimaryDim, Integer.MAX_VALUE); - t.setColor(mPrimaryDim, new float[]{0f, 0f, 0f}); - t.setLayer(mSecondaryDim, Integer.MAX_VALUE); - t.setColor(mSecondaryDim, new float[]{0f, 0f, 0f}); - t.apply(); - releaseTransaction(t); - } - } + private void enableSplitScreenSupportIfNeeded() { + if (mSplitScreenSupported || mPrimarySurface == null || mSecondarySurface == null) return; + + mSplitScreenSupported = true; + + // Initialize dim surfaces: + mPrimaryDim = new SurfaceControl.Builder(mSurfaceSession) + .setParent(mPrimarySurface).setColorLayer() + .setName("Primary Divider Dim") + .setCallsite("SplitScreenTaskOrganizer.onTaskAppeared") + .build(); + mSecondaryDim = new SurfaceControl.Builder(mSurfaceSession) + .setParent(mSecondarySurface).setColorLayer() + .setName("Secondary Divider Dim") + .setCallsite("SplitScreenTaskOrganizer.onTaskAppeared") + .build(); + SurfaceControl.Transaction t = getTransaction(); + t.setLayer(mPrimaryDim, Integer.MAX_VALUE); + t.setColor(mPrimaryDim, new float[]{0f, 0f, 0f}); + t.setLayer(mSecondaryDim, Integer.MAX_VALUE); + t.setColor(mSecondaryDim, new float[]{0f, 0f, 0f}); + t.apply(); + releaseTransaction(t); } @Override diff --git a/libs/androidfw/CursorWindow.cpp b/libs/androidfw/CursorWindow.cpp index 915c0d75a280..1b8db46c54b6 100644 --- a/libs/androidfw/CursorWindow.cpp +++ b/libs/androidfw/CursorWindow.cpp @@ -291,11 +291,11 @@ status_t CursorWindow::allocRow() { return INVALID_OPERATION; } size_t size = mNumColumns * kSlotSizeBytes; - off_t newOffset = mSlotsOffset - size; - if (newOffset < mAllocOffset) { + int32_t newOffset = mSlotsOffset - size; + if (newOffset < (int32_t) mAllocOffset) { maybeInflate(); newOffset = mSlotsOffset - size; - if (newOffset < mAllocOffset) { + if (newOffset < (int32_t) mAllocOffset) { return NO_MEMORY; } } @@ -311,7 +311,7 @@ status_t CursorWindow::freeLastRow() { return INVALID_OPERATION; } size_t size = mNumColumns * kSlotSizeBytes; - off_t newOffset = mSlotsOffset + size; + size_t newOffset = mSlotsOffset + size; if (newOffset > mSize) { return NO_MEMORY; } @@ -326,7 +326,7 @@ status_t CursorWindow::alloc(size_t size, uint32_t* outOffset) { return INVALID_OPERATION; } size_t alignedSize = (size + 3) & ~3; - off_t newOffset = mAllocOffset + alignedSize; + size_t newOffset = mAllocOffset + alignedSize; if (newOffset > mSlotsOffset) { maybeInflate(); newOffset = mAllocOffset + alignedSize; @@ -345,7 +345,7 @@ CursorWindow::FieldSlot* CursorWindow::getFieldSlot(uint32_t row, uint32_t colum // see CursorWindow_bench.cpp for more details void *result = static_cast<uint8_t*>(mSlotsStart) - (((row * mNumColumns) + column) << kSlotShift); - if (result < mSlotsEnd || column >= mNumColumns) { + if (result < mSlotsEnd || result > mSlotsStart || column >= mNumColumns) { LOG(ERROR) << "Failed to read row " << row << ", column " << column << " from a window with " << mNumRows << " rows, " << mNumColumns << " columns"; return nullptr; diff --git a/libs/androidfw/tests/CursorWindow_test.cpp b/libs/androidfw/tests/CursorWindow_test.cpp index dfcf76e6edf6..15be80c48192 100644 --- a/libs/androidfw/tests/CursorWindow_test.cpp +++ b/libs/androidfw/tests/CursorWindow_test.cpp @@ -166,6 +166,14 @@ TEST(CursorWindowTest, StoreBounds) { ASSERT_EQ(w->getFieldSlot(0, 3), nullptr); ASSERT_EQ(w->getFieldSlot(3, 0), nullptr); ASSERT_EQ(w->getFieldSlot(3, 3), nullptr); + + // Can't work with invalid indexes + ASSERT_NE(w->putLong(-1, 0, 0xcafe), OK); + ASSERT_NE(w->putLong(0, -1, 0xcafe), OK); + ASSERT_NE(w->putLong(-1, -1, 0xcafe), OK); + ASSERT_EQ(w->getFieldSlot(-1, 0), nullptr); + ASSERT_EQ(w->getFieldSlot(0, -1), nullptr); + ASSERT_EQ(w->getFieldSlot(-1, -1), nullptr); } TEST(CursorWindowTest, Inflate) { diff --git a/location/java/android/location/Location.java b/location/java/android/location/Location.java index 46bd22148fb2..62b4bc173bb9 100644 --- a/location/java/android/location/Location.java +++ b/location/java/android/location/Location.java @@ -19,7 +19,6 @@ package android.location; import static java.util.concurrent.TimeUnit.NANOSECONDS; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.os.Build; import android.os.Bundle; @@ -75,7 +74,6 @@ public class Location implements Parcelable { * gps locations separate from other locations for coarsening. Providers that do not need to * support platforms below Android R should not use this constant. */ - @TestApi @SystemApi @Deprecated public static final String EXTRA_NO_GPS_LOCATION = "noGPSLocation"; @@ -1074,7 +1072,6 @@ public class Location implements Parcelable { * @see #isComplete * @hide */ - @TestApi @SystemApi public void makeComplete() { if (mProvider == null) mProvider = "?"; diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index 30a4ada1b388..ac775ca05cab 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -575,7 +575,6 @@ public class LocationManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(WRITE_SECURE_SETTINGS) public void setLocationEnabledForUser(boolean enabled, @NonNull UserHandle userHandle) { try { @@ -751,7 +750,6 @@ public class LocationManager { */ @Deprecated @SystemApi - @TestApi @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public void getCurrentLocation(@NonNull LocationRequest locationRequest, @Nullable CancellationSignal cancellationSignal, @@ -1192,7 +1190,6 @@ public class LocationManager { */ @Deprecated @SystemApi - @TestApi @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public void requestLocationUpdates( @Nullable LocationRequest locationRequest, @@ -1223,7 +1220,6 @@ public class LocationManager { */ @Deprecated @SystemApi - @TestApi @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public void requestLocationUpdates( @Nullable LocationRequest locationRequest, @@ -1255,7 +1251,6 @@ public class LocationManager { */ @Deprecated @SystemApi - @TestApi @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public void requestLocationUpdates( @Nullable LocationRequest locationRequest, diff --git a/location/java/android/location/LocationRequest.java b/location/java/android/location/LocationRequest.java index 4977c2161be9..d0706c6b84cb 100644 --- a/location/java/android/location/LocationRequest.java +++ b/location/java/android/location/LocationRequest.java @@ -27,7 +27,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledAfter; import android.compat.annotation.UnsupportedAppUsage; @@ -75,19 +74,27 @@ public final class LocationRequest implements Parcelable { /** * A quality constant indicating a location provider may choose to satisfy this request by - * providing very accurate locations at the expense of potentially increased power usage. + * providing very accurate locations at the expense of potentially increased power usage. Each + * location provider may interpret this field differently, but as an example, the network + * provider may choose to return only wifi based locations rather than cell based locations in + * order to have greater accuracy when this flag is present. */ public static final int QUALITY_HIGH_ACCURACY = 100; /** * A quality constant indicating a location provider may choose to satisfy this request by - * equally balancing power and accuracy constraints. + * equally balancing power and accuracy constraints. Each location provider may interpret this + * field differently, but location providers will generally use their default behavior when this + * flag is present. */ public static final int QUALITY_BALANCED_POWER_ACCURACY = 102; /** * A quality constant indicating a location provider may choose to satisfy this request by - * providing less accurate locations in order to save power. + * providing less accurate locations in order to save power. Each location provider may + * interpret this field differently, but as an example, the network provider may choose to + * return cell based locations rather than wifi based locations in order to save power when this + * flag is present. */ public static final int QUALITY_LOW_POWER = 104; @@ -101,7 +108,6 @@ public final class LocationRequest implements Parcelable { */ @Deprecated @SystemApi - @TestApi public static final int ACCURACY_FINE = QUALITY_HIGH_ACCURACY; /** @@ -116,7 +122,6 @@ public final class LocationRequest implements Parcelable { */ @Deprecated @SystemApi - @TestApi public static final int ACCURACY_BLOCK = QUALITY_BALANCED_POWER_ACCURACY; /** @@ -131,7 +136,6 @@ public final class LocationRequest implements Parcelable { */ @Deprecated @SystemApi - @TestApi public static final int ACCURACY_CITY = QUALITY_LOW_POWER; /** @@ -159,7 +163,6 @@ public final class LocationRequest implements Parcelable { */ @Deprecated @SystemApi - @TestApi public static final int POWER_LOW = 201; /** @@ -172,7 +175,6 @@ public final class LocationRequest implements Parcelable { */ @Deprecated @SystemApi - @TestApi public static final int POWER_HIGH = 203; private static final long IMPLICIT_MIN_UPDATE_INTERVAL = -1; @@ -618,7 +620,6 @@ public final class LocationRequest implements Parcelable { * * @hide */ - @TestApi @SystemApi public boolean isHiddenFromAppOps() { return mHideFromAppOps; @@ -644,7 +645,6 @@ public final class LocationRequest implements Parcelable { * * @hide */ - @TestApi @SystemApi public boolean isLocationSettingsIgnored() { return mLocationSettingsIgnored; @@ -680,7 +680,6 @@ public final class LocationRequest implements Parcelable { * * @hide */ - @TestApi @SystemApi public boolean isLowPower() { return mLowPower; @@ -707,7 +706,6 @@ public final class LocationRequest implements Parcelable { * * @hide */ - @TestApi @SystemApi public @NonNull WorkSource getWorkSource() { return mWorkSource; @@ -1038,7 +1036,6 @@ public final class LocationRequest implements Parcelable { * * @hide */ - @TestApi @SystemApi @RequiresPermission(Manifest.permission.UPDATE_APP_OPS_STATS) public @NonNull Builder setHiddenFromAppOps(boolean hiddenFromAppOps) { @@ -1057,7 +1054,6 @@ public final class LocationRequest implements Parcelable { * * @hide */ - @TestApi @SystemApi @RequiresPermission(Manifest.permission.WRITE_SECURE_SETTINGS) public @NonNull Builder setLocationSettingsIgnored(boolean locationSettingsIgnored) { @@ -1075,7 +1071,6 @@ public final class LocationRequest implements Parcelable { * * @hide */ - @TestApi @SystemApi @RequiresPermission(Manifest.permission.LOCATION_HARDWARE) public @NonNull Builder setLowPower(boolean lowPower) { @@ -1093,7 +1088,6 @@ public final class LocationRequest implements Parcelable { * * @hide */ - @TestApi @SystemApi @RequiresPermission(Manifest.permission.UPDATE_DEVICE_STATS) public @NonNull Builder setWorkSource(@Nullable WorkSource workSource) { diff --git a/media/java/android/media/AudioFocusInfo.java b/media/java/android/media/AudioFocusInfo.java index 675cf7360b82..3647b6ebcfbc 100644 --- a/media/java/android/media/AudioFocusInfo.java +++ b/media/java/android/media/AudioFocusInfo.java @@ -19,7 +19,6 @@ package android.media; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -29,7 +28,6 @@ import java.util.Objects; * @hide * A class to encapsulate information about an audio focus owner or request. */ -@TestApi @SystemApi public final class AudioFocusInfo implements Parcelable { diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 22b5ca53e7e9..195122db146a 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -3916,7 +3916,6 @@ public class AudioManager { * @param requestResult the result to the focus request to be passed to the requester * @param ap a valid registered {@link AudioPolicy} configured as a focus policy. */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setFocusRequestResult(@NonNull AudioFocusInfo afi, @@ -3956,7 +3955,6 @@ public class AudioManager { * if there was an error sending the request. * @throws NullPointerException if the {@link AudioFocusInfo} or {@link AudioPolicy} are null. */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int dispatchAudioFocusChange(@NonNull AudioFocusInfo afi, int focusChange, @@ -4219,7 +4217,6 @@ public class AudioManager { * {@link android.Manifest.permission#MODIFY_AUDIO_ROUTING} permission, * {@link #SUCCESS} otherwise. */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int registerAudioPolicy(@NonNull AudioPolicy policy) { @@ -4254,7 +4251,6 @@ public class AudioManager { * Unregisters an {@link AudioPolicy} asynchronously. * @param policy the non-null {@link AudioPolicy} to unregister. */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void unregisterAudioPolicyAsync(@NonNull AudioPolicy policy) { @@ -4281,7 +4277,6 @@ public class AudioManager { * associated with mixes of this policy. * @param policy the non-null {@link AudioPolicy} to unregister. */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void unregisterAudioPolicy(@NonNull AudioPolicy policy) { @@ -5619,7 +5614,6 @@ public class AudioManager { */ /** @hide */ - @TestApi @SystemApi public static final int SUCCESS = AudioSystem.SUCCESS; /** diff --git a/media/java/android/media/MediaTranscodeManager.java b/media/java/android/media/MediaTranscodeManager.java index 8676462c5c54..046403670693 100644 --- a/media/java/android/media/MediaTranscodeManager.java +++ b/media/java/android/media/MediaTranscodeManager.java @@ -22,7 +22,6 @@ import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.ContentResolver; import android.content.Context; import android.content.res.AssetFileDescriptor; @@ -101,7 +100,6 @@ import java.util.concurrent.Executors; TODO(hkuang): Clarify whether supports framerate conversion. @hide */ -@TestApi @SystemApi public final class MediaTranscodeManager { private static final String TAG = "MediaTranscodeManager"; diff --git a/media/java/android/media/audiopolicy/AudioMix.java b/media/java/android/media/audiopolicy/AudioMix.java index 61113bc858db..4e451c6e42b1 100644 --- a/media/java/android/media/audiopolicy/AudioMix.java +++ b/media/java/android/media/audiopolicy/AudioMix.java @@ -19,7 +19,6 @@ package android.media.audiopolicy; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.media.AudioDeviceInfo; import android.media.AudioFormat; @@ -32,7 +31,6 @@ import java.util.Objects; /** * @hide */ -@TestApi @SystemApi public class AudioMix { diff --git a/media/java/android/media/audiopolicy/AudioMixingRule.java b/media/java/android/media/audiopolicy/AudioMixingRule.java index 68c9593d102d..f6f982a4ebe2 100644 --- a/media/java/android/media/audiopolicy/AudioMixingRule.java +++ b/media/java/android/media/audiopolicy/AudioMixingRule.java @@ -18,7 +18,6 @@ package android.media.audiopolicy; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.media.AudioAttributes; import android.os.Parcel; @@ -42,7 +41,6 @@ import java.util.Objects; * .build(); * </pre> */ -@TestApi @SystemApi public class AudioMixingRule { diff --git a/media/java/android/media/audiopolicy/AudioPolicy.java b/media/java/android/media/audiopolicy/AudioPolicy.java index 8a17465c53b3..3e8d76ac7551 100644 --- a/media/java/android/media/audiopolicy/AudioPolicy.java +++ b/media/java/android/media/audiopolicy/AudioPolicy.java @@ -58,7 +58,6 @@ import java.util.Objects; * @hide * AudioPolicy provides access to the management of audio routing and audio focus. */ -@TestApi @SystemApi public class AudioPolicy { @@ -418,7 +417,6 @@ public class AudioPolicy { * @param devices list of devices to which the audio stream of the application may be routed. * @return true if the change was successful, false otherwise. */ - @TestApi @SystemApi public boolean setUidDeviceAffinity(int uid, @NonNull List<AudioDeviceInfo> devices) { if (devices == null) { @@ -460,7 +458,6 @@ public class AudioPolicy { * @param uid UID of the application affected. * @return true if the change was successful, false otherwise. */ - @TestApi @SystemApi public boolean removeUidDeviceAffinity(int uid) { synchronized (mLock) { @@ -486,7 +483,6 @@ public class AudioPolicy { * {@link UserHandle#getIdentifier}. Not to be confused with application uid. * @return true if the change was successful, false otherwise. */ - @TestApi @SystemApi public boolean removeUserIdDeviceAffinity(@UserIdInt int userId) { synchronized (mLock) { @@ -519,7 +515,6 @@ public class AudioPolicy { * @param devices list of devices to which the audio stream of the application may be routed. * @return true if the change was successful, false otherwise. */ - @TestApi @SystemApi public boolean setUserIdDeviceAffinity(@UserIdInt int userId, @NonNull List<AudioDeviceInfo> devices) { diff --git a/media/java/android/media/musicrecognition/MusicRecognitionManager.java b/media/java/android/media/musicrecognition/MusicRecognitionManager.java index c7f55dfe1c76..6bbcfd3b5b66 100644 --- a/media/java/android/media/musicrecognition/MusicRecognitionManager.java +++ b/media/java/android/media/musicrecognition/MusicRecognitionManager.java @@ -25,7 +25,6 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.content.Context; import android.media.MediaMetadata; import android.os.Bundle; @@ -41,7 +40,6 @@ import java.util.concurrent.Executor; * @hide */ @SystemApi -@TestApi @SystemService(Context.MUSIC_RECOGNITION_SERVICE) public class MusicRecognitionManager { diff --git a/media/java/android/media/musicrecognition/MusicRecognitionService.java b/media/java/android/media/musicrecognition/MusicRecognitionService.java index b75d2c4f1e50..e2071b84c00b 100644 --- a/media/java/android/media/musicrecognition/MusicRecognitionService.java +++ b/media/java/android/media/musicrecognition/MusicRecognitionService.java @@ -21,7 +21,6 @@ import static com.android.internal.util.function.pooled.PooledLambda.obtainMessa import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Service; import android.content.Intent; import android.media.AudioFormat; @@ -41,7 +40,6 @@ import android.util.Log; * @hide */ @SystemApi -@TestApi public abstract class MusicRecognitionService extends Service { private static final String TAG = MusicRecognitionService.class.getSimpleName(); diff --git a/media/java/android/media/musicrecognition/RecognitionRequest.java b/media/java/android/media/musicrecognition/RecognitionRequest.java index 65b2ccd37f79..e4f484873cd4 100644 --- a/media/java/android/media/musicrecognition/RecognitionRequest.java +++ b/media/java/android/media/musicrecognition/RecognitionRequest.java @@ -23,7 +23,6 @@ import static java.util.Objects.requireNonNull; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.media.AudioAttributes; import android.media.AudioFormat; import android.media.AudioRecord; @@ -37,7 +36,6 @@ import android.os.Parcelable; * @hide */ @SystemApi -@TestApi public final class RecognitionRequest implements Parcelable { @NonNull private final AudioAttributes mAudioAttributes; @NonNull private final AudioFormat mAudioFormat; @@ -82,7 +80,6 @@ public final class RecognitionRequest implements Parcelable { * @hide */ @SystemApi - @TestApi public static final class Builder { private AudioFormat mAudioFormat = new AudioFormat.Builder() .setSampleRate(16000) diff --git a/media/java/android/media/tv/tuner/TunerVersionChecker.java b/media/java/android/media/tv/tuner/TunerVersionChecker.java index 739f87dd711d..b40ba1e763c1 100644 --- a/media/java/android/media/tv/tuner/TunerVersionChecker.java +++ b/media/java/android/media/tv/tuner/TunerVersionChecker.java @@ -31,7 +31,6 @@ import java.lang.annotation.RetentionPolicy; * * @hide */ -@TestApi @SystemApi public final class TunerVersionChecker { private static final String TAG = "TunerVersionChecker"; diff --git a/media/java/android/media/tv/tuner/filter/AvSettings.java b/media/java/android/media/tv/tuner/filter/AvSettings.java index e9b3660ab12f..5d9d53174b3e 100644 --- a/media/java/android/media/tv/tuner/filter/AvSettings.java +++ b/media/java/android/media/tv/tuner/filter/AvSettings.java @@ -16,9 +16,15 @@ package android.media.tv.tuner.filter; +import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.SystemApi; +import android.hardware.tv.tuner.V1_1.Constants; import android.media.tv.tuner.TunerUtils; +import android.media.tv.tuner.TunerVersionChecker; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; /** * Filter Settings for a Video and Audio. @@ -27,15 +33,160 @@ import android.media.tv.tuner.TunerUtils; */ @SystemApi public class AvSettings extends Settings { + /** @hide */ + @IntDef(prefix = "VIDEO_STREAM_TYPE_", + value = {VIDEO_STREAM_TYPE_UNDEFINED, VIDEO_STREAM_TYPE_RESERVED, + VIDEO_STREAM_TYPE_MPEG1, VIDEO_STREAM_TYPE_MPEG2, + VIDEO_STREAM_TYPE_MPEG4P2, VIDEO_STREAM_TYPE_AVC, VIDEO_STREAM_TYPE_HEVC, + VIDEO_STREAM_TYPE_VC1, VIDEO_STREAM_TYPE_VP8, VIDEO_STREAM_TYPE_VP9, + VIDEO_STREAM_TYPE_AV1, VIDEO_STREAM_TYPE_AVS, VIDEO_STREAM_TYPE_AVS2}) + @Retention(RetentionPolicy.SOURCE) + public @interface VideoStreamType {} + + /* + * Undefined Video stream type + */ + public static final int VIDEO_STREAM_TYPE_UNDEFINED = Constants.VideoStreamType.UNDEFINED; + /* + * ITU-T | ISO/IEC Reserved + */ + public static final int VIDEO_STREAM_TYPE_RESERVED = Constants.VideoStreamType.RESERVED; + /* + * ISO/IEC 11172 + */ + public static final int VIDEO_STREAM_TYPE_MPEG1 = Constants.VideoStreamType.MPEG1; + /* + * ITU-T Rec.H.262 and ISO/IEC 13818-2 + */ + public static final int VIDEO_STREAM_TYPE_MPEG2 = Constants.VideoStreamType.MPEG2; + /* + * ISO/IEC 14496-2 (MPEG-4 H.263 based video) + */ + public static final int VIDEO_STREAM_TYPE_MPEG4P2 = Constants.VideoStreamType.MPEG4P2; + /* + * ITU-T Rec.H.264 and ISO/IEC 14496-10 + */ + public static final int VIDEO_STREAM_TYPE_AVC = Constants.VideoStreamType.AVC; + /* + * ITU-T Rec. H.265 and ISO/IEC 23008-2 + */ + public static final int VIDEO_STREAM_TYPE_HEVC = Constants.VideoStreamType.HEVC; + /* + * Microsoft VC.1 + */ + public static final int VIDEO_STREAM_TYPE_VC1 = Constants.VideoStreamType.VC1; + /* + * Google VP8 + */ + public static final int VIDEO_STREAM_TYPE_VP8 = Constants.VideoStreamType.VP8; + /* + * Google VP9 + */ + public static final int VIDEO_STREAM_TYPE_VP9 = Constants.VideoStreamType.VP9; + /* + * AOMedia Video 1 + */ + public static final int VIDEO_STREAM_TYPE_AV1 = Constants.VideoStreamType.AV1; + /* + * Chinese Standard + */ + public static final int VIDEO_STREAM_TYPE_AVS = Constants.VideoStreamType.AVS; + /* + * New Chinese Standard + */ + public static final int VIDEO_STREAM_TYPE_AVS2 = Constants.VideoStreamType.AVS2; + + /** @hide */ + @IntDef(prefix = "AUDIO_STREAM_TYPE_", + value = {AUDIO_STREAM_TYPE_UNDEFINED, AUDIO_STREAM_TYPE_PCM, AUDIO_STREAM_TYPE_MP3, + AUDIO_STREAM_TYPE_MPEG1, AUDIO_STREAM_TYPE_MPEG2, AUDIO_STREAM_TYPE_MPEGH, + AUDIO_STREAM_TYPE_AAC, AUDIO_STREAM_TYPE_AC3, AUDIO_STREAM_TYPE_EAC3, + AUDIO_STREAM_TYPE_AC4, AUDIO_STREAM_TYPE_DTS, AUDIO_STREAM_TYPE_DTS_HD, + AUDIO_STREAM_TYPE_WMA, AUDIO_STREAM_TYPE_OPUS, AUDIO_STREAM_TYPE_VORBIS, + AUDIO_STREAM_TYPE_DRA}) + @Retention(RetentionPolicy.SOURCE) + public @interface AudioStreamType {} + + /* + * Undefined Audio stream type + */ + public static final int AUDIO_STREAM_TYPE_UNDEFINED = Constants.AudioStreamType.UNDEFINED; + /* + * Uncompressed Audio + */ + public static final int AUDIO_STREAM_TYPE_PCM = Constants.AudioStreamType.PCM; + /* + * MPEG Audio Layer III versions + */ + public static final int AUDIO_STREAM_TYPE_MP3 = Constants.AudioStreamType.MP3; + /* + * ISO/IEC 11172 Audio + */ + public static final int AUDIO_STREAM_TYPE_MPEG1 = Constants.AudioStreamType.MPEG1; + /* + * ISO/IEC 13818-3 + */ + public static final int AUDIO_STREAM_TYPE_MPEG2 = Constants.AudioStreamType.MPEG2; + /* + * ISO/IEC 23008-3 (MPEG-H Part 3) + */ + public static final int AUDIO_STREAM_TYPE_MPEGH = Constants.AudioStreamType.MPEGH; + /* + * ISO/IEC 14496-3 + */ + public static final int AUDIO_STREAM_TYPE_AAC = Constants.AudioStreamType.AAC; + /* + * Dolby Digital + */ + public static final int AUDIO_STREAM_TYPE_AC3 = Constants.AudioStreamType.AC3; + /* + * Dolby Digital Plus + */ + public static final int AUDIO_STREAM_TYPE_EAC3 = Constants.AudioStreamType.EAC3; + /* + * Dolby AC-4 + */ + public static final int AUDIO_STREAM_TYPE_AC4 = Constants.AudioStreamType.AC4; + /* + * Basic DTS + */ + public static final int AUDIO_STREAM_TYPE_DTS = Constants.AudioStreamType.DTS; + /* + * High Resolution DTS + */ + public static final int AUDIO_STREAM_TYPE_DTS_HD = Constants.AudioStreamType.DTS_HD; + /* + * Windows Media Audio + */ + public static final int AUDIO_STREAM_TYPE_WMA = Constants.AudioStreamType.WMA; + /* + * Opus Interactive Audio Codec + */ + public static final int AUDIO_STREAM_TYPE_OPUS = Constants.AudioStreamType.OPUS; + /* + * VORBIS Interactive Audio Codec + */ + public static final int AUDIO_STREAM_TYPE_VORBIS = Constants.AudioStreamType.VORBIS; + /* + * SJ/T 11368-2006 + */ + public static final int AUDIO_STREAM_TYPE_DRA = Constants.AudioStreamType.DRA; + + private final boolean mIsPassthrough; + private int mAudioStreamType = AUDIO_STREAM_TYPE_UNDEFINED; + private int mVideoStreamType = VIDEO_STREAM_TYPE_UNDEFINED; - private AvSettings(int mainType, boolean isAudio, boolean isPassthrough) { + private AvSettings(int mainType, boolean isAudio, boolean isPassthrough, + int audioStreamType, int videoStreamType) { super(TunerUtils.getFilterSubtype( mainType, isAudio ? Filter.SUBTYPE_AUDIO : Filter.SUBTYPE_VIDEO)); mIsPassthrough = isPassthrough; + mAudioStreamType = audioStreamType; + mVideoStreamType = videoStreamType; } /** @@ -46,6 +197,20 @@ public class AvSettings extends Settings { } /** + * Get the Audio Stream Type. + */ + public int getAudioStreamType() { + return mAudioStreamType; + } + + /** + * Get the Video Stream Type. + */ + public int getVideoStreamType() { + return mVideoStreamType; + } + + /** * Creates a builder for {@link AvSettings}. * * @param mainType the filter main type. @@ -63,6 +228,8 @@ public class AvSettings extends Settings { private final int mMainType; private final boolean mIsAudio; private boolean mIsPassthrough; + private int mAudioStreamType = AUDIO_STREAM_TYPE_UNDEFINED; + private int mVideoStreamType = VIDEO_STREAM_TYPE_UNDEFINED; private Builder(int mainType, boolean isAudio) { mMainType = mainType; @@ -79,11 +246,48 @@ public class AvSettings extends Settings { } /** + * Sets the Audio Stream Type. + * + * <p>This API is only supported by Tuner HAL 1.1 or higher. Unsupported version would cause + * no-op. Use {@link TunerVersionChecker.getTunerVersion()} to check the version. + * + * @param audioStreamType the {@link AudioStreamType} to set. + */ + @NonNull + public Builder setAudioStreamType(@AudioStreamType int audioStreamType) { + if (TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "setAudioStreamType") && mIsAudio) { + mAudioStreamType = audioStreamType; + mVideoStreamType = VIDEO_STREAM_TYPE_UNDEFINED; + } + return this; + } + + /** + * Sets the Video Stream Type. + * + * <p>This API is only supported by Tuner HAL 1.1 or higher. Unsupported version would cause + * no-op. Use {@link TunerVersionChecker.getTunerVersion()} to check the version. + * + * @param videoStreamType the {@link VideoStreamType} to set. + */ + @NonNull + public Builder setVideoStreamType(@VideoStreamType int videoStreamType) { + if (TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "setVideoStreamType") && !mIsAudio) { + mVideoStreamType = videoStreamType; + mAudioStreamType = AUDIO_STREAM_TYPE_UNDEFINED; + } + return this; + } + + /** * Builds a {@link AvSettings} object. */ @NonNull public AvSettings build() { - return new AvSettings(mMainType, mIsAudio, mIsPassthrough); + return new AvSettings(mMainType, mIsAudio, mIsPassthrough, + mAudioStreamType, mVideoStreamType); } } } diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index 9b86b529af47..1be0d4439e69 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -132,6 +132,8 @@ using ::android::hardware::tv::tuner::V1_0::LnbTone; using ::android::hardware::tv::tuner::V1_0::LnbVoltage; using ::android::hardware::tv::tuner::V1_0::PlaybackSettings; using ::android::hardware::tv::tuner::V1_0::RecordSettings; +using ::android::hardware::tv::tuner::V1_1::AudioStreamType; +using ::android::hardware::tv::tuner::V1_1::AvStreamType; using ::android::hardware::tv::tuner::V1_1::Constant; using ::android::hardware::tv::tuner::V1_1::Constant64Bit; using ::android::hardware::tv::tuner::V1_1::FrontendAnalogAftFlag; @@ -157,6 +159,7 @@ using ::android::hardware::tv::tuner::V1_1::FrontendSpectralInversion; using ::android::hardware::tv::tuner::V1_1::FrontendStatusExt1_1; using ::android::hardware::tv::tuner::V1_1::FrontendStatusTypeExt1_1; using ::android::hardware::tv::tuner::V1_1::FrontendTransmissionMode; +using ::android::hardware::tv::tuner::V1_1::VideoStreamType; struct fields_t { jfieldID tunerContext; @@ -993,6 +996,77 @@ Return<void> FrontendCallback::onScanMessage(FrontendScanMessageType type, const return Void(); } +Return<void> FrontendCallback::onScanMessageExt1_1(FrontendScanMessageTypeExt1_1 type, + const FrontendScanMessageExt1_1& message) { + ALOGD("FrontendCallback::onScanMessageExt1_1, type=%d", type); + JNIEnv *env = AndroidRuntime::getJNIEnv(); + jclass clazz = env->FindClass("android/media/tv/tuner/Tuner"); + switch(type) { + case FrontendScanMessageTypeExt1_1::MODULATION: { + jint modulation = -1; + switch (message.modulation().getDiscriminator()) { + case FrontendModulation::hidl_discriminator::dvbc: { + modulation = (jint) message.modulation().dvbc(); + break; + } + case FrontendModulation::hidl_discriminator::dvbt: { + modulation = (jint) message.modulation().dvbt(); + break; + } + case FrontendModulation::hidl_discriminator::dvbs: { + modulation = (jint) message.modulation().dvbs(); + break; + } + case FrontendModulation::hidl_discriminator::isdbs: { + modulation = (jint) message.modulation().isdbs(); + break; + } + case FrontendModulation::hidl_discriminator::isdbs3: { + modulation = (jint) message.modulation().isdbs3(); + break; + } + case FrontendModulation::hidl_discriminator::isdbt: { + modulation = (jint) message.modulation().isdbt(); + break; + } + case FrontendModulation::hidl_discriminator::atsc: { + modulation = (jint) message.modulation().atsc(); + break; + } + case FrontendModulation::hidl_discriminator::atsc3: { + modulation = (jint) message.modulation().atsc3(); + break; + } + case FrontendModulation::hidl_discriminator::dtmb: { + modulation = (jint) message.modulation().dtmb(); + break; + } + default: { + break; + } + } + if (modulation > 0) { + env->CallVoidMethod( + mObject, + env->GetMethodID(clazz, "onModulationReported", "(I)V"), + modulation); + } + break; + } + case FrontendScanMessageTypeExt1_1::HIGH_PRIORITY: { + bool isHighPriority = message.isHighPriority(); + env->CallVoidMethod( + mObject, + env->GetMethodID(clazz, "onPriorityReported", "([B)V"), + isHighPriority); + break; + } + default: + break; + } + return Void(); +} + /////////////// Tuner /////////////////////// sp<ITuner> JTuner::mTuner; @@ -3417,6 +3491,31 @@ static DemuxFilterAvSettings getFilterAvSettings(JNIEnv *env, const jobject& set return filterAvSettings; } +static bool getAvStreamType(JNIEnv *env, jobject filterConfigObj, AvStreamType& type) { + jobject settingsObj = + env->GetObjectField( + filterConfigObj, + env->GetFieldID( + env->FindClass("android/media/tv/tuner/filter/FilterConfiguration"), + "mSettings", + "Landroid/media/tv/tuner/filter/Settings;")); + jclass clazz = env->FindClass("android/media/tv/tuner/filter/AvSettings"); + AvStreamType streamType; + AudioStreamType audioStreamType = static_cast<AudioStreamType>( + env->GetIntField(settingsObj, env->GetFieldID(clazz, "mAudioStreamType", "I"))); + if (audioStreamType != AudioStreamType::UNDEFINED) { + type.audio(audioStreamType); + return true; + } + VideoStreamType videoStreamType = static_cast<VideoStreamType>( + env->GetIntField(settingsObj, env->GetFieldID(clazz, "mVideoStreamType", "I"))); + if (videoStreamType != VideoStreamType::UNDEFINED) { + type.video(videoStreamType); + return true; + } + return false; +} + static DemuxFilterPesDataSettings getFilterPesDataSettings(JNIEnv *env, const jobject& settings) { jclass clazz = env->FindClass("android/media/tv/tuner/filter/PesSettings"); uint16_t streamId = static_cast<uint16_t>( @@ -3739,6 +3838,16 @@ static jint copyData(JNIEnv *env, std::unique_ptr<MQ>& mq, EventFlag* flag, jbyt return size; } +static bool isAvFilterSettings(DemuxFilterSettings filterSettings) { + return (filterSettings.getDiscriminator() == DemuxFilterSettings::hidl_discriminator::ts + && filterSettings.ts().filterSettings.getDiscriminator() + == DemuxTsFilterSettings::FilterSettings::hidl_discriminator::av) + || + (filterSettings.getDiscriminator() == DemuxFilterSettings::hidl_discriminator::mmtp + && filterSettings.mmtp().filterSettings.getDiscriminator() + == DemuxMmtpFilterSettings::FilterSettings::hidl_discriminator::av); +} + static jint android_media_tv_Tuner_configure_filter( JNIEnv *env, jobject filter, int type, int subtype, jobject settings) { ALOGD("configure filter type=%d, subtype=%d", type, subtype); @@ -3762,6 +3871,20 @@ static jint android_media_tv_Tuner_configure_filter( } } + AvStreamType streamType; + if (isAvFilterSettings(filterSettings) && getAvStreamType(env, settings, streamType)) { + sp<::android::hardware::tv::tuner::V1_1::IFilter> iFilterSp_1_1; + iFilterSp_1_1 = ::android::hardware::tv::tuner::V1_1::IFilter::castFrom(iFilterSp); + if (iFilterSp_1_1 != NULL) { + res = iFilterSp_1_1->configureAvStreamType(streamType); + } else { + ALOGW("configureAvStreamType is not supported with the current HAL implementation."); + } + if (res != Result::SUCCESS) { + return (jint) res; + } + } + MQDescriptorSync<uint8_t> filterMQDesc; Result getQueueDescResult = Result::UNKNOWN_ERROR; if (filterSp->mFilterMQ == NULL) { diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h index 3f74d24b29c5..71d2983b7c51 100644 --- a/media/jni/android_media_tv_Tuner.h +++ b/media/jni/android_media_tv_Tuner.h @@ -20,6 +20,7 @@ #include <android/hardware/tv/tuner/1.1/IFilter.h> #include <android/hardware/tv/tuner/1.1/IFilterCallback.h> #include <android/hardware/tv/tuner/1.1/IFrontend.h> +#include <android/hardware/tv/tuner/1.1/IFrontendCallback.h> #include <android/hardware/tv/tuner/1.1/ITuner.h> #include <android/hardware/tv/tuner/1.1/types.h> @@ -63,7 +64,6 @@ using ::android::hardware::tv::tuner::V1_0::IDvrCallback; using ::android::hardware::tv::tuner::V1_0::IFilter; using ::android::hardware::tv::tuner::V1_1::IFilterCallback; using ::android::hardware::tv::tuner::V1_0::IFrontend; -using ::android::hardware::tv::tuner::V1_0::IFrontendCallback; using ::android::hardware::tv::tuner::V1_0::ILnb; using ::android::hardware::tv::tuner::V1_0::ILnbCallback; using ::android::hardware::tv::tuner::V1_0::ITimeFilter; @@ -73,6 +73,9 @@ using ::android::hardware::tv::tuner::V1_0::LnbId; using ::android::hardware::tv::tuner::V1_0::PlaybackStatus; using ::android::hardware::tv::tuner::V1_0::RecordStatus; using ::android::hardware::tv::tuner::V1_0::Result; +using ::android::hardware::tv::tuner::V1_1::FrontendScanMessageExt1_1; +using ::android::hardware::tv::tuner::V1_1::FrontendScanMessageTypeExt1_1; +using ::android::hardware::tv::tuner::V1_1::IFrontendCallback; using MQ = MessageQueue<uint8_t, kSynchronizedReadWrite>; @@ -191,6 +194,8 @@ struct FrontendCallback : public IFrontendCallback { virtual Return<void> onEvent(FrontendEventType frontendEventType); virtual Return<void> onScanMessage( FrontendScanMessageType type, const FrontendScanMessage& message); + virtual Return<void> onScanMessageExt1_1( + FrontendScanMessageTypeExt1_1 type, const FrontendScanMessageExt1_1& messageExt); jweak mObject; FrontendId mId; diff --git a/non-updatable-api/current.txt b/non-updatable-api/current.txt index babd54d723b8..225a2e70e998 100644 --- a/non-updatable-api/current.txt +++ b/non-updatable-api/current.txt @@ -2851,6 +2851,7 @@ package android.accessibilityservice { method public int describeContents(); method public int getDisplayId(); method public int getGestureId(); + method @NonNull public java.util.List<android.view.MotionEvent> getMotionEvents(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.accessibilityservice.AccessibilityGestureEvent> CREATOR; } @@ -2932,6 +2933,7 @@ package android.accessibilityservice { field public static final int GESTURE_SWIPE_UP_AND_DOWN = 7; // 0x7 field public static final int GESTURE_SWIPE_UP_AND_LEFT = 13; // 0xd field public static final int GESTURE_SWIPE_UP_AND_RIGHT = 14; // 0xe + field public static final int GESTURE_UNKNOWN = 0; // 0x0 field public static final int GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS = 14; // 0xe field public static final int GLOBAL_ACTION_ACCESSIBILITY_BUTTON = 11; // 0xb field public static final int GLOBAL_ACTION_ACCESSIBILITY_BUTTON_CHOOSER = 12; // 0xc @@ -3047,6 +3049,7 @@ package android.accessibilityservice { field public static final int FLAG_REQUEST_SHORTCUT_WARNING_DIALOG_SPOKEN_FEEDBACK = 1024; // 0x400 field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4 field public static final int FLAG_RETRIEVE_INTERACTIVE_WINDOWS = 64; // 0x40 + field public static final int FLAG_SEND_MOTION_EVENTS = 16384; // 0x4000 field public static final int FLAG_SERVICE_HANDLES_DOUBLE_TAP = 2048; // 0x800 field public int eventTypes; field public int feedbackType; diff --git a/non-updatable-api/system-current.txt b/non-updatable-api/system-current.txt index 93fdfba276db..3b6673509f36 100644 --- a/non-updatable-api/system-current.txt +++ b/non-updatable-api/system-current.txt @@ -5150,12 +5150,45 @@ package android.media.tv.tuner.filter { public class AvSettings extends android.media.tv.tuner.filter.Settings { method @NonNull public static android.media.tv.tuner.filter.AvSettings.Builder builder(int, boolean); + method public int getAudioStreamType(); + method public int getVideoStreamType(); method public boolean isPassthrough(); + field public static final int AUDIO_STREAM_TYPE_AAC = 6; // 0x6 + field public static final int AUDIO_STREAM_TYPE_AC3 = 7; // 0x7 + field public static final int AUDIO_STREAM_TYPE_AC4 = 9; // 0x9 + field public static final int AUDIO_STREAM_TYPE_DRA = 15; // 0xf + field public static final int AUDIO_STREAM_TYPE_DTS = 10; // 0xa + field public static final int AUDIO_STREAM_TYPE_DTS_HD = 11; // 0xb + field public static final int AUDIO_STREAM_TYPE_EAC3 = 8; // 0x8 + field public static final int AUDIO_STREAM_TYPE_MP3 = 2; // 0x2 + field public static final int AUDIO_STREAM_TYPE_MPEG1 = 3; // 0x3 + field public static final int AUDIO_STREAM_TYPE_MPEG2 = 4; // 0x4 + field public static final int AUDIO_STREAM_TYPE_MPEGH = 5; // 0x5 + field public static final int AUDIO_STREAM_TYPE_OPUS = 13; // 0xd + field public static final int AUDIO_STREAM_TYPE_PCM = 1; // 0x1 + field public static final int AUDIO_STREAM_TYPE_UNDEFINED = 0; // 0x0 + field public static final int AUDIO_STREAM_TYPE_VORBIS = 14; // 0xe + field public static final int AUDIO_STREAM_TYPE_WMA = 12; // 0xc + field public static final int VIDEO_STREAM_TYPE_AV1 = 10; // 0xa + field public static final int VIDEO_STREAM_TYPE_AVC = 5; // 0x5 + field public static final int VIDEO_STREAM_TYPE_AVS = 11; // 0xb + field public static final int VIDEO_STREAM_TYPE_AVS2 = 12; // 0xc + field public static final int VIDEO_STREAM_TYPE_HEVC = 6; // 0x6 + field public static final int VIDEO_STREAM_TYPE_MPEG1 = 2; // 0x2 + field public static final int VIDEO_STREAM_TYPE_MPEG2 = 3; // 0x3 + field public static final int VIDEO_STREAM_TYPE_MPEG4P2 = 4; // 0x4 + field public static final int VIDEO_STREAM_TYPE_RESERVED = 1; // 0x1 + field public static final int VIDEO_STREAM_TYPE_UNDEFINED = 0; // 0x0 + field public static final int VIDEO_STREAM_TYPE_VC1 = 7; // 0x7 + field public static final int VIDEO_STREAM_TYPE_VP8 = 8; // 0x8 + field public static final int VIDEO_STREAM_TYPE_VP9 = 9; // 0x9 } public static class AvSettings.Builder { method @NonNull public android.media.tv.tuner.filter.AvSettings build(); + method @NonNull public android.media.tv.tuner.filter.AvSettings.Builder setAudioStreamType(int); method @NonNull public android.media.tv.tuner.filter.AvSettings.Builder setPassthrough(boolean); + method @NonNull public android.media.tv.tuner.filter.AvSettings.Builder setVideoStreamType(int); } public class DownloadEvent extends android.media.tv.tuner.filter.FilterEvent { diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java index 0eac4add7b09..02751e27874d 100644 --- a/packages/Shell/src/com/android/shell/BugreportProgressService.java +++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java @@ -737,18 +737,20 @@ public class BugreportProgressService extends Service { final Intent infoIntent = new Intent(mContext, BugreportProgressService.class); infoIntent.setAction(INTENT_BUGREPORT_INFO_LAUNCH); infoIntent.putExtra(EXTRA_ID, info.id); + // Simple notification action button clicks are immutable final PendingIntent infoPendingIntent = PendingIntent.getService(mContext, info.id, infoIntent, - PendingIntent.FLAG_UPDATE_CURRENT); + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); final Action infoAction = new Action.Builder(null, mContext.getString(R.string.bugreport_info_action), infoPendingIntent).build(); final Intent screenshotIntent = new Intent(mContext, BugreportProgressService.class); screenshotIntent.setAction(INTENT_BUGREPORT_SCREENSHOT); screenshotIntent.putExtra(EXTRA_ID, info.id); + // Simple notification action button clicks are immutable PendingIntent screenshotPendingIntent = mTakingScreenshot ? null : PendingIntent .getService(mContext, info.id, screenshotIntent, - PendingIntent.FLAG_UPDATE_CURRENT); + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); final Action screenshotAction = new Action.Builder(null, mContext.getString(R.string.bugreport_screenshot_action), screenshotPendingIntent).build(); diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp index a9a5671d5b03..80a6257fd7a9 100644 --- a/packages/SystemUI/Android.bp +++ b/packages/SystemUI/Android.bp @@ -139,7 +139,9 @@ android_library { "SystemUI-tags", "SystemUI-proto", "metrics-helper-lib", - "androidx.test.rules", "hamcrest-library", + "hamcrest-library", + "androidx.test.rules", + "androidx.test.uiautomator", "mockito-target-extended-minus-junit4", "testables", "truth-prebuilt", diff --git a/packages/SystemUI/res/layout/qs_footer_impl.xml b/packages/SystemUI/res/layout/qs_footer_impl.xml index 436188a83d4f..0822947e8b16 100644 --- a/packages/SystemUI/res/layout/qs_footer_impl.xml +++ b/packages/SystemUI/res/layout/qs_footer_impl.xml @@ -16,7 +16,7 @@ --> <!-- Extends FrameLayout --> -<com.android.systemui.qs.QSFooterImpl +<com.android.systemui.qs.QSFooterView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/qs_footer" android:layout_width="match_parent" @@ -130,4 +130,4 @@ </com.android.systemui.statusbar.AlphaOptimizedFrameLayout> </com.android.keyguard.AlphaOptimizedLinearLayout> </LinearLayout> -</com.android.systemui.qs.QSFooterImpl> +</com.android.systemui.qs.QSFooterView> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java index 97196d1ef451..5b41d5f90975 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java @@ -55,8 +55,6 @@ public class WindowManagerWrapper { WindowManager.TRANSIT_WALLPAPER_INTRA_CLOSE; public static final int TRANSIT_TASK_OPEN_BEHIND = WindowManager.TRANSIT_TASK_OPEN_BEHIND; public static final int TRANSIT_ACTIVITY_RELAUNCH = WindowManager.TRANSIT_ACTIVITY_RELAUNCH; - public static final int TRANSIT_DOCK_TASK_FROM_RECENTS = - WindowManager.TRANSIT_DOCK_TASK_FROM_RECENTS; public static final int TRANSIT_KEYGUARD_GOING_AWAY = WindowManager.TRANSIT_KEYGUARD_GOING_AWAY; public static final int TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER = WindowManager.TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardRootViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardRootViewController.java index 5c125fcc95cb..4e375c2d1227 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardRootViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardRootViewController.java @@ -19,7 +19,7 @@ package com.android.keyguard; import android.view.ViewGroup; import com.android.keyguard.dagger.KeyguardBouncerScope; -import com.android.keyguard.dagger.RootView; +import com.android.systemui.dagger.qualifiers.RootView; import com.android.systemui.statusbar.phone.KeyguardBouncer; import com.android.systemui.util.ViewController; diff --git a/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardBouncerModule.java b/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardBouncerModule.java index 881108858b51..4fad9a916d0d 100644 --- a/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardBouncerModule.java +++ b/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardBouncerModule.java @@ -24,6 +24,7 @@ import com.android.keyguard.KeyguardMessageArea; import com.android.keyguard.KeyguardSecurityContainer; import com.android.keyguard.KeyguardSecurityViewFlipper; import com.android.systemui.R; +import com.android.systemui.dagger.qualifiers.RootView; import com.android.systemui.statusbar.phone.KeyguardBouncer; import dagger.Module; diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java index 4814501c840d..bdd0b55b27ea 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java @@ -85,10 +85,12 @@ public class SystemUIFactory { @VisibleForTesting public void init(Context context, boolean fromTest) throws ExecutionException, InterruptedException { + final boolean initializeComponents = !fromTest + && android.os.Process.myUserHandle().isSystem(); mRootComponent = buildGlobalRootComponent(context); // Stand up WMComponent mWMComponent = mRootComponent.getWMComponentBuilder().build(); - if (!fromTest) { + if (initializeComponents) { // Only initialize when not starting from tests since this currently initializes some // components that shouldn't be run in the test environment mWMComponent.init(); @@ -96,7 +98,7 @@ public class SystemUIFactory { // And finally, retrieve whatever SysUI needs from WMShell and build SysUI. SysUIComponent.Builder builder = mRootComponent.getSysUIComponent(); - if (!fromTest) { + if (initializeComponents) { // Only initialize when not starting from tests since this currently initializes some // components that shouldn't be run in the test environment builder = builder.setPip(mWMComponent.getPip()) @@ -111,7 +113,7 @@ public class SystemUIFactory { .setInputConsumerController(mWMComponent.getInputConsumerController()) .setShellTaskOrganizer(mWMComponent.getShellTaskOrganizer()) .build(); - if (!fromTest) { + if (initializeComponents) { mSysUIComponent.init(); } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleFlyoutView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleFlyoutView.java index 009114ffa0be..d8b32500db85 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleFlyoutView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleFlyoutView.java @@ -61,7 +61,8 @@ public class BubbleFlyoutView extends FrameLayout { /** Translation Y of fade animation. */ private static final float FLYOUT_FADE_Y = 40f; - private static final long FLYOUT_FADE_DURATION = 200L; + private static final long FLYOUT_FADE_OUT_DURATION = 150L; + private static final long FLYOUT_FADE_IN_DURATION = 250L; private final int mFlyoutPadding; private final int mFlyoutSpaceFromBubble; @@ -235,26 +236,32 @@ public class BubbleFlyoutView extends FrameLayout { * Fade animation for consecutive flyouts. */ void animateUpdate(Bubble.FlyoutMessage flyoutMessage, float parentWidth, float stackY) { - fade(false /* in */); - updateFlyoutMessage(flyoutMessage, parentWidth); - // Wait for TextViews to layout with updated height. - post(() -> { - mFlyoutY = stackY + (mBubbleSize - mFlyoutTextContainer.getHeight()) / 2f; - fade(true /* in */); - }); + final Runnable afterFadeOut = () -> { + updateFlyoutMessage(flyoutMessage, parentWidth); + // Wait for TextViews to layout with updated height. + post(() -> { + mFlyoutY = stackY + (mBubbleSize - mFlyoutTextContainer.getHeight()) / 2f; + fade(true /* in */, () -> {} /* after */); + } /* after */ ); + }; + fade(false /* in */, afterFadeOut); } - private void fade(boolean in) { + /* + * Fade-out above or fade-in from below. + */ + private void fade(boolean in, Runnable afterFade) { setAlpha(in ? 0f : 1f); - setTranslationY(in ? mFlyoutY : mFlyoutY + FLYOUT_FADE_Y); + setTranslationY(in ? mFlyoutY + FLYOUT_FADE_Y : mFlyoutY); animate() .alpha(in ? 1f : 0f) - .setDuration(FLYOUT_FADE_DURATION) + .setDuration(in ? FLYOUT_FADE_IN_DURATION : FLYOUT_FADE_OUT_DURATION) .setInterpolator(in ? ALPHA_IN : ALPHA_OUT); animate() .translationY(in ? mFlyoutY : mFlyoutY - FLYOUT_FADE_Y) - .setDuration(FLYOUT_FADE_DURATION) - .setInterpolator(in ? ALPHA_IN : ALPHA_OUT); + .setDuration(in ? FLYOUT_FADE_IN_DURATION : FLYOUT_FADE_OUT_DURATION) + .setInterpolator(in ? ALPHA_IN : ALPHA_OUT) + .withEndAction(afterFade); } private void updateFlyoutMessage(Bubble.FlyoutMessage flyoutMessage, float parentWidth) { diff --git a/packages/SystemUI/src/com/android/keyguard/dagger/RootView.java b/packages/SystemUI/src/com/android/systemui/dagger/qualifiers/RootView.java index 5ebff097604b..e6c46c07fff8 100644 --- a/packages/SystemUI/src/com/android/keyguard/dagger/RootView.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/qualifiers/RootView.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 The Android Open Source Project + * Copyright (C) 2020 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. @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.keyguard.dagger; +package com.android.systemui.dagger.qualifiers; import static java.lang.annotation.RetentionPolicy.RUNTIME; diff --git a/packages/SystemUI/src/com/android/systemui/qs/DoubleLineTileLayout.kt b/packages/SystemUI/src/com/android/systemui/qs/DoubleLineTileLayout.kt index dc157a8dd257..81076475c5ce 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/DoubleLineTileLayout.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/DoubleLineTileLayout.kt @@ -33,7 +33,7 @@ class DoubleLineTileLayout( private const val NUM_LINES = 2 } - protected val mRecords = ArrayList<QSPanel.TileRecord>() + protected val mRecords = ArrayList<QSPanelControllerBase.TileRecord>() private var _listening = false private var smallTileSize = 0 private val twoLineHeight @@ -50,17 +50,17 @@ class DoubleLineTileLayout( updateResources() } - override fun addTile(tile: QSPanel.TileRecord) { + override fun addTile(tile: QSPanelControllerBase.TileRecord) { mRecords.add(tile) tile.tile.setListening(this, _listening) addTileView(tile) } - protected fun addTileView(tile: QSPanel.TileRecord) { + protected fun addTileView(tile: QSPanelControllerBase.TileRecord) { addView(tile.tileView) } - override fun removeTile(tile: QSPanel.TileRecord) { + override fun removeTile(tile: QSPanelControllerBase.TileRecord) { mRecords.remove(tile) tile.tile.setListening(this, false) removeView(tile.tileView) @@ -72,7 +72,7 @@ class DoubleLineTileLayout( super.removeAllViews() } - override fun getOffsetTop(tile: QSPanel.TileRecord?) = top + override fun getOffsetTop(tile: QSPanelControllerBase.TileRecord?) = top override fun updateResources(): Boolean { with(mContext.resources) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java index 04f379ef35ea..3062a77bcbe1 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java @@ -26,7 +26,7 @@ import com.android.internal.logging.UiEventLogger; import com.android.systemui.R; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.QSPanel.QSTileLayout; -import com.android.systemui.qs.QSPanel.TileRecord; +import com.android.systemui.qs.QSPanelControllerBase.TileRecord; import java.util.ArrayList; import java.util.Set; diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java index 9dcc924f161e..4d4195063227 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java @@ -28,12 +28,17 @@ import com.android.systemui.qs.QSHost.Callback; import com.android.systemui.qs.QSPanel.QSTileLayout; import com.android.systemui.qs.TouchAnimator.Builder; import com.android.systemui.qs.TouchAnimator.Listener; +import com.android.systemui.qs.dagger.QSScope; import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService.Tunable; import java.util.ArrayList; import java.util.Collection; +import javax.inject.Inject; + +/** */ +@QSScope public class QSAnimator implements Callback, PageListener, Listener, OnLayoutChangeListener, OnAttachStateChangeListener, Tunable { @@ -53,6 +58,9 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha private final ArrayList<View> mQuickQsViews = new ArrayList<>(); private final QuickQSPanel mQuickQsPanel; private final QSPanel mQsPanel; + private final QSPanelController mQsPanelController; + private final QuickQSPanelController mQuickQSPanelController; + private final QSSecurityFooter mSecurityFooter; private final QS mQs; private PagedTileLayout mPagedLayout; @@ -78,10 +86,19 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha private QSTileHost mHost; private boolean mShowCollapsedOnKeyguard; - public QSAnimator(QS qs, QuickQSPanel quickPanel, QSPanel panel) { + @Inject + public QSAnimator(QS qs, QuickQSPanel quickPanel, QSPanel panel, + QSPanelController qsPanelController, QuickQSPanelController quickQSPanelController, + QSTileHost qsTileHost, + QSSecurityFooter securityFooter) { mQs = qs; mQuickQsPanel = quickPanel; mQsPanel = panel; + mQsPanelController = qsPanelController; + mQuickQSPanelController = quickQSPanelController; + mSecurityFooter = securityFooter; + mHost = qsTileHost; + mHost.addCallback(this); mQsPanel.addOnAttachStateChangeListener(this); qs.getView().addOnLayoutChangeListener(this); if (mQsPanel.isAttachedToWindow()) { @@ -134,12 +151,6 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha && !mShowCollapsedOnKeyguard ? View.INVISIBLE : View.VISIBLE); } - public void setHost(QSTileHost qsh) { - mHost = qsh; - qsh.addCallback(this); - updateAnimators(); - } - @Override public void onViewAttachedToWindow(View v) { Dependency.get(TunerService.class).addTunable(this, ALLOW_FANCY_ANIMATION, @@ -148,9 +159,7 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha @Override public void onViewDetachedFromWindow(View v) { - if (mHost != null) { - mHost.removeCallback(this); - } + mHost.removeCallback(this); Dependency.get(TunerService.class).removeTunable(this); } @@ -185,8 +194,7 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha TouchAnimator.Builder translationXBuilder = new Builder(); TouchAnimator.Builder translationYBuilder = new Builder(); - if (mQsPanel.getHost() == null) return; - Collection<QSTile> tiles = mQsPanel.getHost().getTiles(); + Collection<QSTile> tiles = mHost.getTiles(); int count = 0; int[] loc1 = new int[2]; int[] loc2 = new int[2]; @@ -206,7 +214,7 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha firstPageBuilder.addFloat(tileLayout, "translationY", heightDiff, 0); for (QSTile tile : tiles) { - QSTileView tileView = mQsPanel.getTileView(tile); + QSTileView tileView = mQsPanelController.getTileView(tile); if (tileView == null) { Log.e(TAG, "tileView is null " + tile.getTileSpec()); continue; @@ -217,7 +225,7 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha // This case: less tiles to animate in small displays. if (count < mQuickQsPanel.getTileLayout().getNumVisibleTiles() && mAllowFancy) { // Quick tiles. - QSTileView quickTileView = mQuickQsPanel.getTileView(tile); + QSTileView quickTileView = mQuickQSPanelController.getTileView(tile); if (quickTileView == null) continue; lastX = loc1[0]; @@ -302,16 +310,12 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha // Fade in the security footer and the divider as we reach the final position builder = new Builder().setStartDelay(EXPANDED_TILE_DELAY); - if (mQsPanel.getSecurityFooter() != null) { - builder.addFloat(mQsPanel.getSecurityFooter().getView(), "alpha", 0, 1); - } + builder.addFloat(mSecurityFooter.getView(), "alpha", 0, 1); if (mQsPanel.getDivider() != null) { builder.addFloat(mQsPanel.getDivider(), "alpha", 0, 1); } mAllPagesDelayedAnimator = builder.build(); - if (mQsPanel.getSecurityFooter() != null) { - mAllViews.add(mQsPanel.getSecurityFooter().getView()); - } + mAllViews.add(mSecurityFooter.getView()); if (mQsPanel.getDivider() != null) { mAllViews.add(mQsPanel.getDivider()); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImplController.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImplController.java index 1e239b1e9ec9..acead987a06a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImplController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImplController.java @@ -16,19 +16,21 @@ package com.android.systemui.qs; -import com.android.systemui.R; +import com.android.systemui.qs.dagger.QSScope; import com.android.systemui.util.ViewController; import javax.inject.Inject; -class QSContainerImplController extends ViewController<QSContainerImpl> { +/** */ +@QSScope +public class QSContainerImplController extends ViewController<QSContainerImpl> { private final QuickStatusBarHeaderController mQuickStatusBarHeaderController; - private QSContainerImplController(QSContainerImpl view, - QuickStatusBarHeaderController.Builder quickStatusBarHeaderControllerBuilder) { + @Inject + QSContainerImplController(QSContainerImpl view, + QuickStatusBarHeaderController quickStatusBarHeaderController) { super(view); - mQuickStatusBarHeaderController = quickStatusBarHeaderControllerBuilder - .setQuickStatusBarHeader(mView.findViewById(R.id.header)).build(); + mQuickStatusBarHeaderController = quickStatusBarHeaderController; } @Override @@ -49,23 +51,7 @@ class QSContainerImplController extends ViewController<QSContainerImpl> { protected void onViewDetached() { } - static class Builder { - private final QuickStatusBarHeaderController.Builder mQuickStatusBarHeaderControllerBuilder; - private QSContainerImpl mView; - - @Inject - Builder( - QuickStatusBarHeaderController.Builder quickStatusBarHeaderControllerBuilder) { - mQuickStatusBarHeaderControllerBuilder = quickStatusBarHeaderControllerBuilder; - } - - public Builder setQSContainerImpl(QSContainerImpl view) { - mView = view; - return this; - } - - public QSContainerImplController build() { - return new QSContainerImplController(mView, mQuickStatusBarHeaderControllerBuilder); - } + public QSContainerImpl getView() { + return mView; } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java index 2be8a9704e1c..cfcceb2b2951 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java @@ -76,7 +76,7 @@ public class QSDetail extends LinearLayout { private int mOpenY; private boolean mAnimatingOpen; private boolean mSwitchState; - private View mFooter; + private QSFooter mFooter; public QSDetail(Context context, @Nullable AttributeSet attrs) { super(context, attrs); @@ -120,7 +120,8 @@ public class QSDetail extends LinearLayout { mDetailDoneButton.setOnClickListener(doneListener); } - public void setQsPanel(QSPanel panel, QuickStatusBarHeader header, View footer) { + /** */ + public void setQsPanel(QSPanel panel, QuickStatusBarHeader header, QSFooter footer) { mQsPanel = panel; mHeader = header; mFooter = footer; diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java index 84563a078447..8b9dae14c809 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 The Android Open Source Project + * Copyright (C) 2020 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. @@ -11,19 +11,14 @@ * 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 + * limitations under the License. */ package com.android.systemui.qs; import static android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS; -import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT; - -import android.content.ClipData; -import android.content.ClipboardManager; import android.content.Context; -import android.content.Intent; import android.content.res.Configuration; import android.database.ContentObserver; import android.graphics.PorterDuff.Mode; @@ -36,50 +31,27 @@ import android.os.Handler; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; -import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; -import android.view.View.OnClickListener; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; -import android.widget.Toast; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; -import com.android.internal.logging.MetricsLogger; -import com.android.internal.logging.nano.MetricsProto; -import com.android.keyguard.KeyguardUpdateMonitor; import com.android.settingslib.Utils; import com.android.settingslib.development.DevelopmentSettingsEnabler; import com.android.settingslib.drawable.UserIconDrawable; -import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.R.dimen; -import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.qs.TouchAnimator.Builder; -import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.phone.MultiUserSwitch; import com.android.systemui.statusbar.phone.SettingsButton; -import com.android.systemui.statusbar.policy.DeviceProvisionedController; -import com.android.systemui.statusbar.policy.UserInfoController; -import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener; -import com.android.systemui.tuner.TunerService; - -import javax.inject.Inject; -import javax.inject.Named; - -public class QSFooterImpl extends FrameLayout implements QSFooter, - OnClickListener, OnUserInfoChangedListener { - private static final String TAG = "QSFooterImpl"; - - private final ActivityStarter mActivityStarter; - private final UserInfoController mUserInfoController; - private final DeviceProvisionedController mDeviceProvisionedController; - private final UserTracker mUserTracker; +/** */ +public class QSFooterView extends FrameLayout { private SettingsButton mSettingsButton; protected View mSettingsContainer; private PageIndicator mPageIndicator; @@ -87,7 +59,6 @@ public class QSFooterImpl extends FrameLayout implements QSFooter, private boolean mShouldShowBuildText; private boolean mQsDisabled; - private QSPanel mQsPanel; private QuickQSPanel mQuickQsPanel; private boolean mExpanded; @@ -117,39 +88,19 @@ public class QSFooterImpl extends FrameLayout implements QSFooter, } }; - @Inject - public QSFooterImpl(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs, - ActivityStarter activityStarter, UserInfoController userInfoController, - DeviceProvisionedController deviceProvisionedController, UserTracker userTracker) { + public QSFooterView(Context context, AttributeSet attrs) { super(context, attrs); - mActivityStarter = activityStarter; - mUserInfoController = userInfoController; - mDeviceProvisionedController = deviceProvisionedController; - mUserTracker = userTracker; - } - - @VisibleForTesting - public QSFooterImpl(Context context, AttributeSet attrs) { - this(context, attrs, - Dependency.get(ActivityStarter.class), - Dependency.get(UserInfoController.class), - Dependency.get(DeviceProvisionedController.class), - Dependency.get(UserTracker.class)); } @Override protected void onFinishInflate() { super.onFinishInflate(); mEdit = findViewById(android.R.id.edit); - mEdit.setOnClickListener(view -> - mActivityStarter.postQSRunnableDismissingKeyguard(() -> - mQsPanel.showEdit(view))); mPageIndicator = findViewById(R.id.footer_page_indicator); mSettingsButton = findViewById(R.id.settings_button); mSettingsContainer = findViewById(R.id.settings_button_container); - mSettingsButton.setOnClickListener(this); mMultiUserSwitch = findViewById(R.id.multi_user_switch); mMultiUserAvatar = mMultiUserSwitch.findViewById(R.id.multi_user_avatar); @@ -157,19 +108,6 @@ public class QSFooterImpl extends FrameLayout implements QSFooter, mActionsContainer = findViewById(R.id.qs_footer_actions_container); mEditContainer = findViewById(R.id.qs_footer_actions_edit_container); mBuildText = findViewById(R.id.build); - mBuildText.setOnLongClickListener(view -> { - CharSequence buildText = mBuildText.getText(); - if (!TextUtils.isEmpty(buildText)) { - ClipboardManager service = - mUserTracker.getUserContext().getSystemService(ClipboardManager.class); - String label = mContext.getString(R.string.build_number_clip_data_label); - service.setPrimaryClip(ClipData.newPlainText(label, buildText)); - Toast.makeText(mContext, R.string.build_number_copy_toast, Toast.LENGTH_SHORT) - .show(); - return true; - } - return false; - }); // RenderThread is doing more harm than good when touching the header (to expand quick // settings), so disable it for this view @@ -180,7 +118,6 @@ public class QSFooterImpl extends FrameLayout implements QSFooter, addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> updateAnimator(right - left)); setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); - updateEverything(); setBuildText(); } @@ -249,24 +186,22 @@ public class QSFooterImpl extends FrameLayout implements QSFooter, .build(); } - @Override - public void setKeyguardShowing(boolean keyguardShowing) { + /** */ + public void setKeyguardShowing() { setExpansion(mExpansionAmount); } - @Override public void setExpandClickListener(OnClickListener onClickListener) { mExpandClickListener = onClickListener; } - @Override - public void setExpanded(boolean expanded) { + void setExpanded(boolean expanded, boolean isTunerEnabled) { if (mExpanded == expanded) return; mExpanded = expanded; - updateEverything(); + updateEverything(isTunerEnabled); } - @Override + /** */ public void setExpansion(float headerExpansionFraction) { mExpansionAmount = headerExpansionFraction; if (mSettingsCogAnimator != null) mSettingsCogAnimator.setPosition(headerExpansionFraction); @@ -287,18 +222,16 @@ public class QSFooterImpl extends FrameLayout implements QSFooter, @Override @VisibleForTesting public void onDetachedFromWindow() { - setListening(false); mContext.getContentResolver().unregisterContentObserver(mDeveloperSettingsObserver); super.onDetachedFromWindow(); } - @Override + /** */ public void setListening(boolean listening) { if (listening == mListening) { return; } mListening = listening; - updateListeners(); } @Override @@ -318,17 +251,16 @@ public class QSFooterImpl extends FrameLayout implements QSFooter, info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_EXPAND); } - @Override - public void disable(int state1, int state2, boolean animate) { + void disable(int state2, boolean isTunerEnabled) { final boolean disabled = (state2 & DISABLE2_QUICK_SETTINGS) != 0; if (disabled == mQsDisabled) return; mQsDisabled = disabled; - updateEverything(); + updateEverything(isTunerEnabled); } - public void updateEverything() { + void updateEverything(boolean isTunerEnabled) { post(() -> { - updateVisibilities(); + updateVisibilities(isTunerEnabled); updateClickabilities(); setClickable(false); }); @@ -341,11 +273,10 @@ public class QSFooterImpl extends FrameLayout implements QSFooter, mBuildText.setLongClickable(mBuildText.getVisibility() == View.VISIBLE); } - private void updateVisibilities() { + private void updateVisibilities(boolean isTunerEnabled) { mSettingsContainer.setVisibility(mQsDisabled ? View.GONE : View.VISIBLE); mSettingsContainer.findViewById(R.id.tuner_icon).setVisibility( - TunerService.isTunerEnabled(mContext, mUserTracker.getUserHandle()) ? View.VISIBLE - : View.INVISIBLE); + isTunerEnabled ? View.VISIBLE : View.INVISIBLE); final boolean isDemo = UserManager.isDeviceInDemoMode(mContext); mMultiUserSwitch.setVisibility(showUserSwitcher() ? View.VISIBLE : View.INVISIBLE); mEditContainer.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE); @@ -358,78 +289,22 @@ public class QSFooterImpl extends FrameLayout implements QSFooter, return mExpanded && mMultiUserSwitch.isMultiUserEnabled(); } - private void updateListeners() { - if (mListening) { - mUserInfoController.addCallback(this); - } else { - mUserInfoController.removeCallback(this); - } - } - - @Override + /** */ public void setQSPanel(final QSPanel qsPanel) { - mQsPanel = qsPanel; - if (mQsPanel != null) { + if (qsPanel != null) { mMultiUserSwitch.setQsPanel(qsPanel); - mQsPanel.setFooterPageIndicator(mPageIndicator); + qsPanel.setFooterPageIndicator(mPageIndicator); } } - @Override public void setQQSPanel(@Nullable QuickQSPanel panel) { mQuickQsPanel = panel; } - @Override - public void onClick(View v) { - // Don't do anything until view are unhidden - if (!mExpanded) { - return; - } - - if (v == mSettingsButton) { - if (!mDeviceProvisionedController.isCurrentUserSetup()) { - // If user isn't setup just unlock the device and dump them back at SUW. - mActivityStarter.postQSRunnableDismissingKeyguard(() -> { - }); - return; - } - MetricsLogger.action(mContext, - mExpanded ? MetricsProto.MetricsEvent.ACTION_QS_EXPANDED_SETTINGS_LAUNCH - : MetricsProto.MetricsEvent.ACTION_QS_COLLAPSED_SETTINGS_LAUNCH); - if (mSettingsButton.isTunerClick()) { - mActivityStarter.postQSRunnableDismissingKeyguard(() -> { - if (TunerService.isTunerEnabled(mContext, mUserTracker.getUserHandle())) { - TunerService.showResetRequest(mContext, mUserTracker.getUserHandle(), - () -> { - // Relaunch settings so that the tuner disappears. - startSettingsActivity(); - }); - } else { - Toast.makeText(getContext(), R.string.tuner_toast, - Toast.LENGTH_LONG).show(); - TunerService.setTunerEnabled(mContext, mUserTracker.getUserHandle(), true); - } - startSettingsActivity(); - - }); - } else { - startSettingsActivity(); - } - } - } - - private void startSettingsActivity() { - mActivityStarter.startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS), - true /* dismissShade */); - } - @Override - public void onUserInfoChanged(String name, Drawable picture, String userAccount) { - if (picture != null && - UserManager.get(mContext).isGuestUser(KeyguardUpdateMonitor.getCurrentUser()) && - !(picture instanceof UserIconDrawable)) { - picture = picture.getConstantState().newDrawable(mContext.getResources()).mutate(); + void onUserInfoChanged(Drawable picture, boolean isGuestUser) { + if (picture != null && isGuestUser && !(picture instanceof UserIconDrawable)) { + picture = picture.getConstantState().newDrawable(getResources()).mutate(); picture.setColorFilter( Utils.getColorAttrDefaultColor(mContext, android.R.attr.colorForeground), Mode.SRC_IN); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterViewController.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterViewController.java new file mode 100644 index 000000000000..e3af04bdc31e --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterViewController.java @@ -0,0 +1,241 @@ +/* + * Copyright (C) 2020 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.systemui.qs; + +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.os.UserManager; +import android.text.TextUtils; +import android.view.View; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.Nullable; + +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.nano.MetricsProto; +import com.android.keyguard.KeyguardUpdateMonitor; +import com.android.systemui.R; +import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.qs.dagger.QSScope; +import com.android.systemui.settings.UserTracker; +import com.android.systemui.statusbar.phone.SettingsButton; +import com.android.systemui.statusbar.policy.DeviceProvisionedController; +import com.android.systemui.statusbar.policy.UserInfoController; +import com.android.systemui.tuner.TunerService; +import com.android.systemui.util.ViewController; + +import javax.inject.Inject; + +/** + * Controller for {@link QSFooterView}. + */ +@QSScope +public class QSFooterViewController extends ViewController<QSFooterView> implements QSFooter { + + private final UserManager mUserManager; + private final UserInfoController mUserInfoController; + private final ActivityStarter mActivityStarter; + private final DeviceProvisionedController mDeviceProvisionedController; + private final UserTracker mUserTracker; + private final QSPanelController mQsPanelController; + private final TunerService mTunerService; + private final MetricsLogger mMetricsLogger; + private final SettingsButton mSettingsButton; + private final TextView mBuildText; + private final View mEdit; + + private final UserInfoController.OnUserInfoChangedListener mOnUserInfoChangedListener = + new UserInfoController.OnUserInfoChangedListener() { + @Override + public void onUserInfoChanged(String name, Drawable picture, String userAccount) { + boolean isGuestUser = mUserManager.isGuestUser(KeyguardUpdateMonitor.getCurrentUser()); + mView.onUserInfoChanged(picture, isGuestUser); + } + }; + + private final View.OnClickListener mSettingsOnClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + // Don't do anything until view are unhidden + if (!mExpanded) { + return; + } + + if (v == mSettingsButton) { + if (!mDeviceProvisionedController.isCurrentUserSetup()) { + // If user isn't setup just unlock the device and dump them back at SUW. + mActivityStarter.postQSRunnableDismissingKeyguard(() -> { + }); + return; + } + mMetricsLogger.action( + mExpanded ? MetricsProto.MetricsEvent.ACTION_QS_EXPANDED_SETTINGS_LAUNCH + : MetricsProto.MetricsEvent.ACTION_QS_COLLAPSED_SETTINGS_LAUNCH); + if (mSettingsButton.isTunerClick()) { + mActivityStarter.postQSRunnableDismissingKeyguard(() -> { + if (isTunerEnabled()) { + mTunerService.showResetRequest( + mUserTracker.getUserHandle(), + () -> { + // Relaunch settings so that the tuner disappears. + startSettingsActivity(); + }); + } else { + Toast.makeText(getContext(), R.string.tuner_toast, + Toast.LENGTH_LONG).show(); + mTunerService.setTunerEnabled(mUserTracker.getUserHandle(), true); + } + startSettingsActivity(); + + }); + } else { + startSettingsActivity(); + } + } + } + }; + + private boolean mListening; + private boolean mExpanded; + + @Inject + QSFooterViewController(QSFooterView view, UserManager userManager, + UserInfoController userInfoController, ActivityStarter activityStarter, + DeviceProvisionedController deviceProvisionedController, UserTracker userTracker, + QSPanelController qsPanelController, TunerService tunerService, + MetricsLogger metricsLogger) { + super(view); + mUserManager = userManager; + mUserInfoController = userInfoController; + mActivityStarter = activityStarter; + mDeviceProvisionedController = deviceProvisionedController; + mUserTracker = userTracker; + mQsPanelController = qsPanelController; + mTunerService = tunerService; + mMetricsLogger = metricsLogger; + + mSettingsButton = mView.findViewById(R.id.settings_button); + mBuildText = mView.findViewById(R.id.build); + mEdit = mView.findViewById(android.R.id.edit); + } + + + @Override + protected void onViewAttached() { + mSettingsButton.setOnClickListener(mSettingsOnClickListener); + mBuildText.setOnLongClickListener(view -> { + CharSequence buildText = mBuildText.getText(); + if (!TextUtils.isEmpty(buildText)) { + ClipboardManager service = + mUserTracker.getUserContext().getSystemService(ClipboardManager.class); + String label = getResources().getString(R.string.build_number_clip_data_label); + service.setPrimaryClip(ClipData.newPlainText(label, buildText)); + Toast.makeText(getContext(), R.string.build_number_copy_toast, Toast.LENGTH_SHORT) + .show(); + return true; + } + return false; + }); + + mEdit.setOnClickListener(view -> + mActivityStarter.postQSRunnableDismissingKeyguard(() -> + mQsPanelController.showEdit(view))); + + mView.updateEverything(isTunerEnabled()); + } + + @Override + protected void onViewDetached() { + setListening(false); + } + + + @Override + public void setQSPanel(@Nullable QSPanel panel) { + mView.setQSPanel(panel); + } + + @Override + public void setVisibility(int visibility) { + mView.setVisibility(visibility); + } + + @Override + public void setExpanded(boolean expanded) { + mExpanded = expanded; + mView.setExpanded(expanded, isTunerEnabled()); + } + + + @Override + public int getHeight() { + return mView.getHeight(); + } + + @Override + public void setExpansion(float expansion) { + mView.setExpansion(expansion); + } + + @Override + public void setListening(boolean listening) { + if (mListening == listening) { + return; + } + + mListening = listening; + if (mListening) { + mUserInfoController.addCallback(mOnUserInfoChangedListener); + } else { + mUserInfoController.removeCallback(mOnUserInfoChangedListener); + } + } + + @Override + public void setKeyguardShowing(boolean keyguardShowing) { + mView.setKeyguardShowing(); + } + + /** */ + @Override + public void setExpandClickListener(View.OnClickListener onClickListener) { + mView.setExpandClickListener(onClickListener); + } + + @Override + public void setQQSPanel(@Nullable QuickQSPanel panel) { + mView.setQQSPanel(panel); + } + + @Override + public void disable(int state1, int state2, boolean animate) { + mView.disable(state2, isTunerEnabled()); + } + + + private void startSettingsActivity() { + mActivityStarter.startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS), + true /* dismissShade */); + } + + private boolean isTunerEnabled() { + return mTunerService.isTunerEnabled(mUserTracker.getUserHandle()); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index 3a783653a2d8..1a7d366d84b4 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -35,11 +35,11 @@ import androidx.annotation.VisibleForTesting; import com.android.systemui.Interpolators; import com.android.systemui.R; -import com.android.systemui.R.id; import com.android.systemui.media.MediaHost; import com.android.systemui.plugins.qs.QS; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.qs.customize.QSCustomizer; +import com.android.systemui.qs.dagger.QSFragmentComponent; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.notification.stack.StackStateAnimator; @@ -70,7 +70,6 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca private HeightListener mPanelView; protected QuickStatusBarHeader mHeader; private QSCustomizer mQSCustomizer; - protected QSPanel mQSPanel; protected NonInterceptingScrollView mQSPanelScrollView; private QSDetail mQSDetail; private boolean mListening; @@ -82,7 +81,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca private final RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler; private final InjectionInflationController mInjectionInflater; - private final QSContainerImplController.Builder mQSContainerImplControllerBuilder; + private final QSFragmentComponent.Factory mQsComponentFactory; private final QSTileHost mHost; private boolean mShowCollapsedOnKeyguard; private boolean mLastKeyguardAndExpanded; @@ -96,15 +95,17 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca private int[] mTmpLocation = new int[2]; private int mLastViewHeight; private float mLastHeaderTranslation; + private QSPanelController mQSPanelController; + private QuickQSPanelController mQuickQSPanelController; @Inject public QSFragment(RemoteInputQuickSettingsDisabler remoteInputQsDisabler, InjectionInflationController injectionInflater, QSTileHost qsTileHost, StatusBarStateController statusBarStateController, CommandQueue commandQueue, - QSContainerImplController.Builder qsContainerImplControllerBuilder) { + QSFragmentComponent.Factory qsComponentFactory) { mRemoteInputQuickSettingsDisabler = remoteInputQsDisabler; mInjectionInflater = injectionInflater; - mQSContainerImplControllerBuilder = qsContainerImplControllerBuilder; + mQsComponentFactory = qsComponentFactory; commandQueue.observe(getLifecycle(), this); mHost = qsTileHost; mStatusBarStateController = statusBarStateController; @@ -120,8 +121,13 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - mQSPanel = view.findViewById(R.id.quick_settings_panel); + QSFragmentComponent qsFragmentComponent = mQsComponentFactory.create(this); + mQSPanelController = qsFragmentComponent.getQSPanelController(); + mQuickQSPanelController = qsFragmentComponent.getQuickQSPanelController(); + + mQSPanelController.init(); + mQuickQSPanelController.init(); + mQSPanelScrollView = view.findViewById(R.id.expanded_qs_scroll_view); mQSPanelScrollView.addOnLayoutChangeListener( (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> { @@ -135,18 +141,15 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca }); mQSDetail = view.findViewById(R.id.qs_detail); mHeader = view.findViewById(R.id.header); - mQSPanel.setHeaderContainer(view.findViewById(R.id.header_text_container)); - mFooter = view.findViewById(R.id.qs_footer); - mContainer = view.findViewById(id.quick_settings_container); + mQSPanelController.setHeaderContainer(view.findViewById(R.id.header_text_container)); + mFooter = qsFragmentComponent.getQSFooter(); - mQSContainerImplController = mQSContainerImplControllerBuilder - .setQSContainerImpl((QSContainerImpl) view) - .build(); + mQSContainerImplController = qsFragmentComponent.getQSContainerImplController(); mQSContainerImplController.init(); + mContainer = mQSContainerImplController.getView(); - mQSDetail.setQsPanel(mQSPanel, mHeader, (View) mFooter); - mQSAnimator = new QSAnimator(this, mHeader.findViewById(R.id.quick_qs_panel), mQSPanel); - + mQSDetail.setQsPanel(mQSPanelController.getView(), mHeader, mFooter); + mQSAnimator = qsFragmentComponent.getQSAnimator(); mQSCustomizer = view.findViewById(R.id.qs_customize); mQSCustomizer.setQs(this); @@ -156,7 +159,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca setEditLocation(view); mQSCustomizer.restoreInstanceState(savedInstanceState); if (mQsExpanded) { - mQSPanel.getTileLayout().restoreInstanceState(savedInstanceState); + mQSPanelController.getTileLayout().restoreInstanceState(savedInstanceState); } } setHost(mHost); @@ -188,7 +191,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca outState.putBoolean(EXTRA_LISTENING, mListening); mQSCustomizer.saveInstanceState(outState); if (mQsExpanded) { - mQSPanel.getTileLayout().saveInstanceState(outState); + mQSPanelController.getTileLayout().saveInstanceState(outState); } } @@ -249,14 +252,10 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca } public void setHost(QSTileHost qsh) { - mQSPanel.setHost(qsh, mQSCustomizer); - mHeader.setQSPanel(mQSPanel); - mFooter.setQSPanel(mQSPanel); + mQSPanelController.setCustomizer(mQSCustomizer); + mHeader.setQSPanel(mQSPanelController.getView()); + mFooter.setQSPanel(mQSPanelController.getView()); mQSDetail.setHost(qsh); - - if (mQSAnimator != null) { - mQSAnimator.setHost(qsh); - } } @Override @@ -278,7 +277,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca private void updateQsState() { final boolean expandVisually = mQsExpanded || mStackScrollerOverscrolling || mHeaderAnimating; - mQSPanel.setExpanded(mQsExpanded); + mQSPanelController.setExpanded(mQsExpanded); mQSDetail.setExpanded(mQsExpanded); boolean keyguardShowing = isKeyguardShowing(); mHeader.setVisibility((mQsExpanded || !keyguardShowing || mHeaderAnimating @@ -294,7 +293,8 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca : View.INVISIBLE); mFooter.setExpanded((keyguardShowing && !mHeaderAnimating && !mShowCollapsedOnKeyguard) || (mQsExpanded && !mStackScrollerOverscrolling)); - mQSPanel.setVisibility(!mQsDisabled && expandVisually ? View.VISIBLE : View.INVISIBLE); + mQSPanelController.setVisibility( + !mQsDisabled && expandVisually ? View.VISIBLE : View.INVISIBLE); } private boolean isKeyguardShowing() { @@ -317,8 +317,12 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca } } + public QSPanelController getQSPanelController() { + return mQSPanelController; + } + public QSPanel getQsPanel() { - return mQSPanel; + return mQSPanelController.getView(); } public QSCustomizer getCustomizer() { @@ -327,7 +331,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca @Override public boolean isShowingDetail() { - return mQSPanel.isShowingCustomize() || mQSDetail.isShowingDetail(); + return mQSPanelController.isShowingCustomize() || mQSDetail.isShowingDetail(); } @Override @@ -339,7 +343,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca public void setExpanded(boolean expanded) { if (DEBUG) Log.d(TAG, "setExpanded " + expanded); mQsExpanded = expanded; - mQSPanel.setListening(mListening, mQsExpanded); + mQSPanelController.setListening(mListening, mQsExpanded); updateQsState(); } @@ -368,7 +372,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca mListening = listening; mQSContainerImplController.setListening(listening); mFooter.setListening(listening); - mQSPanel.setListening(mListening, mQsExpanded); + mQSPanelController.setListening(mListening, mQsExpanded); } @Override @@ -406,11 +410,15 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca float panelTranslationY = translationScaleY * heightDiff; // Let the views animate their contents correctly by giving them the necessary context. - mHeader.setExpansion(onKeyguardAndExpanded, expansion, - panelTranslationY); + mHeader.setExpansion(onKeyguardAndExpanded, expansion, panelTranslationY); + if (expansion < 1 && expansion > 0.99) { + if (mQuickQSPanelController.switchTileLayout(false)) { + mHeader.updateResources(); + } + } mFooter.setExpansion(onKeyguardAndExpanded ? 1 : expansion); - mQSPanel.getQsTileRevealController().setExpansion(expansion); - mQSPanel.getTileLayout().setExpansion(expansion); + mQSPanelController.getQsTileRevealController().setExpansion(expansion); + mQSPanelController.getTileLayout().setExpansion(expansion); mQSPanelScrollView.setTranslationY(translationScaleY * heightDiff); if (fullyCollapsed) { mQSPanelScrollView.setScrollY(0); @@ -448,7 +456,8 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca float expandedMediaPosition = absoluteBottomPosition - mQSPanelScrollView.getScrollY() + mQSPanelScrollView.getScrollRange(); // The expanded media host should never move below the laid out position - pinToBottom(expandedMediaPosition, mQSPanel.getMediaHost(), true /* expanded */); + pinToBottom( + expandedMediaPosition, mQSPanelController.getMediaHost(), true /* expanded */); // The expanded media host should never move above the laid out position pinToBottom(absoluteBottomPosition, mHeader.getHeaderQsPanel().getMediaHost(), false /* expanded */); @@ -538,7 +547,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca @Override public void closeDetail() { - mQSPanel.closeDetail(); + mQSPanelController.closeDetail(); } public void notifyCustomizeChanged() { @@ -553,8 +562,8 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca } /** - * The height this view wants to be. This is different from {@link #getMeasuredHeight} such that - * during closing the detail panel, this already returns the smaller height. + * The height this view wants to be. This is different from {@link View#getMeasuredHeight} such + * that during closing the detail panel, this already returns the smaller height. */ @Override public int getDesiredHeight() { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index efe46096239f..1b17a2a277f2 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -22,11 +22,9 @@ import static com.android.systemui.util.Utils.useQsMediaPlayer; import android.annotation.NonNull; import android.annotation.Nullable; -import android.content.ComponentName; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; -import android.metrics.LogMaker; import android.os.Bundle; import android.os.Handler; import android.os.Message; @@ -43,41 +41,30 @@ import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.widget.RemeasuringLinearLayout; import com.android.systemui.Dependency; -import com.android.systemui.Dumpable; import com.android.systemui.R; -import com.android.systemui.broadcast.BroadcastDispatcher; -import com.android.systemui.dump.DumpManager; import com.android.systemui.media.MediaHierarchyManager; import com.android.systemui.media.MediaHost; import com.android.systemui.plugins.qs.DetailAdapter; import com.android.systemui.plugins.qs.QSTile; -import com.android.systemui.plugins.qs.QSTileView; -import com.android.systemui.qs.QSHost.Callback; import com.android.systemui.qs.customize.QSCustomizer; -import com.android.systemui.qs.external.CustomTile; import com.android.systemui.qs.logging.QSLogger; -import com.android.systemui.settings.BrightnessController; import com.android.systemui.settings.ToggleSliderView; -import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.policy.BrightnessMirrorController; import com.android.systemui.statusbar.policy.BrightnessMirrorController.BrightnessMirrorListener; import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService.Tunable; import com.android.systemui.util.animation.DisappearParameters; -import java.io.FileDescriptor; -import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collection; +import java.util.List; import java.util.function.Consumer; -import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Named; /** View that represents the quick settings tile panel (when expanded/pulled down). **/ -public class QSPanel extends LinearLayout implements Tunable, Callback, BrightnessMirrorListener, - Dumpable { +public class QSPanel extends LinearLayout implements Tunable, BrightnessMirrorListener { public static final String QS_SHOW_BRIGHTNESS = "qs_show_brightness"; public static final String QS_SHOW_HEADER = "qs_show_header"; @@ -85,20 +72,15 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne private static final String TAG = "QSPanel"; protected final Context mContext; - protected final ArrayList<TileRecord> mRecords = new ArrayList<>(); - private final BroadcastDispatcher mBroadcastDispatcher; protected final MediaHost mMediaHost; /** * The index where the content starts that needs to be moved between parents */ private final int mMovableContentStartIndex; - private String mCachedSpecs = ""; @Nullable protected View mBrightnessView; - @Nullable - private BrightnessController mBrightnessController; private final H mHandler = new H(); private final MetricsLogger mMetricsLogger = Dependency.get(MetricsLogger.class); @@ -112,14 +94,14 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne protected boolean mListening; private QSDetail.Callback mCallback; - private final DumpManager mDumpManager; private final QSLogger mQSLogger; protected final UiEventLogger mUiEventLogger; protected QSTileHost mHost; - private final UserTracker mUserTracker; + private final List<OnConfigurationChangedListener> mOnConfigurationChangedListeners = + new ArrayList<>(); @Nullable - protected QSSecurityFooter mSecurityFooter; + protected View mSecurityFooter; @Nullable protected View mFooter; @@ -156,12 +138,9 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne public QSPanel( @Named(VIEW_CONTEXT) Context context, AttributeSet attrs, - DumpManager dumpManager, - BroadcastDispatcher broadcastDispatcher, QSLogger qsLogger, @Named(QS_PANEL) MediaHost mediaHost, - UiEventLogger uiEventLogger, - UserTracker userTracker + UiEventLogger uiEventLogger ) { super(context, attrs); mUsingMediaPlayer = useQsMediaPlayer(context); @@ -174,16 +153,14 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne }); mContext = context; mQSLogger = qsLogger; - mDumpManager = dumpManager; - mBroadcastDispatcher = broadcastDispatcher; mUiEventLogger = uiEventLogger; - mUserTracker = userTracker; setOrientation(VERTICAL); addViewsAboveTiles(); mMovableContentStartIndex = getChildCount(); mRegularTileLayout = createRegularTileLayout(); + mTileLayout = mRegularTileLayout; if (mUsingMediaPlayer) { mHorizontalLinearLayout = new RemeasuringLinearLayout(mContext); @@ -209,35 +186,27 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne initMediaHostState(); } - addSecurityFooter(); if (mRegularTileLayout instanceof PagedTileLayout) { mQsTileRevealController = new QSTileRevealController(mContext, this, (PagedTileLayout) mRegularTileLayout); } - mQSLogger.logAllTilesChangeListening(mListening, getDumpableTag(), mCachedSpecs); - updateResources(); + mQSLogger.logAllTilesChangeListening(mListening, getDumpableTag(), ""); } protected void onMediaVisibilityChanged(Boolean visible) { - switchTileLayout(); if (mMediaVisibilityChangedListener != null) { mMediaVisibilityChangedListener.accept(visible); } } - protected void addSecurityFooter() { - mSecurityFooter = new QSSecurityFooter(this, mContext, mUserTracker); - } - protected void addViewsAboveTiles() { mBrightnessView = LayoutInflater.from(mContext).inflate( R.layout.quick_settings_brightness_dialog, this, false); addView(mBrightnessView); - mBrightnessController = new BrightnessController(getContext(), - findViewById(R.id.brightness_slider), mBroadcastDispatcher); } - protected QSTileLayout createRegularTileLayout() { + /** */ + public QSTileLayout createRegularTileLayout() { if (mRegularTileLayout == null) { mRegularTileLayout = (QSTileLayout) LayoutInflater.from(mContext).inflate( R.layout.qs_paged_tile_layout, this, false); @@ -337,37 +306,10 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne } @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - final TunerService tunerService = Dependency.get(TunerService.class); - tunerService.addTunable(this, QS_SHOW_BRIGHTNESS); - - if (mHost != null) { - setTiles(mHost.getTiles()); - } - if (mBrightnessMirrorController != null) { - mBrightnessMirrorController.addCallback(this); - } - mDumpManager.registerDumpable(getDumpableTag(), this); - } - - @Override protected void onDetachedFromWindow() { - Dependency.get(TunerService.class).removeTunable(this); - if (mHost != null) { - mHost.removeCallback(this); - } if (mTileLayout != null) { mTileLayout.setListening(false); } - for (TileRecord record : mRecords) { - record.tile.removeCallbacks(); - } - mRecords.clear(); - if (mBrightnessMirrorController != null) { - mBrightnessMirrorController.removeCallback(this); - } - mDumpManager.unregisterDumpable(getDumpableTag()); super.onDetachedFromWindow(); } @@ -376,11 +318,6 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne } @Override - public void onTilesChanged() { - setTiles(mHost.getTiles()); - } - - @Override public void onTuningChanged(String key, String newValue) { if (QS_SHOW_BRIGHTNESS.equals(key) && mBrightnessView != null) { updateViewVisibilityForTuningValue(mBrightnessView, newValue); @@ -391,8 +328,8 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne view.setVisibility(TunerService.parseIntegerSwitch(newValue, true) ? VISIBLE : GONE); } - public void openDetails(String subPanel) { - QSTile tile = getTile(subPanel); + /** */ + public void openDetails(QSTile tile) { // If there's no tile with that name (as defined in QSFactoryImpl or other QSFactory), // QSFactory will not be able to create a tile and getTile will return null if (tile != null) { @@ -400,15 +337,6 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne } } - private QSTile getTile(String subPanel) { - for (int i = 0; i < mRecords.size(); i++) { - if (subPanel.equals(mRecords.get(i).tile.getTileSpec())) { - return mRecords.get(i).tile; - } - } - return mHost.createTile(subPanel); - } - public void setBrightnessMirror(BrightnessMirrorController c) { if (mBrightnessMirrorController != null) { mBrightnessMirrorController.removeCallback(this); @@ -434,17 +362,8 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne mCallback = callback; } - public void setHost(QSTileHost host, QSCustomizer customizer) { - mHost = host; - mHost.addCallback(this); - setTiles(mHost.getTiles()); - if (mSecurityFooter != null) { - mSecurityFooter.setHostEnvironment(host); - } + void setCustomizer(QSCustomizer customizer) { mCustomizePanel = customizer; - if (mCustomizePanel != null) { - mCustomizePanel.setHost(mHost); - } } /** @@ -483,9 +402,6 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne updatePageIndicator(); - if (mListening) { - refreshAllTiles(); - } if (mTileLayout != null) { mTileLayout.updateResources(); } @@ -506,20 +422,21 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne res.getDimensionPixelSize(R.dimen.qs_panel_padding_bottom)); } + void addOnConfigurationChangedListener(OnConfigurationChangedListener listener) { + mOnConfigurationChangedListeners.add(listener); + } + + void removeOnConfigurationChangedListener(OnConfigurationChangedListener listener) { + mOnConfigurationChangedListeners.remove(listener); + } + @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); - if (mSecurityFooter != null) { - mSecurityFooter.onConfigurationChanged(); - } - updateResources(); + mOnConfigurationChangedListeners.forEach( + listener -> listener.onConfigurationChange(newConfig)); updateBrightnessMirror(); - - if (newConfig.orientation != mLastOrientation) { - mLastOrientation = newConfig.orientation; - switchTileLayout(); - } } @Override @@ -527,14 +444,9 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne super.onFinishInflate(); mFooter = findViewById(R.id.qs_footer); mDivider = findViewById(R.id.divider); - switchTileLayout(true /* force */); - } - - boolean switchTileLayout() { - return switchTileLayout(false /* force */); } - private boolean switchTileLayout(boolean force) { + boolean switchTileLayout(boolean force, List<QSPanelControllerBase.TileRecord> records) { /** Whether or not the QuickQSPanel currently contains a media player. */ boolean horizontal = shouldUseHorizontalLayout(); if (mDivider != null) { @@ -562,13 +474,12 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne reAttachMediaHost(); if (mTileLayout != null) { mTileLayout.setListening(false); - for (TileRecord record : mRecords) { + for (QSPanelControllerBase.TileRecord record : records) { mTileLayout.removeTile(record); record.tile.removeCallback(record.callback); } } mTileLayout = newLayout; - if (mHost != null) setTiles(mHost.getTiles()); newLayout.setListening(mListening); if (needsDynamicRowsAndColumns()) { newLayout.setMinRows(horizontal ? 2 : 1); @@ -617,20 +528,20 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne index++; if (mSecurityFooter != null) { - View view = mSecurityFooter.getView(); - LinearLayout.LayoutParams layoutParams = (LayoutParams) view.getLayoutParams(); + LinearLayout.LayoutParams layoutParams = + (LayoutParams) mSecurityFooter.getLayoutParams(); if (mUsingHorizontalLayout && mHeaderContainer != null) { // Adding the security view to the header, that enables us to avoid scrolling layoutParams.width = 0; layoutParams.weight = 1.6f; - switchToParent(view, mHeaderContainer, 1 /* always in second place */); + switchToParent(mSecurityFooter, mHeaderContainer, 1 /* always in second place */); } else { layoutParams.width = LayoutParams.WRAP_CONTENT; layoutParams.weight = 0; - switchToParent(view, parent, index); + switchToParent(mSecurityFooter, parent, index); index++; } - view.setLayoutParams(layoutParams); + mSecurityFooter.setLayoutParams(layoutParams); } if (mFooter != null) { @@ -703,14 +614,6 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne if (!mExpanded && mTileLayout instanceof PagedTileLayout) { ((PagedTileLayout) mTileLayout).setCurrentItem(0, false); } - mMetricsLogger.visibility(MetricsEvent.QS_PANEL, mExpanded); - if (!mExpanded) { - mUiEventLogger.log(closePanelEvent()); - closeDetail(); - } else { - mUiEventLogger.log(openPanelEvent()); - logTiles(); - } } public void setPageListener(final PagedTileLayout.PageListener pageListener) { @@ -723,56 +626,16 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne return mExpanded; } - public void setListening(boolean listening) { + /** */ + public void setListening(boolean listening, String cachedSpecs) { if (mListening == listening) return; mListening = listening; if (mTileLayout != null) { - mQSLogger.logAllTilesChangeListening(listening, getDumpableTag(), mCachedSpecs); + mQSLogger.logAllTilesChangeListening(listening, getDumpableTag(), cachedSpecs); mTileLayout.setListening(listening); } - if (mListening) { - refreshAllTiles(); - } } - private String getTilesSpecs() { - return mRecords.stream() - .map(tileRecord -> tileRecord.tile.getTileSpec()) - .collect(Collectors.joining(",")); - } - - public void setListening(boolean listening, boolean expanded) { - setListening(listening && expanded); - if (mSecurityFooter != null) { - mSecurityFooter.setListening(listening); - } - // Set the listening as soon as the QS fragment starts listening regardless of the expansion, - // so it will update the current brightness before the slider is visible. - setBrightnessListening(listening); - } - - public void setBrightnessListening(boolean listening) { - if (mBrightnessController == null) { - return; - } - if (listening) { - mBrightnessController.registerCallbacks(); - } else { - mBrightnessController.unregisterCallbacks(); - } - } - - public void refreshAllTiles() { - if (mBrightnessController != null) { - mBrightnessController.checkRestrictionAndSetEnabled(); - } - for (TileRecord r : mRecords) { - r.tile.refreshState(); - } - if (mSecurityFooter != null) { - mSecurityFooter.refreshState(); - } - } public void showDetailAdapter(boolean show, DetailAdapter adapter, int[] locationInWindow) { int xInWindow = locationInWindow[0]; @@ -794,33 +657,10 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne mHandler.obtainMessage(H.SHOW_DETAIL, show ? 1 : 0, 0, r).sendToTarget(); } - public void setTiles(Collection<QSTile> tiles) { - setTiles(tiles, false); - } - - public void setTiles(Collection<QSTile> tiles, boolean collapsedView) { - if (!collapsedView) { - mQsTileRevealController.updateRevealedTiles(tiles); - } - for (TileRecord record : mRecords) { - mTileLayout.removeTile(record); - record.tile.removeCallback(record.callback); - } - mRecords.clear(); - mCachedSpecs = ""; - for (QSTile tile : tiles) { - addTile(tile, collapsedView); - } - } - - protected void drawTile(TileRecord r, QSTile.State state) { + protected void drawTile(QSPanelControllerBase.TileRecord r, QSTile.State state) { r.tileView.onStateChanged(state); } - protected QSTileView createTileView(QSTile tile, boolean collapsedView) { - return mHost.createTileView(tile, collapsedView); - } - protected QSEvent openPanelEvent() { return QSEvent.QS_PANEL_EXPANDED; } @@ -837,14 +677,15 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne return mExpanded; } - protected TileRecord addTile(final QSTile tile, boolean collapsedView) { - final TileRecord r = new TileRecord(); - r.tile = tile; - r.tileView = createTileView(tile, collapsedView); + void updateRevealedTiles(Collection<QSTile> tiles) { + mQsTileRevealController.updateRevealedTiles(tiles); + } + + void addTile(QSPanelControllerBase.TileRecord tileRecord) { final QSTile.Callback callback = new QSTile.Callback() { @Override public void onStateChanged(QSTile.State state) { - drawTile(r, state); + drawTile(tileRecord, state); } @Override @@ -852,22 +693,22 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne // Both the collapsed and full QS panels get this callback, this check determines // which one should handle showing the detail. if (shouldShowDetail()) { - QSPanel.this.showDetail(show, r); + QSPanel.this.showDetail(show, tileRecord); } } @Override public void onToggleStateChanged(boolean state) { - if (mDetailRecord == r) { + if (mDetailRecord == tileRecord) { fireToggleStateChanged(state); } } @Override public void onScanStateChanged(boolean state) { - r.scanState = state; - if (mDetailRecord == r) { - fireScanStateChanged(r.scanState); + tileRecord.scanState = state; + if (mDetailRecord == tileRecord) { + fireScanStateChanged(tileRecord.scanState); } } @@ -879,20 +720,20 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne } } }; - r.tile.addCallback(callback); - r.callback = callback; - r.tileView.init(r.tile); - r.tile.refreshState(); - mRecords.add(r); - mCachedSpecs = getTilesSpecs(); + + tileRecord.tile.addCallback(callback); + tileRecord.callback = callback; + tileRecord.tileView.init(tileRecord.tile); + tileRecord.tile.refreshState(); if (mTileLayout != null) { - mTileLayout.addTile(r); + mTileLayout.addTile(tileRecord); } - - return r; } + void removeTile(QSPanelControllerBase.TileRecord tileRecord) { + mTileLayout.removeTile(tileRecord); + } public void showEdit(final View v) { v.post(new Runnable() { @@ -925,8 +766,8 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne } protected void handleShowDetail(Record r, boolean show) { - if (r instanceof TileRecord) { - handleShowDetailTile((TileRecord) r, show); + if (r instanceof QSPanelControllerBase.TileRecord) { + handleShowDetailTile((QSPanelControllerBase.TileRecord) r, show); } else { int x = 0; int y = 0; @@ -938,7 +779,7 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne } } - private void handleShowDetailTile(TileRecord r, boolean show) { + private void handleShowDetailTile(QSPanelControllerBase.TileRecord r, boolean show) { if ((mDetailRecord != null) == show && mDetailRecord == r) return; if (show) { @@ -959,8 +800,8 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne protected void setDetailRecord(Record r) { if (r == mDetailRecord) return; mDetailRecord = r; - final boolean scanState = mDetailRecord instanceof TileRecord - && ((TileRecord) mDetailRecord).scanState; + final boolean scanState = mDetailRecord instanceof QSPanelControllerBase.TileRecord + && ((QSPanelControllerBase.TileRecord) mDetailRecord).scanState; fireScanStateChanged(scanState); } @@ -972,15 +813,6 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne } mGridContentVisible = visible; } - - private void logTiles() { - for (int i = 0; i < mRecords.size(); i++) { - QSTile tile = mRecords.get(i).tile; - mMetricsLogger.write(tile.populate(new LogMaker(tile.getMetricsCategory()) - .setType(MetricsEvent.TYPE_OPEN))); - } - } - private void fireShowingDetail(DetailAdapter detail, int x, int y) { if (mCallback != null) { mCallback.onShowingDetail(detail, x, y); @@ -999,46 +831,15 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne } } - public void clickTile(ComponentName tile) { - final String spec = CustomTile.toSpec(tile); - final int N = mRecords.size(); - for (int i = 0; i < N; i++) { - if (mRecords.get(i).tile.getTileSpec().equals(spec)) { - mRecords.get(i).tile.click(); - break; - } - } - } - QSTileLayout getTileLayout() { return mTileLayout; } - QSTileView getTileView(QSTile tile) { - for (TileRecord r : mRecords) { - if (r.tile == tile) { - return r.tileView; - } - } - return null; - } - - @Nullable - public QSSecurityFooter getSecurityFooter() { - return mSecurityFooter; - } - @Nullable public View getDivider() { return mDivider; } - public void showDeviceMonitoringDialog() { - if (mSecurityFooter != null) { - mSecurityFooter.showDeviceMonitoringDialog(); - } - } - public void setContentMargins(int startMargin, int endMargin) { // Only some views actually want this content padding, others want to go all the way // to the edge like the brightness slider @@ -1121,9 +922,11 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne */ protected void updateMargins(View view, int start, int end) { LayoutParams lp = (LayoutParams) view.getLayoutParams(); - lp.setMarginStart(start); - lp.setMarginEnd(end); - view.setLayoutParams(lp); + if (lp != null) { + lp.setMarginStart(start); + lp.setMarginEnd(end); + view.setLayoutParams(lp); + } } public MediaHost getMediaHost() { @@ -1141,6 +944,14 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne mMediaVisibilityChangedListener = visibilityChangedListener; } + public boolean isListening() { + return mListening; + } + + public void setSecurityFooter(View view) { + mSecurityFooter = view; + } + private class H extends Handler { private static final int SHOW_DETAIL = 1; private static final int SET_TILE_VISIBILITY = 2; @@ -1156,46 +967,32 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne } } - @Override - public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { - pw.println(getClass().getSimpleName() + ":"); - pw.println(" Tile records:"); - for (TileRecord record : mRecords) { - if (record.tile instanceof Dumpable) { - pw.print(" "); ((Dumpable) record.tile).dump(fd, pw, args); - pw.print(" "); pw.println(record.tileView.toString()); - } - } - } - - protected static class Record { DetailAdapter detailAdapter; int x; int y; } - public static final class TileRecord extends Record { - public QSTile tile; - public com.android.systemui.plugins.qs.QSTileView tileView; - public boolean scanState; - public QSTile.Callback callback; - } - public interface QSTileLayout { - + /** */ default void saveInstanceState(Bundle outState) {} + /** */ default void restoreInstanceState(Bundle savedInstanceState) {} - void addTile(TileRecord tile); + /** */ + void addTile(QSPanelControllerBase.TileRecord tile); - void removeTile(TileRecord tile); + /** */ + void removeTile(QSPanelControllerBase.TileRecord tile); - int getOffsetTop(TileRecord tile); + /** */ + int getOffsetTop(QSPanelControllerBase.TileRecord tile); + /** */ boolean updateResources(); + /** */ void setListening(boolean listening); /** @@ -1222,4 +1019,8 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne int getNumVisibleTiles(); } + + interface OnConfigurationChangedListener { + void onConfigurationChange(Configuration newConfig); + } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java new file mode 100644 index 000000000000..f222b0d1ccc0 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java @@ -0,0 +1,201 @@ +/* + * Copyright (C) 2020 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.systemui.qs; + +import static com.android.systemui.qs.QSPanel.QS_SHOW_BRIGHTNESS; + +import android.annotation.NonNull; +import android.content.res.Configuration; +import android.view.View; +import android.view.ViewGroup; + +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.UiEventLogger; +import com.android.systemui.R; +import com.android.systemui.dump.DumpManager; +import com.android.systemui.media.MediaHost; +import com.android.systemui.plugins.qs.QSTile; +import com.android.systemui.qs.customize.QSCustomizer; +import com.android.systemui.qs.dagger.QSScope; +import com.android.systemui.settings.BrightnessController; +import com.android.systemui.statusbar.policy.BrightnessMirrorController; +import com.android.systemui.tuner.TunerService; + +import javax.inject.Inject; + +/** + * Controller for {@link QSPanel}. + */ +@QSScope +public class QSPanelController extends QSPanelControllerBase<QSPanel> { + private final QSSecurityFooter mQsSecurityFooter; + private final TunerService mTunerService; + private final BrightnessController mBrightnessController; + + private final QSPanel.OnConfigurationChangedListener mOnConfigurationChangedListener = + new QSPanel.OnConfigurationChangedListener() { + @Override + public void onConfigurationChange(Configuration newConfig) { + mView.updateResources(); + mQsSecurityFooter.onConfigurationChanged(); + if (mView.isListening()) { + refreshAllTiles(); + } + } + }; + private BrightnessMirrorController mBrightnessMirrorController; + + @Inject + QSPanelController(QSPanel view, QSSecurityFooter qsSecurityFooter, TunerService tunerService, + QSTileHost qstileHost, DumpManager dumpManager, + MetricsLogger metricsLogger, UiEventLogger uiEventLogger, + BrightnessController.Factory brightnessControllerFactory) { + super(view, qstileHost, metricsLogger, uiEventLogger, dumpManager); + mQsSecurityFooter = qsSecurityFooter; + mTunerService = tunerService; + mQsSecurityFooter.setHostEnvironment(qstileHost); + mBrightnessController = brightnessControllerFactory.create( + mView.findViewById(R.id.brightness_slider)); + } + + @Override + protected void onViewAttached() { + super.onViewAttached(); + mTunerService.addTunable(mView, QS_SHOW_BRIGHTNESS); + mView.updateResources(); + if (mView.isListening()) { + refreshAllTiles(); + } + mView.addOnConfigurationChangedListener(mOnConfigurationChangedListener); + mView.setSecurityFooter(mQsSecurityFooter.getView()); + switchTileLayout(true); + if (mBrightnessMirrorController != null) { + mBrightnessMirrorController.addCallback(mView); + } + } + + @Override + protected void onViewDetached() { + mTunerService.removeTunable(mView); + mView.removeOnConfigurationChangedListener(mOnConfigurationChangedListener); + if (mBrightnessMirrorController != null) { + mBrightnessMirrorController.removeCallback(mView); + } + super.onViewDetached(); + } + + /** TODO(b/168904199): Remove this method once view is controllerized. */ + QSPanel getView() { + return mView; + } + + /** + * Set the header container of quick settings. + */ + public void setHeaderContainer(@NonNull ViewGroup headerContainer) { + mView.setHeaderContainer(headerContainer); + } + + public QSPanel.QSTileLayout getTileLayout() { + return mView.getTileLayout(); + } + + /** */ + public void setCustomizer(QSCustomizer customizer) { + mView.setCustomizer(customizer); + } + + /** */ + public boolean isShowingCustomize() { + return mView.isShowingCustomize(); + } + + /** */ + public void setVisibility(int visibility) { + mView.setVisibility(visibility); + } + + /** */ + public void setListening(boolean listening, boolean expanded) { + setListening(listening && expanded); + if (mView.isListening()) { + refreshAllTiles(); + } + + mQsSecurityFooter.setListening(listening); + + // Set the listening as soon as the QS fragment starts listening regardless of the + //expansion, so it will update the current brightness before the slider is visible. + if (listening) { + mBrightnessController.registerCallbacks(); + } else { + mBrightnessController.unregisterCallbacks(); + } + } + + /** */ + public QSTileRevealController getQsTileRevealController() { + return mView.getQsTileRevealController(); + } + + /** */ + public MediaHost getMediaHost() { + return mView.getMediaHost(); + } + + /** */ + public void setBrightnessMirror(BrightnessMirrorController brightnessMirrorController) { + mBrightnessMirrorController = brightnessMirrorController; + mView.setBrightnessMirror(brightnessMirrorController); + } + + /** Get the QSTileHost this panel uses. */ + public QSTileHost getHost() { + return mHost; + } + + + /** Open the details for a specific tile.. */ + public void openDetails(String subPanel) { + QSTile tile = getTile(subPanel); + if (tile != null) { + mView.openDetails(tile); + } + } + + /** Show the device monitoring dialog. */ + public void showDeviceMonitoringDialog() { + mQsSecurityFooter.showDeviceMonitoringDialog(); + } + + /** Update appearance of QSPanel. */ + public void updateResources() { + mView.updateResources(); + } + + /** Update state of all tiles. */ + public void refreshAllTiles() { + mBrightnessController.checkRestrictionAndSetEnabled(); + super.refreshAllTiles(); + mQsSecurityFooter.refreshState(); + } + + /** Start customizing the Quick Settings. */ + public void showEdit(View view) { + mView.showEdit(view); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java new file mode 100644 index 000000000000..fe92827806c6 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java @@ -0,0 +1,250 @@ +/* + * Copyright (C) 2020 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.systemui.qs; + +import static com.android.internal.logging.nano.MetricsProto.MetricsEvent; + +import android.content.ComponentName; +import android.content.res.Configuration; +import android.metrics.LogMaker; + +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.UiEventLogger; +import com.android.systemui.Dumpable; +import com.android.systemui.dump.DumpManager; +import com.android.systemui.media.MediaHost; +import com.android.systemui.plugins.qs.QSTile; +import com.android.systemui.plugins.qs.QSTileView; +import com.android.systemui.qs.external.CustomTile; +import com.android.systemui.util.ViewController; + +import java.io.FileDescriptor; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.Collection; +import java.util.stream.Collectors; + +/** + * Controller for QSPanel views. + * + * @param <T> Type of QSPanel. + */ +public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewController<T> + implements Dumpable{ + protected final QSTileHost mHost; + private final MediaHost mMediaHost; + private final MetricsLogger mMetricsLogger; + private final UiEventLogger mUiEventLogger; + private final DumpManager mDumpManager; + protected final ArrayList<TileRecord> mRecords = new ArrayList<>(); + + private int mLastOrientation; + + private final QSHost.Callback mQSHostCallback = this::setTiles; + + private final QSPanel.OnConfigurationChangedListener mOnConfigurationChangedListener = + new QSPanel.OnConfigurationChangedListener() { + @Override + public void onConfigurationChange(Configuration newConfig) { + if (newConfig.orientation != mLastOrientation) { + mLastOrientation = newConfig.orientation; + switchTileLayout(false); + } + } + }; + private String mCachedSpecs = ""; + + protected QSPanelControllerBase(T view, QSTileHost host, + MetricsLogger metricsLogger, UiEventLogger uiEventLogger, DumpManager dumpManager) { + super(view); + mHost = host; + mMediaHost = mView.getMediaHost(); + mMetricsLogger = metricsLogger; + mUiEventLogger = uiEventLogger; + mDumpManager = dumpManager; + } + + @Override + protected void onViewAttached() { + mView.addOnConfigurationChangedListener(mOnConfigurationChangedListener); + mHost.addCallback(mQSHostCallback); + mMediaHost.addVisibilityChangeListener(aBoolean -> { + switchTileLayout(false); + return null; + }); + setTiles(); + switchTileLayout(true); + mDumpManager.registerDumpable(mView.getDumpableTag(), this); + } + + @Override + protected void onViewDetached() { + mView.removeOnConfigurationChangedListener(mOnConfigurationChangedListener); + mHost.removeCallback(mQSHostCallback); + + for (TileRecord record : mRecords) { + record.tile.removeCallbacks(); + } + mRecords.clear(); + mDumpManager.unregisterDumpable(mView.getDumpableTag()); + } + + /** */ + public void setTiles() { + setTiles(mHost.getTiles(), false); + } + + /** */ + public void setTiles(Collection<QSTile> tiles, boolean collapsedView) { + if (!collapsedView) { + mView.updateRevealedTiles(tiles); + } + for (QSPanelControllerBase.TileRecord record : mRecords) { + mView.removeTile(record); + record.tile.removeCallback(record.callback); + } + mRecords.clear(); + mCachedSpecs = ""; + for (QSTile tile : tiles) { + addTile(tile, collapsedView); + } + } + + /** */ + public void refreshAllTiles() { + for (QSPanelControllerBase.TileRecord r : mRecords) { + r.tile.refreshState(); + } + } + + private void addTile(final QSTile tile, boolean collapsedView) { + final TileRecord r = new TileRecord(); + r.tile = tile; + r.tileView = mHost.createTileView(tile, collapsedView); + mView.addTile(r); + mRecords.add(r); + mCachedSpecs = getTilesSpecs(); + + } + + /** */ + public void clickTile(ComponentName tile) { + final String spec = CustomTile.toSpec(tile); + for (TileRecord record : mRecords) { + if (record.tile.getTileSpec().equals(spec)) { + record.tile.click(); + break; + } + } + } + protected QSTile getTile(String subPanel) { + for (int i = 0; i < mRecords.size(); i++) { + if (subPanel.equals(mRecords.get(i).tile.getTileSpec())) { + return mRecords.get(i).tile; + } + } + return mHost.createTile(subPanel); + } + + + QSTileView getTileView(QSTile tile) { + for (QSPanelControllerBase.TileRecord r : mRecords) { + if (r.tile == tile) { + return r.tileView; + } + } + return null; + } + + private String getTilesSpecs() { + return mRecords.stream() + .map(tileRecord -> tileRecord.tile.getTileSpec()) + .collect(Collectors.joining(",")); + } + + + /** */ + public void setExpanded(boolean expanded) { + mView.setExpanded(expanded); + mMetricsLogger.visibility(MetricsEvent.QS_PANEL, expanded); + if (!expanded) { + mUiEventLogger.log(mView.closePanelEvent()); + closeDetail(); + } else { + mUiEventLogger.log(mView.openPanelEvent()); + logTiles(); + } + } + + /** */ + public void closeDetail() { + mView.closeDetail(); + } + + /** */ + public void openDetails(String subPanel) { + QSTile tile = getTile(subPanel); + // If there's no tile with that name (as defined in QSFactoryImpl or other QSFactory), + // QSFactory will not be able to create a tile and getTile will return null + if (tile != null) { + mView.showDetailAdapter( + true, tile.getDetailAdapter(), new int[]{mView.getWidth() / 2, 0}); + } + } + + + void setListening(boolean listening) { + mView.setListening(listening, mCachedSpecs); + } + + boolean switchTileLayout(boolean force) { + if (mView.switchTileLayout(force, mRecords)) { + setTiles(); + return true; + } + return false; + } + + private void logTiles() { + for (int i = 0; i < mRecords.size(); i++) { + QSTile tile = mRecords.get(i).tile; + mMetricsLogger.write(tile.populate(new LogMaker(tile.getMetricsCategory()) + .setType(MetricsEvent.TYPE_OPEN))); + } + } + + + @Override + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + pw.println(getClass().getSimpleName() + ":"); + pw.println(" Tile records:"); + for (QSPanelControllerBase.TileRecord record : mRecords) { + if (record.tile instanceof Dumpable) { + pw.print(" "); ((Dumpable) record.tile).dump(fd, pw, args); + pw.print(" "); pw.println(record.tileView.toString()); + } + } + } + + /** */ + public static final class TileRecord extends QSPanel.Record { + public QSTile tile; + public com.android.systemui.plugins.qs.QSTileView tileView; + public boolean scanState; + public QSTile.Callback callback; + } +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java index 0891972c11d2..c90182b15da6 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java @@ -44,11 +44,15 @@ import com.android.systemui.Dependency; import com.android.systemui.FontSizeUtils; import com.android.systemui.R; import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.qs.dagger.QSScope; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.phone.SystemUIDialog; import com.android.systemui.statusbar.policy.SecurityController; -public class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListener { +import javax.inject.Inject; + +@QSScope +class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListener { protected static final String TAG = "QSSecurityFooter"; protected static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private static final boolean DEBUG_FORCE_VISIBLE = false; @@ -72,12 +76,13 @@ public class QSSecurityFooter implements OnClickListener, DialogInterface.OnClic private int mFooterTextId; private int mFooterIconId; + @Inject public QSSecurityFooter(QSPanel qsPanel, Context context, UserTracker userTracker) { mRootView = LayoutInflater.from(context) .inflate(R.layout.quick_settings_footer, qsPanel, false); mRootView.setOnClickListener(this); - mFooterText = (TextView) mRootView.findViewById(R.id.footer_text); - mFooterIcon = (ImageView) mRootView.findViewById(R.id.footer_icon); + mFooterText = mRootView.findViewById(R.id.footer_text); + mFooterIcon = mRootView.findViewById(R.id.footer_icon); mFooterIconId = R.drawable.ic_info_outline; mContext = context; mMainHandler = new Handler(Looper.myLooper()); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileRevealController.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileRevealController.java index 2f012e6e608e..3d4a417abf2e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTileRevealController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileRevealController.java @@ -8,11 +8,16 @@ import android.util.ArraySet; import com.android.systemui.Prefs; import com.android.systemui.plugins.qs.QSTile; +import com.android.systemui.qs.dagger.QSScope; import java.util.Collection; import java.util.Collections; import java.util.Set; +import javax.inject.Inject; + +/** */ +@QSScope public class QSTileRevealController { private static final long QS_REVEAL_TILES_DELAY = 500L; @@ -34,6 +39,7 @@ public class QSTileRevealController { } }; + @Inject QSTileRevealController(Context context, QSPanel qsPanel, PagedTileLayout pagedTileLayout) { mContext = context; mQSPanel = qsPanel; diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java index 82cb8639e9ee..84a5b6f0538d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java @@ -28,23 +28,13 @@ import android.view.View; import android.widget.LinearLayout; import com.android.internal.logging.UiEventLogger; -import com.android.systemui.Dependency; import com.android.systemui.R; -import com.android.systemui.broadcast.BroadcastDispatcher; -import com.android.systemui.dump.DumpManager; import com.android.systemui.media.MediaHierarchyManager; import com.android.systemui.media.MediaHost; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.plugins.qs.QSTile.SignalState; import com.android.systemui.plugins.qs.QSTile.State; -import com.android.systemui.qs.customize.QSCustomizer; import com.android.systemui.qs.logging.QSLogger; -import com.android.systemui.settings.UserTracker; -import com.android.systemui.tuner.TunerService; -import com.android.systemui.tuner.TunerService.Tunable; - -import java.util.ArrayList; -import java.util.Collection; import javax.inject.Inject; import javax.inject.Named; @@ -68,15 +58,10 @@ public class QuickQSPanel extends QSPanel { public QuickQSPanel( @Named(VIEW_CONTEXT) Context context, AttributeSet attrs, - DumpManager dumpManager, - BroadcastDispatcher broadcastDispatcher, QSLogger qsLogger, @Named(QUICK_QS_PANEL) MediaHost mediaHost, - UiEventLogger uiEventLogger, - UserTracker userTracker - ) { - super(context, attrs, dumpManager, broadcastDispatcher, qsLogger, mediaHost, uiEventLogger, - userTracker); + UiEventLogger uiEventLogger) { + super(context, attrs, qsLogger, mediaHost, uiEventLogger); sDefaultMaxTiles = getResources().getInteger(R.integer.quick_qs_panel_max_columns); applyBottomMargin((View) mRegularTileLayout); } @@ -89,17 +74,12 @@ public class QuickQSPanel extends QSPanel { } @Override - protected void addSecurityFooter() { - // No footer needed - } - - @Override protected void addViewsAboveTiles() { // Nothing to add above the tiles } @Override - protected TileLayout createRegularTileLayout() { + public TileLayout createRegularTileLayout() { return new QuickQSPanel.HeaderTileLayout(mContext, mUiEventLogger); } @@ -133,18 +113,6 @@ public class QuickQSPanel extends QSPanel { } @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - Dependency.get(TunerService.class).addTunable(mNumTiles, NUM_QUICK_TILES); - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - Dependency.get(TunerService.class).removeTunable(mNumTiles); - } - - @Override protected String getDumpableTag() { return TAG; } @@ -159,7 +127,7 @@ public class QuickQSPanel extends QSPanel { } @Override - protected void drawTile(TileRecord r, State state) { + protected void drawTile(QSPanelControllerBase.TileRecord r, State state) { if (state instanceof SignalState) { SignalState copy = new SignalState(); state.copyTo(copy); @@ -171,17 +139,8 @@ public class QuickQSPanel extends QSPanel { super.drawTile(r, state); } - @Override - public void setHost(QSTileHost host, QSCustomizer customizer) { - super.setHost(host, customizer); - setTiles(mHost.getTiles()); - } - public void setMaxTiles(int maxTiles) { mMaxTiles = maxTiles; - if (mHost != null) { - setTiles(mHost.getTiles()); - } } @Override @@ -192,25 +151,6 @@ public class QuickQSPanel extends QSPanel { } } - @Override - public void setTiles(Collection<QSTile> tiles) { - ArrayList<QSTile> quickTiles = new ArrayList<>(); - for (QSTile tile : tiles) { - quickTiles.add(tile); - if (quickTiles.size() == mMaxTiles) { - break; - } - } - super.setTiles(quickTiles, true); - } - - private final Tunable mNumTiles = new Tunable() { - @Override - public void onTuningChanged(String key, String newValue) { - setMaxTiles(parseNumTiles(newValue)); - } - }; - public int getNumQuickTiles() { return mMaxTiles; } @@ -308,7 +248,7 @@ public class QuickQSPanel extends QSPanel { } @Override - protected void addTileView(TileRecord tile) { + protected void addTileView(QSPanelControllerBase.TileRecord tile) { addView(tile.tileView, getChildCount(), generateTileLayoutParams()); } @@ -371,7 +311,7 @@ public class QuickQSPanel extends QSPanel { private void setAccessibilityOrder() { if (mRecords != null && mRecords.size() > 0) { View previousView = this; - for (TileRecord record : mRecords) { + for (QSPanelControllerBase.TileRecord record : mRecords) { if (record.tileView.getVisibility() == GONE) continue; previousView = record.tileView.updateAccessibilityOrder(previousView); } @@ -383,7 +323,7 @@ public class QuickQSPanel extends QSPanel { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // Measure each QS tile. - for (TileRecord record : mRecords) { + for (QSPanelControllerBase.TileRecord record : mRecords) { if (record.tileView.getVisibility() == GONE) continue; record.tileView.measure(exactly(mCellWidth), exactly(mCellHeight)); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java new file mode 100644 index 000000000000..97b6e99a0390 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2020 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.systemui.qs; + +import static com.android.systemui.qs.QuickQSPanel.NUM_QUICK_TILES; +import static com.android.systemui.qs.QuickQSPanel.parseNumTiles; + +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.UiEventLogger; +import com.android.systemui.dump.DumpManager; +import com.android.systemui.plugins.qs.QSTile; +import com.android.systemui.qs.dagger.QSScope; +import com.android.systemui.tuner.TunerService; +import com.android.systemui.tuner.TunerService.Tunable; + +import java.util.ArrayList; + +import javax.inject.Inject; + +/** Controller for {@link QuickQSPanel}. */ +@QSScope +public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel> { + private final Tunable mNumTiles = + (key, newValue) -> setMaxTiles(parseNumTiles(newValue)); + + private final TunerService mTunerService; + + @Inject + QuickQSPanelController(QuickQSPanel view, TunerService tunerService, QSTileHost qsTileHost, + MetricsLogger metricsLogger, UiEventLogger uiEventLogger, + DumpManager dumpManager) { + super(view, qsTileHost, metricsLogger, uiEventLogger, dumpManager); + mTunerService = tunerService; + } + + @Override + protected void onViewAttached() { + super.onViewAttached(); + mTunerService.addTunable(mNumTiles, NUM_QUICK_TILES); + + } + + @Override + protected void onViewDetached() { + super.onViewDetached(); + mTunerService.removeTunable(mNumTiles); + } + + public boolean isListening() { + return mView.isListening(); + } + + private void setMaxTiles(int parseNumTiles) { + mView.setMaxTiles(parseNumTiles); + setTiles(); + } + + @Override + public void setTiles() { + ArrayList<QSTile> quickTiles = new ArrayList<>(); + for (QSTile tile : mHost.getTiles()) { + quickTiles.add(tile); + if (quickTiles.size() == mView.getNumQuickTiles()) { + break; + } + } + super.setTiles(quickTiles, true); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index a9fbc744b38e..5757602b9d0f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -353,11 +353,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn mPrivacyChip.setExpanded(expansionFraction > 0.5); mPrivacyChipAlphaAnimator.setPosition(keyguardExpansionFraction); } - if (expansionFraction < 1 && expansionFraction > 0.99) { - if (mHeaderQsPanel.switchTileLayout()) { - updateResources(); - } - } + mKeyguardExpansionFraction = keyguardExpansionFraction; } @@ -446,7 +442,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn public void setQSPanel(final QSPanel qsPanel) { //host.setHeaderView(mExpandIndicator); mHeaderQsPanel.setQSPanelAndHeader(qsPanel, this); - mHeaderQsPanel.setHost(qsPanel.getHost(), null /* No customization in header */); Rect tintArea = new Rect(0, 0, 0, 0); int colorForeground = Utils.getColorAttrDefaultColor(getContext(), diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java index 398edd7002ee..febb71c3223b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java @@ -44,6 +44,7 @@ import com.android.systemui.privacy.PrivacyChipEvent; import com.android.systemui.privacy.PrivacyItem; import com.android.systemui.privacy.PrivacyItemController; import com.android.systemui.qs.carrier.QSCarrierGroupController; +import com.android.systemui.qs.dagger.QSScope; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.phone.StatusBarIconController; @@ -64,6 +65,7 @@ import javax.inject.Inject; /** * Controller for {@link QuickStatusBarHeader}. */ +@QSScope class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader> { private static final String TAG = "QuickStatusBarHeader"; @@ -74,7 +76,7 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader private final ActivityStarter mActivityStarter; private final UiEventLogger mUiEventLogger; private final QSCarrierGroupController mQSCarrierGroupController; - private final QuickQSPanel mHeaderQsPanel; + private final QuickQSPanelController mHeaderQsPanelController; private final LifecycleRegistry mLifecycle; private final OngoingPrivacyChip mPrivacyChip; private final Clock mClockView; @@ -203,13 +205,14 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader } }; - private QuickStatusBarHeaderController(QuickStatusBarHeader view, + @Inject + QuickStatusBarHeaderController(QuickStatusBarHeader view, ZenModeController zenModeController, NextAlarmController nextAlarmController, PrivacyItemController privacyItemController, RingerModeTracker ringerModeTracker, ActivityStarter activityStarter, UiEventLogger uiEventLogger, QSTileHost qsTileHost, StatusBarIconController statusBarIconController, CommandQueue commandQueue, DemoModeController demoModeController, - UserTracker userTracker, + UserTracker userTracker, QuickQSPanelController quickQSPanelController, QSCarrierGroupController.Builder qsCarrierGroupControllerBuilder) { super(view); mZenModeController = zenModeController; @@ -224,6 +227,7 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader mDemoModeController = demoModeController; mUserTracker = userTracker; mLifecycle = new LifecycleRegistry(mLifecycleOwner); + mHeaderQsPanelController = quickQSPanelController; mQSCarrierGroupController = qsCarrierGroupControllerBuilder .setQSCarrierGroup(mView.findViewById(R.id.carrier_group)) @@ -231,7 +235,6 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader mPrivacyChip = mView.findViewById(R.id.privacy_chip); - mHeaderQsPanel = mView.findViewById(R.id.quick_qs_panel); mNextAlarmContainer = mView.findViewById(R.id.alarm_container); mClockView = mView.findViewById(R.id.clock); mRingerContainer = mView.findViewById(R.id.ringer_container); @@ -290,8 +293,12 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader } mListening = listening; - mHeaderQsPanel.setListening(listening); - if (mHeaderQsPanel.switchTileLayout()) { + mHeaderQsPanelController.setListening(listening); + if (mHeaderQsPanelController.isListening()) { + mHeaderQsPanelController.refreshAllTiles(); + } + + if (mHeaderQsPanelController.switchTileLayout(false)) { mView.updateResources(); } @@ -380,55 +387,4 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader mClockView.onDemoModeFinished(); } } - - static class Builder { - private final ZenModeController mZenModeController; - private final NextAlarmController mNextAlarmController; - private final PrivacyItemController mPrivacyItemController; - private final RingerModeTracker mRingerModeTracker; - private final ActivityStarter mActivityStarter; - private final UiEventLogger mUiEventLogger; - private final QSTileHost mQsTileHost; - private final StatusBarIconController mStatusBarIconController; - private final CommandQueue mCommandQueue; - private final DemoModeController mDemoModeController; - private final UserTracker mUserTracker; - private final QSCarrierGroupController.Builder mQSCarrierGroupControllerBuilder; - private QuickStatusBarHeader mView; - - @Inject - Builder(ZenModeController zenModeController, NextAlarmController nextAlarmController, - PrivacyItemController privacyItemController, RingerModeTracker ringerModeTracker, - ActivityStarter activityStarter, UiEventLogger uiEventLogger, QSTileHost qsTileHost, - StatusBarIconController statusBarIconController, CommandQueue commandQueue, - DemoModeController demoModeController, UserTracker userTracker, - QSCarrierGroupController.Builder qsCarrierGroupControllerBuilder) { - mZenModeController = zenModeController; - mNextAlarmController = nextAlarmController; - mPrivacyItemController = privacyItemController; - mRingerModeTracker = ringerModeTracker; - mActivityStarter = activityStarter; - mUiEventLogger = uiEventLogger; - mQsTileHost = qsTileHost; - mStatusBarIconController = statusBarIconController; - mCommandQueue = commandQueue; - mDemoModeController = demoModeController; - mUserTracker = userTracker; - mQSCarrierGroupControllerBuilder = qsCarrierGroupControllerBuilder; - } - - public Builder setQuickStatusBarHeader(QuickStatusBarHeader view) { - mView = view; - return this; - } - - - QuickStatusBarHeaderController build() { - return new QuickStatusBarHeaderController(mView, mZenModeController, - mNextAlarmController, mPrivacyItemController, mRingerModeTracker, - mActivityStarter, mUiEventLogger, mQsTileHost, mStatusBarIconController, - mCommandQueue, mDemoModeController, mUserTracker, - mQSCarrierGroupControllerBuilder); - } - } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java index 694492a33524..4ab7afd46602 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java @@ -11,7 +11,7 @@ import android.view.ViewGroup; import com.android.systemui.R; import com.android.systemui.qs.QSPanel.QSTileLayout; -import com.android.systemui.qs.QSPanel.TileRecord; +import com.android.systemui.qs.QSPanelControllerBase.TileRecord; import java.util.ArrayList; diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java index 55b67e061c13..8097958fac39 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java @@ -74,9 +74,9 @@ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListene private final ScreenLifecycle mScreenLifecycle; private final TileQueryHelper mTileQueryHelper; private final View mTransparentView; + private final QSTileHost mHost; private boolean isShown; - private QSTileHost mHost; private RecyclerView mRecyclerView; private TileAdapter mTileAdapter; private Toolbar mToolbar; @@ -95,6 +95,7 @@ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListene KeyguardStateController keyguardStateController, ScreenLifecycle screenLifecycle, TileQueryHelper tileQueryHelper, + QSTileHost qsTileHost, UiEventLogger uiEventLogger) { super(new ContextThemeWrapper(context, R.style.edit_theme), attrs); @@ -139,6 +140,8 @@ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListene mLightBarController = lightBarController; mKeyguardStateController = keyguardStateController; mScreenLifecycle = screenLifecycle; + mHost = qsTileHost; + mTileAdapter.setHost(mHost); updateNavBackDrop(getResources().getConfiguration()); } @@ -170,11 +173,6 @@ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListene mLightBarController.setQsCustomizing(mIsShowingNavBackdrop && isShown); } - public void setHost(QSTileHost host) { - mHost = host; - mTileAdapter.setHost(host); - } - public void setContainer(NotificationsQuickSettingsContainer notificationsQsContainer) { mNotifQsContainer = notificationsQsContainer; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentComponent.java b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentComponent.java new file mode 100644 index 000000000000..51b2c8dfffbd --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentComponent.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2020 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.systemui.qs.dagger; + +import com.android.systemui.qs.QSAnimator; +import com.android.systemui.qs.QSContainerImplController; +import com.android.systemui.qs.QSFooter; +import com.android.systemui.qs.QSFragment; +import com.android.systemui.qs.QSPanelController; +import com.android.systemui.qs.QuickQSPanelController; + +import dagger.BindsInstance; +import dagger.Subcomponent; + +/** + * Dagger Subcomponent for {@link QSFragment}. + */ +@Subcomponent(modules = {QSFragmentModule.class}) +@QSScope +public interface QSFragmentComponent { + /** Factory for building a {@link QSFragmentComponent}. */ + @Subcomponent.Factory + interface Factory { + QSFragmentComponent create(@BindsInstance QSFragment qsFragment); + } + + /** Construct a {@link QSPanelController}. */ + QSPanelController getQSPanelController(); + + /** Construct a {@link QuickQSPanelController}. */ + QuickQSPanelController getQuickQSPanelController(); + + /** Construct a {@link QSAnimator}. */ + QSAnimator getQSAnimator(); + + /** Construct a {@link QSContainerImplController}. */ + QSContainerImplController getQSContainerImplController(); + + /** Construct a {@link QSFooter} */ + QSFooter getQSFooter(); +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java new file mode 100644 index 000000000000..4bf4eff4c27e --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2020 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.systemui.qs.dagger; + +import android.view.View; + +import com.android.systemui.R; +import com.android.systemui.dagger.qualifiers.RootView; +import com.android.systemui.plugins.qs.QS; +import com.android.systemui.qs.QSContainerImpl; +import com.android.systemui.qs.QSFooter; +import com.android.systemui.qs.QSFooterView; +import com.android.systemui.qs.QSFooterViewController; +import com.android.systemui.qs.QSFragment; +import com.android.systemui.qs.QSPanel; +import com.android.systemui.qs.QuickQSPanel; +import com.android.systemui.qs.QuickStatusBarHeader; + +import dagger.Binds; +import dagger.Module; +import dagger.Provides; + +/** + * Dagger Module for {@link QSFragmentComponent}. + */ +@Module +public interface QSFragmentModule { + /** */ + @Provides + @RootView + static View provideRootView(QSFragment qsFragment) { + return qsFragment.getView(); + } + + /** */ + @Provides + static QSPanel provideQSPanel(@RootView View view) { + return view.findViewById(R.id.quick_settings_panel); + } + + /** */ + @Provides + static QSContainerImpl providesQSContainerImpl(@RootView View view) { + return view.findViewById(R.id.quick_settings_container); + } + + /** */ + @Binds + QS bindQS(QSFragment qsFragment); + + /** */ + @Provides + static QuickStatusBarHeader providesQuickStatusBarHeader(@RootView View view) { + return view.findViewById(R.id.header); + } + + /** */ + @Provides + static QuickQSPanel providesQuickQSPanel(QuickStatusBarHeader quickStatusBarHeader) { + return quickStatusBarHeader.findViewById(R.id.quick_qs_panel); + } + + /** */ + @Provides + static QSFooterView providesQSFooterView(@RootView View view) { + return view.findViewById(R.id.qs_footer); + } + + /** */ + @Provides + @QSScope + static QSFooter providesQSFooter(QSFooterViewController qsFooterViewController) { + qsFooterViewController.init(); + return qsFooterViewController; + } +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java index 953de6086ac7..7c799aefe90d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java +++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java @@ -38,8 +38,8 @@ import dagger.Provides; /** * Module for QS dependencies */ -// TODO: Add other QS classes -@Module(includes = {MediaModule.class}) +@Module(subcomponents = {QSFragmentComponent.class}, + includes = {MediaModule.class}) public interface QSModule { @Provides @@ -60,7 +60,6 @@ public interface QSModule { return manager; } - /** */ @Binds QSHost provideQsHost(QSTileHost controllerImpl); diff --git a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSScope.java b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSScope.java new file mode 100644 index 000000000000..f615eabb67dc --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSScope.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2020 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.systemui.qs.dagger; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; + +import javax.inject.Scope; + +/** + * Scope annotation for singleton items within the {@link QSFragmentComponent}. + */ +@Documented +@Retention(RUNTIME) +@Scope +public @interface QSScope {} diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java index 7d697539bf90..818bb9d8d78f 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java @@ -18,8 +18,7 @@ package com.android.systemui.screenshot; import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; -import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; -import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; +import static android.view.Display.DEFAULT_DISPLAY; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -30,6 +29,7 @@ import android.annotation.SuppressLint; import android.app.ActivityManager; import android.app.Notification; import android.app.PendingIntent; +import android.app.WindowContext; import android.content.ComponentName; import android.content.Context; import android.content.res.Configuration; @@ -48,6 +48,7 @@ import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.graphics.drawable.InsetDrawable; import android.graphics.drawable.LayerDrawable; +import android.hardware.display.DisplayManager; import android.media.MediaActionSound; import android.net.Uri; import android.os.Handler; @@ -84,7 +85,6 @@ import android.widget.Toast; import com.android.internal.logging.UiEventLogger; import com.android.systemui.R; import com.android.systemui.dagger.SysUISingleton; -import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.shared.system.QuickStepContract; import java.util.ArrayList; @@ -245,12 +245,20 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset }; @Inject - public GlobalScreenshot( - Context context, @Main Resources resources, + public GlobalScreenshot(Context context, ScreenshotSmartActions screenshotSmartActions, ScreenshotNotificationsController screenshotNotificationsController, UiEventLogger uiEventLogger) { - mContext = context; + + // Create a visual (Window) context + // After this, our windowToken is available from mContext.getActivityToken() + final DisplayManager dm = context.getSystemService(DisplayManager.class); + mDisplay = dm.getDisplay(DEFAULT_DISPLAY); + Context displayContext = context.createDisplayContext(mDisplay); + mContext = new WindowContext( + displayContext, WindowManager.LayoutParams.TYPE_SCREENSHOT, null); + mWindowManager = mContext.getSystemService(WindowManager.class); + mScreenshotSmartActions = screenshotSmartActions; mNotificationsController = screenshotNotificationsController; mUiEventLogger = uiEventLogger; @@ -274,13 +282,13 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, PixelFormat.TRANSLUCENT); mWindowLayoutParams.setTitle("ScreenshotAnimation"); - mWindowLayoutParams.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; + mWindowLayoutParams.layoutInDisplayCutoutMode = + WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; mWindowLayoutParams.setFitInsetsTypes(0 /* types */); - mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); - mDisplay = mWindowManager.getDefaultDisplay(); mDisplayMetrics = new DisplayMetrics(); mDisplay.getRealMetrics(mDisplayMetrics); + final Resources resources = mContext.getResources(); mCornerSizeX = resources.getDimensionPixelSize(R.dimen.global_screenshot_x_scale); mDismissDeltaY = resources.getDimensionPixelSize(R.dimen.screenshot_dismissal_height_delta); @@ -1117,9 +1125,9 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset */ private void setWindowFocusable(boolean focusable) { if (focusable) { - mWindowLayoutParams.flags &= ~FLAG_NOT_FOCUSABLE; + mWindowLayoutParams.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; } else { - mWindowLayoutParams.flags |= FLAG_NOT_FOCUSABLE; + mWindowLayoutParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; } if (mScreenshotLayout.isAttachedToWindow()) { mWindowManager.updateViewLayout(mScreenshotLayout, mWindowLayoutParams); diff --git a/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java b/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java index 1bea72aea2ba..72034f84fd30 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java +++ b/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java @@ -50,6 +50,8 @@ import com.android.systemui.broadcast.BroadcastDispatcher; import java.util.ArrayList; +import javax.inject.Inject; + public class BrightnessController implements ToggleSlider.Listener { private static final String TAG = "StatusBar.BrightnessController"; private static final int SLIDER_ANIMATION_DURATION = 3000; @@ -475,4 +477,20 @@ public class BrightnessController implements ToggleSlider.Listener { mSliderAnimator.start(); } + /** Factory for creating a {@link BrightnessController}. */ + public static class Factory { + private final Context mContext; + private final BroadcastDispatcher mBroadcastDispatcher; + + @Inject + public Factory(Context context, BroadcastDispatcher broadcastDispatcher) { + mContext = context; + mBroadcastDispatcher = broadcastDispatcher; + } + + /** Create a {@link BrightnessController} */ + public BrightnessController create(ToggleSlider toggleSlider) { + return new BrightnessController(mContext, toggleSlider, mBroadcastDispatcher); + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java index 670a65f55844..b7f4e67e48d1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java @@ -68,10 +68,8 @@ public class NotificationHeaderUtil { @Override public void apply(View parent, View view, boolean apply, boolean reset) { NotificationHeaderView header = (NotificationHeaderView) view; - ImageView icon = (ImageView) view.findViewById( - com.android.internal.R.id.icon); - ImageView expand = (ImageView) view.findViewById( - com.android.internal.R.id.expand_button); + ImageView icon = view.findViewById(com.android.internal.R.id.icon); + ImageView expand = view.findViewById(com.android.internal.R.id.expand_button); applyToChild(icon, apply, header.getOriginalIconColor()); applyToChild(expand, apply, header.getOriginalNotificationColor()); } @@ -178,7 +176,7 @@ public class NotificationHeaderUtil { private void sanitizeHeaderViews(ExpandableNotificationRow row) { if (row.isSummaryWithChildren()) { - sanitizeHeader(row.getNotificationHeader()); + sanitizeHeader(row.getNotificationViewWrapper().getNotificationHeader()); return; } final NotificationContentView layout = row.getPrivateLayout(); @@ -275,7 +273,8 @@ public class NotificationHeaderUtil { } public void init() { - mParentView = mParentRow.getNotificationHeader().findViewById(mId); + mParentView = mParentRow.getNotificationViewWrapper().getNotificationHeader() + .findViewById(mId); mParentData = mExtractor == null ? null : mExtractor.extractData(mParentRow); mApply = !mComparator.isEmpty(mParentView); } @@ -305,7 +304,7 @@ public class NotificationHeaderUtil { public void apply(ExpandableNotificationRow row, boolean reset) { boolean apply = mApply && !reset; if (row.isSummaryWithChildren()) { - applyToView(apply, reset, row.getNotificationHeader()); + applyToView(apply, reset, row.getNotificationViewWrapper().getNotificationHeader()); return; } applyToView(apply, reset, row.getPrivateLayout().getContractedChild()); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ViewTransformationHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/ViewTransformationHelper.java index 83e51cd43ed2..7ecdc812cbd3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ViewTransformationHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ViewTransformationHelper.java @@ -106,12 +106,8 @@ public class ViewTransformationHelper implements TransformableView, mViewTransformationAnimation.cancel(); } mViewTransformationAnimation = ValueAnimator.ofFloat(0.0f, 1.0f); - mViewTransformationAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - transformTo(notification, animation.getAnimatedFraction()); - } - }); + mViewTransformationAnimation.addUpdateListener( + animation -> transformTo(notification, animation.getAnimatedFraction())); mViewTransformationAnimation.setInterpolator(Interpolators.LINEAR); mViewTransformationAnimation.setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD); mViewTransformationAnimation.addListener(new AnimatorListenerAdapter() { @@ -167,12 +163,8 @@ public class ViewTransformationHelper implements TransformableView, mViewTransformationAnimation.cancel(); } mViewTransformationAnimation = ValueAnimator.ofFloat(0.0f, 1.0f); - mViewTransformationAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - transformFrom(notification, animation.getAnimatedFraction()); - } - }); + mViewTransformationAnimation.addUpdateListener( + animation -> transformFrom(notification, animation.getAnimatedFraction())); mViewTransformationAnimation.addListener(new AnimatorListenerAdapter() { public boolean mCancelled; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index ba88f628d632..f788dfe47a61 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -304,7 +304,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } } }; - private boolean mForceUnlocked; private boolean mKeepInParent; private boolean mRemoved; private static final Property<ExpandableNotificationRow, Float> TRANSLATE_CONTENT = @@ -410,8 +409,14 @@ public class ExpandableNotificationRow extends ActivatableNotificationView setIconAnimationRunning(running, l); } if (mIsSummaryWithChildren) { - setIconAnimationRunningForChild(running, mChildrenContainer.getHeaderView()); - setIconAnimationRunningForChild(running, mChildrenContainer.getLowPriorityHeaderView()); + NotificationViewWrapper viewWrapper = mChildrenContainer.getNotificationViewWrapper(); + if (viewWrapper != null) { + setIconAnimationRunningForChild(running, viewWrapper.getIcon()); + } + NotificationViewWrapper lowPriWrapper = mChildrenContainer.getLowPriorityViewWrapper(); + if (lowPriWrapper != null) { + setIconAnimationRunningForChild(running, lowPriWrapper.getIcon()); + } List<ExpandableNotificationRow> notificationChildren = mChildrenContainer.getAttachedChildren(); for (int i = 0; i < notificationChildren.size(); i++) { @@ -435,10 +440,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView private void setIconAnimationRunningForChild(boolean running, View child) { if (child != null) { - ImageView icon = (ImageView) child.findViewById(com.android.internal.R.id.icon); + ImageView icon = child.findViewById(com.android.internal.R.id.icon); setIconRunning(icon, running); - ImageView rightIcon = (ImageView) child.findViewById( - com.android.internal.R.id.right_icon); + ImageView rightIcon = child.findViewById(com.android.internal.R.id.right_icon); setIconRunning(rightIcon, running); } } @@ -594,7 +598,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView public int getOriginalIconColor() { if (mIsSummaryWithChildren && !shouldShowPublic()) { - return mChildrenContainer.getVisibleHeader().getOriginalIconColor(); + return mChildrenContainer.getVisibleWrapper().getOriginalIconColor(); } int color = getShowingLayout().getOriginalIconColor(); if (color != Notification.COLOR_INVALID) { @@ -1040,22 +1044,25 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } } - public NotificationHeaderView getNotificationHeader() { + /** + * @return the main notification view wrapper. + */ + public NotificationViewWrapper getNotificationViewWrapper() { if (mIsSummaryWithChildren) { - return mChildrenContainer.getHeaderView(); + return mChildrenContainer.getNotificationViewWrapper(); } - return mPrivateLayout.getNotificationHeader(); + return mPrivateLayout.getNotificationViewWrapper(); } /** - * @return the currently visible notification header. This can be different from - * {@link #getNotificationHeader()} in case it is a low-priority group. + * @return the currently visible notification view wrapper. This can be different from + * {@link #getNotificationViewWrapper()} in case it is a low-priority group. */ - public NotificationHeaderView getVisibleNotificationHeader() { + public NotificationViewWrapper getVisibleNotificationViewWrapper() { if (mIsSummaryWithChildren && !shouldShowPublic()) { - return mChildrenContainer.getVisibleHeader(); + return mChildrenContainer.getVisibleWrapper(); } - return getShowingLayout().getVisibleNotificationHeader(); + return getShowingLayout().getVisibleWrapper(); } public void setLongPressListener(LongPressListener longPressListener) { @@ -1294,16 +1301,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView onAttachedChildrenCountChanged(); } - public void setForceUnlocked(boolean forceUnlocked) { - mForceUnlocked = forceUnlocked; - if (mIsSummaryWithChildren) { - List<ExpandableNotificationRow> notificationChildren = getAttachedChildren(); - for (ExpandableNotificationRow child : notificationChildren) { - child.setForceUnlocked(forceUnlocked); - } - } - } - @Override public void dismiss(boolean refocusOnDismiss) { super.dismiss(refocusOnDismiss); @@ -1422,7 +1419,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView @Override public View getShelfTransformationTarget() { if (mIsSummaryWithChildren && !shouldShowPublic()) { - return mChildrenContainer.getVisibleHeader().getIcon(); + return mChildrenContainer.getVisibleWrapper().getShelfTransformationTarget(); } return getShowingLayout().getShelfTransformationTarget(); } @@ -1693,37 +1690,30 @@ public class ExpandableNotificationRow extends ActivatableNotificationView @Override protected void onFinishInflate() { super.onFinishInflate(); - mPublicLayout = (NotificationContentView) findViewById(R.id.expandedPublic); - mPrivateLayout = (NotificationContentView) findViewById(R.id.expanded); + mPublicLayout = findViewById(R.id.expandedPublic); + mPrivateLayout = findViewById(R.id.expanded); mLayouts = new NotificationContentView[] {mPrivateLayout, mPublicLayout}; for (NotificationContentView l : mLayouts) { l.setExpandClickListener(mExpandClickListener); l.setContainingNotification(this); } - mGutsStub = (ViewStub) findViewById(R.id.notification_guts_stub); - mGutsStub.setOnInflateListener(new ViewStub.OnInflateListener() { - @Override - public void onInflate(ViewStub stub, View inflated) { - mGuts = (NotificationGuts) inflated; - mGuts.setClipTopAmount(getClipTopAmount()); - mGuts.setActualHeight(getActualHeight()); - mGutsStub = null; - } + mGutsStub = findViewById(R.id.notification_guts_stub); + mGutsStub.setOnInflateListener((stub, inflated) -> { + mGuts = (NotificationGuts) inflated; + mGuts.setClipTopAmount(getClipTopAmount()); + mGuts.setActualHeight(getActualHeight()); + mGutsStub = null; }); - mChildrenContainerStub = (ViewStub) findViewById(R.id.child_container_stub); - mChildrenContainerStub.setOnInflateListener(new ViewStub.OnInflateListener() { + mChildrenContainerStub = findViewById(R.id.child_container_stub); + mChildrenContainerStub.setOnInflateListener((stub, inflated) -> { + mChildrenContainer = (NotificationChildrenContainer) inflated; + mChildrenContainer.setIsLowPriority(mIsLowPriority); + mChildrenContainer.setContainingNotification(ExpandableNotificationRow.this); + mChildrenContainer.onNotificationUpdated(); - @Override - public void onInflate(ViewStub stub, View inflated) { - mChildrenContainer = (NotificationChildrenContainer) inflated; - mChildrenContainer.setIsLowPriority(mIsLowPriority); - mChildrenContainer.setContainingNotification(ExpandableNotificationRow.this); - mChildrenContainer.onNotificationUpdated(); - - if (mShouldTranslateContents) { - mTranslateableViews.add(mChildrenContainer); - } + if (mShouldTranslateContents) { + mTranslateableViews.add(mChildrenContainer); } }); @@ -2183,7 +2173,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } public boolean isUserLocked() { - return mUserLocked && !mForceUnlocked; + return mUserLocked; } public void setUserLocked(boolean userLocked) { @@ -2303,8 +2293,12 @@ public class ExpandableNotificationRow extends ActivatableNotificationView private void onAttachedChildrenCountChanged() { mIsSummaryWithChildren = mChildrenContainer != null && mChildrenContainer.getNotificationChildCount() > 0; - if (mIsSummaryWithChildren && mChildrenContainer.getHeaderView() == null) { - mChildrenContainer.recreateNotificationHeader(mExpandClickListener, isConversation()); + if (mIsSummaryWithChildren) { + NotificationViewWrapper wrapper = mChildrenContainer.getNotificationViewWrapper(); + if (wrapper == null || wrapper.getNotificationHeader() == null) { + mChildrenContainer.recreateNotificationHeader(mExpandClickListener, + isConversation()); + } } getShowingLayout().updateBackgroundColor(false /* animate */); mPrivateLayout.updateExpandButtons(isExpandable()); @@ -2414,9 +2408,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView * the top. */ private void updateContentShiftHeight() { - NotificationHeaderView notificationHeader = getVisibleNotificationHeader(); - if (notificationHeader != null) { - CachingIconView icon = notificationHeader.getIcon(); + NotificationViewWrapper wrapper = getVisibleNotificationViewWrapper(); + CachingIconView icon = wrapper == null ? null : wrapper.getIcon(); + if (icon != null) { mIconTransformContentShift = getRelativeTopPadding(icon) + icon.getHeight(); } else { mIconTransformContentShift = mContentShift; @@ -2504,12 +2498,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView .alpha(0f) .setStartDelay(delay) .setDuration(duration) - .withEndAction(new Runnable() { - @Override - public void run() { - hiddenView.setVisibility(View.INVISIBLE); - } - }); + .withEndAction(() -> hiddenView.setVisibility(View.INVISIBLE)); } for (View showView : shownChildren) { showView.setVisibility(View.VISIBLE); @@ -2867,7 +2856,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } float x = event.getX(); float y = event.getY(); - NotificationHeaderView header = getVisibleNotificationHeader(); + NotificationHeaderView header = getVisibleNotificationViewWrapper().getNotificationHeader(); if (header != null && header.isInTouchRect(x - getTranslation(), y)) { return true; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java index 3b55f7c1e6e8..160b6f78d9a3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java @@ -1018,6 +1018,10 @@ public class NotificationContentView extends FrameLayout { mSingleLineView }; } + public NotificationViewWrapper getVisibleWrapper() { + return getVisibleWrapper(mVisibleType); + } + public NotificationViewWrapper getVisibleWrapper(int visibleType) { switch (visibleType) { case VISIBLE_TYPE_EXPANDED: @@ -1541,18 +1545,20 @@ public class NotificationContentView extends FrameLayout { mIsContentExpandable = expandable; } - public NotificationHeaderView getNotificationHeader() { - NotificationHeaderView header = null; - if (mContractedChild != null) { - header = mContractedWrapper.getNotificationHeader(); + /** + * @return a view wrapper for one of the inflated states of the notification. + */ + public NotificationViewWrapper getNotificationViewWrapper() { + if (mContractedChild != null && mContractedWrapper != null) { + return mContractedWrapper; } - if (header == null && mExpandedChild != null) { - header = mExpandedWrapper.getNotificationHeader(); + if (mExpandedChild != null && mExpandedWrapper != null) { + return mExpandedWrapper; } - if (header == null && mHeadsUpChild != null) { - header = mHeadsUpWrapper.getNotificationHeader(); + if (mHeadsUpChild != null && mHeadsUpWrapper != null) { + return mHeadsUpWrapper; } - return header; + return null; } public void showFeedbackIcon(boolean show) { @@ -1580,11 +1586,6 @@ public class NotificationContentView extends FrameLayout { } } - public NotificationHeaderView getVisibleNotificationHeader() { - NotificationViewWrapper wrapper = getVisibleWrapper(mVisibleType); - return wrapper == null ? null : wrapper.getNotificationHeader(); - } - public void setContainingNotification(ExpandableNotificationRow containingNotification) { mContainingNotification = containingNotification; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationBigTextTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationBigTextTemplateViewWrapper.java index 41f93cceacc7..d58c183f27e3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationBigTextTemplateViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationBigTextTemplateViewWrapper.java @@ -37,7 +37,7 @@ public class NotificationBigTextTemplateViewWrapper extends NotificationTemplate } private void resolveViews(StatusBarNotification notification) { - mBigtext = (ImageFloatingTextView) mView.findViewById(com.android.internal.R.id.big_text); + mBigtext = mView.findViewById(com.android.internal.R.id.big_text); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java index 3f5867477f16..8314aff99c65 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java @@ -55,8 +55,6 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper { protected final ViewTransformationHelper mTransformationHelper; - protected int mColor; - private CachingIconView mIcon; private NotificationExpandButton mExpandButton; protected NotificationHeaderView mNotificationHeader; @@ -119,7 +117,6 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper { mFeedbackIcon = mView.findViewById(com.android.internal.R.id.feedback); if (mNotificationHeader != null) { mNotificationHeader.setShowExpandButtonAtEnd(mShowExpandButtonAtEnd); - mColor = mNotificationHeader.getOriginalIconColor(); } } @@ -296,6 +293,11 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper { } @Override + public CachingIconView getIcon() { + return mIcon; + } + + @Override public int getOriginalIconColor() { return mIcon.getOriginalIconColor(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java index 33c939054be5..2535e5ddc3d1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java @@ -370,7 +370,7 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi return; } - int tintColor = getNotificationHeader().getOriginalIconColor(); + int tintColor = getOriginalIconColor(); mSeekBarElapsedTime.setTextColor(tintColor); mSeekBarTotalTime.setTextColor(tintColor); mSeekBarTotalTime.setShadowLayer(1.5f, 1.5f, 1.5f, mBackgroundColor); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationTemplateViewWrapper.java index 14aab9d62dfd..76ec59e0ec28 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationTemplateViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationTemplateViewWrapper.java @@ -140,13 +140,13 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp } private void resolveTemplateViews(StatusBarNotification notification) { - mPicture = (ImageView) mView.findViewById(com.android.internal.R.id.right_icon); + mPicture = mView.findViewById(com.android.internal.R.id.right_icon); if (mPicture != null) { mPicture.setTag(ImageTransformState.ICON_TAG, notification.getNotification().getLargeIcon()); } - mTitle = (TextView) mView.findViewById(com.android.internal.R.id.title); - mText = (TextView) mView.findViewById(com.android.internal.R.id.text); + mTitle = mView.findViewById(com.android.internal.R.id.title); + mText = mView.findViewById(com.android.internal.R.id.text); final View progress = mView.findViewById(com.android.internal.R.id.progress); if (progress instanceof ProgressBar) { mProgressBar = (ProgressBar) progress; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java index 42f5e389d5a8..e2f0799a5c35 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java @@ -29,7 +29,6 @@ import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Build; -import android.util.ArraySet; import android.view.NotificationHeaderView; import android.view.View; import android.view.ViewGroup; @@ -38,7 +37,7 @@ import android.widget.TextView; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.graphics.ColorUtils; import com.android.internal.util.ContrastColorUtil; -import com.android.internal.widget.ConversationLayout; +import com.android.internal.widget.CachingIconView; import com.android.systemui.statusbar.CrossFadeHelper; import com.android.systemui.statusbar.TransformableView; import com.android.systemui.statusbar.notification.TransformState; @@ -67,8 +66,7 @@ public abstract class NotificationViewWrapper implements TransformableView { } else if ("messaging".equals(v.getTag())) { return new NotificationMessagingTemplateViewWrapper(ctx, v, row); } else if ("conversation".equals(v.getTag())) { - return new NotificationConversationTemplateViewWrapper(ctx, (ConversationLayout) v, - row); + return new NotificationConversationTemplateViewWrapper(ctx, v, row); } Class<? extends Notification.Style> style = row.getEntry().getSbn().getNotification().getNotificationStyle(); @@ -241,7 +239,16 @@ public abstract class NotificationViewWrapper implements TransformableView { /** * @return the expand button if it exists */ - public @Nullable View getExpandButton() { + @Nullable + public View getExpandButton() { + return null; + } + + /** + * @return the icon if it exists + */ + @Nullable + public CachingIconView getIcon() { return null; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java index a396305a49b6..a5d51c64d4ee 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java @@ -31,6 +31,7 @@ import android.widget.RemoteViews; import android.widget.TextView; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.widget.CachingIconView; import com.android.systemui.R; import com.android.systemui.statusbar.CrossFadeHelper; import com.android.systemui.statusbar.NotificationHeaderUtil; @@ -318,9 +319,8 @@ public class NotificationChildrenContainer extends ViewGroup { RemoteViews header = builder.makeNotificationHeader(); if (mNotificationHeader == null) { mNotificationHeader = (NotificationHeaderView) header.apply(getContext(), this); - final View expandButton = mNotificationHeader.findViewById( - com.android.internal.R.id.expand_button); - expandButton.setVisibility(VISIBLE); + mNotificationHeader.findViewById(com.android.internal.R.id.expand_button) + .setVisibility(VISIBLE); mNotificationHeader.setOnClickListener(mHeaderClickListener); mNotificationHeaderWrapper = NotificationViewWrapper.wrap(getContext(), mNotificationHeader, mContainingNotification); @@ -361,9 +361,8 @@ public class NotificationChildrenContainer extends ViewGroup { if (mNotificationHeaderLowPriority == null) { mNotificationHeaderLowPriority = (NotificationHeaderView) header.apply(getContext(), this); - final View expandButton = mNotificationHeaderLowPriority.findViewById( - com.android.internal.R.id.expand_button); - expandButton.setVisibility(VISIBLE); + mNotificationHeaderLowPriority.findViewById(com.android.internal.R.id.expand_button) + .setVisibility(VISIBLE); mNotificationHeaderLowPriority.setOnClickListener(mHeaderClickListener); mNotificationHeaderWrapperLowPriority = NotificationViewWrapper.wrap(getContext(), mNotificationHeaderLowPriority, mContainingNotification); @@ -869,12 +868,12 @@ public class NotificationChildrenContainer extends ViewGroup { return mContainingNotification; } - public NotificationHeaderView getHeaderView() { - return mNotificationHeader; + public NotificationViewWrapper getNotificationViewWrapper() { + return mNotificationHeaderWrapper; } - public NotificationHeaderView getLowPriorityHeaderView() { - return mNotificationHeaderLowPriority; + public NotificationViewWrapper getLowPriorityViewWrapper() { + return mNotificationHeaderWrapperLowPriority; } @VisibleForTesting @@ -1224,16 +1223,15 @@ public class NotificationChildrenContainer extends ViewGroup { public void setShelfIconVisible(boolean iconVisible) { if (mNotificationHeaderWrapper != null) { - NotificationHeaderView header = mNotificationHeaderWrapper.getNotificationHeader(); - if (header != null) { - header.getIcon().setForceHidden(iconVisible); + CachingIconView icon = mNotificationHeaderWrapper.getIcon(); + if (icon != null) { + icon.setForceHidden(iconVisible); } } if (mNotificationHeaderWrapperLowPriority != null) { - NotificationHeaderView header - = mNotificationHeaderWrapperLowPriority.getNotificationHeader(); - if (header != null) { - header.getIcon().setForceHidden(iconVisible); + CachingIconView icon = mNotificationHeaderWrapperLowPriority.getIcon(); + if (icon != null) { + icon.setForceHidden(iconVisible); } } } @@ -1254,12 +1252,14 @@ public class NotificationChildrenContainer extends ViewGroup { } } - public NotificationHeaderView getVisibleHeader() { - NotificationHeaderView header = mNotificationHeader; + /** + * @return the view wrapper for the currently showing priority. + */ + public NotificationViewWrapper getVisibleWrapper() { if (showingAsLowPriority()) { - header = mNotificationHeaderLowPriority; + return mNotificationHeaderWrapperLowPriority; } - return header; + return mNotificationHeaderWrapper; } public void onExpansionChanged() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java index af6ac223ada1..2767b7e1627d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java @@ -38,9 +38,9 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.keyguard.ViewMediatorCallback; import com.android.keyguard.dagger.KeyguardBouncerComponent; -import com.android.keyguard.dagger.RootView; import com.android.systemui.DejankUtils; import com.android.systemui.biometrics.AuthController; +import com.android.systemui.dagger.qualifiers.RootView; import com.android.systemui.keyguard.DismissCallbackRegistry; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.shared.system.SysUiStatsLog; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index f55c93580210..c7932bb44cf4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -172,7 +172,7 @@ import com.android.systemui.plugins.qs.QS; import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper.SnoozeOption; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.qs.QSFragment; -import com.android.systemui.qs.QSPanel; +import com.android.systemui.qs.QSPanelController; import com.android.systemui.recents.ScreenPinningRequest; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.shared.system.WindowManagerWrapper; @@ -408,7 +408,7 @@ public class StatusBar extends SystemUI implements DemoMode, protected NotificationPanelViewController mNotificationPanelViewController; // settings - private QSPanel mQSPanel; + private QSPanelController mQSPanelController; KeyguardIndicationController mKeyguardIndicationController; @@ -1200,8 +1200,8 @@ public class StatusBar extends SystemUI implements DemoMode, fragmentHostManager.addTagListener(QS.TAG, (tag, f) -> { QS qs = (QS) f; if (qs instanceof QSFragment) { - mQSPanel = ((QSFragment) qs).getQsPanel(); - mQSPanel.setBrightnessMirror(mBrightnessMirrorController); + mQSPanelController = ((QSFragment) qs).getQSPanelController(); + mQSPanelController.setBrightnessMirror(mBrightnessMirrorController); } }); } @@ -1593,19 +1593,19 @@ public class StatusBar extends SystemUI implements DemoMode, } public void addQsTile(ComponentName tile) { - if (mQSPanel != null && mQSPanel.getHost() != null) { - mQSPanel.getHost().addTile(tile); + if (mQSPanelController != null && mQSPanelController.getHost() != null) { + mQSPanelController.getHost().addTile(tile); } } public void remQsTile(ComponentName tile) { - if (mQSPanel != null && mQSPanel.getHost() != null) { - mQSPanel.getHost().removeTile(tile); + if (mQSPanelController != null && mQSPanelController.getHost() != null) { + mQSPanelController.getHost().removeTile(tile); } } public void clickTile(ComponentName tile) { - mQSPanel.clickTile(tile); + mQSPanelController.clickTile(tile); } /** @@ -2197,7 +2197,7 @@ public class StatusBar extends SystemUI implements DemoMode, if (!mUserSetup) return; if (subPanel != null) { - mQSPanel.openDetails(subPanel); + mQSPanelController.openDetails(subPanel); } mNotificationPanelViewController.expandWithQs(); @@ -2845,7 +2845,7 @@ public class StatusBar extends SystemUI implements DemoMode, resetUserExpandedStates(); } else if (DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG.equals(action)) { - mQSPanel.showDeviceMonitoringDialog(); + mQSPanelController.showDeviceMonitoringDialog(); } Trace.endSection(); } @@ -2936,8 +2936,8 @@ public class StatusBar extends SystemUI implements DemoMode, */ void updateResources() { // Update the quick setting tiles - if (mQSPanel != null) { - mQSPanel.updateResources(); + if (mQSPanelController != null) { + mQSPanelController.updateResources(); } if (mStatusBarWindowController != null) { @@ -3402,8 +3402,8 @@ public class StatusBar extends SystemUI implements DemoMode, // Keyguard state has changed, but QS is not listening anymore. Make sure to update the tile // visibilities so next time we open the panel we know the correct height already. - if (mQSPanel != null) { - mQSPanel.refreshAllTiles(); + if (mQSPanelController != null) { + mQSPanelController.refreshAllTiles(); } mHandler.removeMessages(MSG_LAUNCH_TRANSITION_TIMEOUT); releaseGestureWakeLock(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java index 9c3395f9332d..c84589a9e142 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java @@ -18,11 +18,13 @@ package com.android.systemui.statusbar.policy; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; +import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.Notification; import android.app.PendingIntent; import android.app.RemoteInput; +import android.content.ClipData; import android.content.ClipDescription; import android.content.Context; import android.content.Intent; @@ -43,6 +45,7 @@ import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; +import android.view.OnReceiveContentCallback; import android.view.View; import android.view.ViewAnimationUtils; import android.view.ViewGroup; @@ -57,9 +60,6 @@ import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; -import androidx.core.view.inputmethod.InputConnectionCompat; -import androidx.core.view.inputmethod.InputContentInfoCompat; - import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto; import com.android.internal.statusbar.IStatusBarService; @@ -73,7 +73,9 @@ import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewW import com.android.systemui.statusbar.notification.stack.StackStateAnimator; import com.android.systemui.statusbar.phone.LightBarController; +import java.util.Collections; import java.util.HashMap; +import java.util.Set; import java.util.function.Consumer; /** @@ -313,6 +315,7 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene mRemoteInputs = remoteInputs; mRemoteInput = remoteInput; mEditText.setHint(mRemoteInput.getLabel()); + mEditText.mSupportedMimeTypes = remoteInput.getAllowedDataTypes(); mEntry.editedSuggestionInfo = editedSuggestionInfo; if (editedSuggestionInfo != null) { @@ -571,6 +574,7 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene boolean mShowImeOnInputConnection; private LightBarController mLightBarController; UserHandle mUser; + private Set<String> mSupportedMimeTypes; public RemoteEditText(Context context, AttributeSet attrs) { super(context, attrs); @@ -578,6 +582,40 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene mLightBarController = Dependency.get(LightBarController.class); } + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + setOnReceiveContentCallback(new OnReceiveContentCallback<View>() { + @Override + public boolean onReceiveContent(@NonNull View view, @NonNull Payload payload) { + ClipData clip = payload.getClip(); + if (clip.getItemCount() == 0) { + return false; + } + Uri contentUri = clip.getItemAt(0).getUri(); + ClipDescription description = clip.getDescription(); + String mimeType = null; + if (description.getMimeTypeCount() > 0) { + mimeType = description.getMimeType(0); + } + if (mimeType != null) { + Intent dataIntent = mRemoteInputView + .prepareRemoteInputFromData(mimeType, contentUri); + mRemoteInputView.sendRemoteInput(dataIntent); + } + return true; + } + + @NonNull + @Override + public Set<String> getSupportedMimeTypes(@NonNull View view) { + return mSupportedMimeTypes != null + ? mSupportedMimeTypes + : Collections.emptySet(); + } + }); + } + private void defocusIfNeeded(boolean animate) { if (mRemoteInputView != null && mRemoteInputView.mEntry.getRow().isChangingPosition() || isTemporarilyDetached()) { @@ -670,36 +708,7 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { - // TODO: Pass RemoteInput data types to allow image insertion. - // String[] allowedDataTypes = mRemoteInputView.mRemoteInput.getAllowedDataTypes() - // .toArray(new String[0]); - // EditorInfoCompat.setContentMimeTypes(outAttrs, allowedDataTypes); - final InputConnection inputConnection = super.onCreateInputConnection(outAttrs); - - final InputConnectionCompat.OnCommitContentListener callback = - new InputConnectionCompat.OnCommitContentListener() { - @Override - public boolean onCommitContent( - InputContentInfoCompat inputContentInfoCompat, int i, - Bundle bundle) { - Uri contentUri = inputContentInfoCompat.getContentUri(); - ClipDescription description = inputContentInfoCompat.getDescription(); - String mimeType = null; - if (description != null && description.getMimeTypeCount() > 0) { - mimeType = description.getMimeType(0); - } - if (mimeType != null) { - Intent dataIntent = mRemoteInputView.prepareRemoteInputFromData( - mimeType, contentUri); - mRemoteInputView.sendRemoteInput(dataIntent); - } - return true; - } - }; - - InputConnection ic = inputConnection == null ? null : - InputConnectionCompat.createWrapper(inputConnection, outAttrs, callback); - + final InputConnection ic = super.onCreateInputConnection(outAttrs); Context userContext = null; try { userContext = mContext.createPackageContextAsUser( @@ -747,7 +756,6 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene } else { setBackground(null); } - } } } diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java index 70bba263ab90..b67574d1c4de 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java @@ -32,6 +32,7 @@ import com.android.systemui.statusbar.phone.SystemUIDialog; public abstract class TunerService { public static final String ACTION_CLEAR = "com.android.systemui.action.CLEAR_TUNER"; + private final Context mContext; public abstract void clearAll(); public abstract void destroy(); @@ -50,6 +51,10 @@ public abstract class TunerService { void onTuningChanged(String key, String newValue); } + public TunerService(Context context) { + mContext = context; + } + private static Context userContext(Context context, UserHandle user) { try { return context.createPackageContextAsUser(context.getPackageName(), 0, user); @@ -58,6 +63,11 @@ public abstract class TunerService { } } + /** Enables or disables the tuner for the supplied user. */ + public void setTunerEnabled(UserHandle user, boolean enabled) { + setTunerEnabled(mContext, user, enabled); + } + public static final void setTunerEnabled(Context context, UserHandle user, boolean enabled) { userContext(context, user).getPackageManager().setComponentEnabledSetting( new ComponentName(context, TunerActivity.class), @@ -66,6 +76,11 @@ public abstract class TunerService { PackageManager.DONT_KILL_APP); } + /** Returns true if the tuner is enabled for the supplied user. */ + public boolean isTunerEnabled(UserHandle user) { + return isTunerEnabled(mContext, user); + } + public static final boolean isTunerEnabled(Context context, UserHandle user) { return userContext(context, user).getPackageManager().getComponentEnabledSetting( new ComponentName(context, TunerActivity.class)) @@ -81,6 +96,11 @@ public abstract class TunerService { } } + /** */ + public void showResetRequest(UserHandle user, final Runnable onDisabled) { + showResetRequest(mContext, user, onDisabled); + } + public static final void showResetRequest(final Context context, UserHandle user, final Runnable onDisabled) { SystemUIDialog dialog = new SystemUIDialog(context); diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java index 22f03e074b06..027c282ba352 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java @@ -94,6 +94,7 @@ public class TunerServiceImpl extends TunerService { DemoModeController demoModeController, BroadcastDispatcher broadcastDispatcher, UserTracker userTracker) { + super(context); mContext = context; mContentResolver = mContext.getContentResolver(); mLeakDetector = leakDetector; diff --git a/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java b/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java index 344f0d2f5506..e79d432b3b15 100644 --- a/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java +++ b/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java @@ -24,7 +24,6 @@ import android.view.LayoutInflater; import android.view.View; import com.android.systemui.dagger.SysUISingleton; -import com.android.systemui.qs.QSFooterImpl; import com.android.systemui.qs.QSPanel; import com.android.systemui.qs.QuickQSPanel; import com.android.systemui.qs.customize.QSCustomizer; @@ -92,11 +91,6 @@ public class InjectionInflationController { } /** - * Creates the QSFooterImpl. - */ - QSFooterImpl createQsFooter(); - - /** * Creates the NotificationStackScrollLayout. */ NotificationStackScrollLayout createNotificationStackScrollLayout(); diff --git a/packages/SystemUI/src/com/android/systemui/util/ViewController.java b/packages/SystemUI/src/com/android/systemui/util/ViewController.java index c7aa780fcacb..3dbc6f101a90 100644 --- a/packages/SystemUI/src/com/android/systemui/util/ViewController.java +++ b/packages/SystemUI/src/com/android/systemui/util/ViewController.java @@ -16,6 +16,8 @@ package com.android.systemui.util; +import android.content.Context; +import android.content.res.Resources; import android.view.View; import android.view.View.OnAttachStateChangeListener; @@ -75,6 +77,14 @@ public abstract class ViewController<T extends View> { } } + protected Context getContext() { + return mView.getContext(); + } + + protected Resources getResources() { + return mView.getResources(); + } + /** * Called when the view is attached and a call to {@link #init()} has been made in either order. */ diff --git a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java index 9a77218cc86f..4f3266d0db44 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java +++ b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java @@ -30,6 +30,7 @@ import android.testing.TestableLooper; import android.util.Log; import androidx.test.InstrumentationRegistry; +import androidx.test.uiautomator.UiDevice; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.settingslib.bluetooth.LocalBluetoothManager; @@ -149,6 +150,10 @@ public abstract class SysuiTestCase { return mContext; } + protected UiDevice getUiDevice() { + return UiDevice.getInstance(mRealInstrumentation); + } + protected void runShellCommand(String command) throws IOException { ParcelFileDescriptor pfd = mRealInstrumentation.getUiAutomation() .executeShellCommand(command); diff --git a/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java index b4af786c5579..78ee5936fe0b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java @@ -53,6 +53,9 @@ import android.view.WindowManagerPolicyConstants; import android.widget.FrameLayout; import androidx.test.filters.SmallTest; +import androidx.test.uiautomator.By; +import androidx.test.uiautomator.UiObject2; +import androidx.test.uiautomator.Until; import com.android.internal.colorextraction.ColorExtractor; import com.android.internal.logging.MetricsLogger; @@ -86,11 +89,16 @@ import org.mockito.MockitoAnnotations; import java.util.List; import java.util.concurrent.Executor; +import java.util.regex.Pattern; @SmallTest @RunWith(AndroidTestingRunner.class) @TestableLooper.RunWithLooper(setAsMainLooper = true) public class GlobalActionsDialogTest extends SysuiTestCase { + private static final long UI_TIMEOUT_MILLIS = 5000; // 5 sec + private static final Pattern CANCEL_BUTTON = + Pattern.compile("cancel", Pattern.CASE_INSENSITIVE); + private GlobalActionsDialog mGlobalActionsDialog; @Mock private GlobalActions.GlobalActionsManager mWindowManagerFuncs; @@ -240,6 +248,13 @@ public class GlobalActionsDialogTest extends SysuiTestCase { mGlobalActionsDialog.makeScreenshotActionForTesting(); screenshotAction.onLongPress(); verifyLogPosted(GlobalActionsDialog.GlobalActionsEvent.GA_SCREENSHOT_LONG_PRESS); + + // Dismiss ScreenRecordDialog opened by the long press above. + final UiObject2 cancelButton = getUiDevice().wait( + Until.findObject(By.text(CANCEL_BUTTON)), UI_TIMEOUT_MILLIS); + if (cancelButton != null) { + cancelButton.click(); + } } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java index 353efeeb21f6..803919200150 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java @@ -70,7 +70,7 @@ public class QSDetailTest extends SysuiTestCase { mQsDetail = (QSDetail) LayoutInflater.from(mContext).inflate(R.layout.qs_detail, null); mQsPanel = mock(QSPanel.class); mQuickHeader = mock(QuickStatusBarHeader.class); - mQsDetail.setQsPanel(mQsPanel, mQuickHeader, mock(View.class)); + mQsDetail.setQsPanel(mQsPanel, mQuickHeader, mock(QSFooter.class)); mMockDetailAdapter = mock(DetailAdapter.class); when(mMockDetailAdapter.createDetailView(any(), any(), any())) diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterImplTest.java deleted file mode 100644 index 99f2d8042547..000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterImplTest.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2017 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.systemui.qs; - -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyBoolean; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.content.ClipData; -import android.content.ClipboardManager; -import android.testing.AndroidTestingRunner; -import android.testing.TestableLooper; -import android.testing.TestableLooper.RunWithLooper; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.TextView; - -import androidx.test.filters.SmallTest; - -import com.android.systemui.R; -import com.android.systemui.R.id; -import com.android.systemui.plugins.ActivityStarter; -import com.android.systemui.settings.UserTracker; -import com.android.systemui.statusbar.policy.DeviceProvisionedController; -import com.android.systemui.statusbar.policy.UserInfoController; -import com.android.systemui.utils.leaks.LeakCheckedTest; - -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -@RunWith(AndroidTestingRunner.class) -@RunWithLooper -@SmallTest -public class QSFooterImplTest extends LeakCheckedTest { - - private QSFooterImpl mFooter; - private ActivityStarter mActivityStarter; - private DeviceProvisionedController mDeviceProvisionedController; - private UserInfoController mUserInfoController; - private UserTracker mUserTracker; - @Mock - private ClipboardManager mClipboardManager; - - @Before - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - - injectLeakCheckedDependencies(ALL_SUPPORTED_CLASSES); - mActivityStarter = mDependency.injectMockDependency(ActivityStarter.class); - mDeviceProvisionedController = mDependency.injectMockDependency( - DeviceProvisionedController.class); - mUserInfoController = mDependency.injectMockDependency(UserInfoController.class); - mUserTracker = mDependency.injectMockDependency(UserTracker.class); - - mContext.addMockSystemService(ClipboardManager.class, mClipboardManager); - - when(mUserTracker.getUserContext()).thenReturn(mContext); - - TestableLooper.get(this).runWithLooper( - () -> mFooter = (QSFooterImpl) LayoutInflater.from(mContext).inflate( - R.layout.qs_footer_impl, null)); - } - - @Test - public void testBuildTextCopy() { - TextView buildTextView = mFooter.requireViewById(R.id.build); - CharSequence buildText = "TEST"; - buildTextView.setText(buildText); - buildTextView.setLongClickable(true); - - buildTextView.performLongClick(); - - ArgumentCaptor<ClipData> captor = ArgumentCaptor.forClass(ClipData.class); - verify(mClipboardManager).setPrimaryClip(captor.capture()); - assertThat(captor.getValue().getItemAt(0).getText()).isEqualTo(buildText); - } - - @Test - @Ignore("failing") - public void testSettings_UserNotSetup() { - View settingsButton = mFooter.findViewById(id.settings_button); - when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(false); - - mFooter.onClick(settingsButton); - // Verify Settings wasn't launched. - verify(mActivityStarter, never()).startActivity(any(), anyBoolean()); - } -} diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterViewControllerTest.java new file mode 100644 index 000000000000..065f236d19b3 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterViewControllerTest.java @@ -0,0 +1,144 @@ +/* + * Copyright (C) 2020 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.systemui.qs; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.ClipData; +import android.content.ClipboardManager; +import android.os.UserManager; +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper; +import android.view.View; +import android.widget.TextView; + +import androidx.test.filters.SmallTest; + +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.testing.FakeMetricsLogger; +import com.android.systemui.Dependency; +import com.android.systemui.R; +import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.settings.UserTracker; +import com.android.systemui.statusbar.phone.SettingsButton; +import com.android.systemui.statusbar.policy.DeviceProvisionedController; +import com.android.systemui.statusbar.policy.UserInfoController; +import com.android.systemui.tuner.TunerService; +import com.android.systemui.utils.leaks.FakeTunerService; +import com.android.systemui.utils.leaks.LeakCheckedTest; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +@RunWith(AndroidTestingRunner.class) +@TestableLooper.RunWithLooper +@SmallTest +public class QSFooterViewControllerTest extends LeakCheckedTest { + + @Mock + private QSFooterView mView; + @Mock + private UserManager mUserManager; + @Mock + private ActivityStarter mActivityStarter; + @Mock + private DeviceProvisionedController mDeviceProvisionedController; + @Mock + private UserInfoController mUserInfoController; + @Mock + private UserTracker mUserTracker; + @Mock + private QSPanelController mQSPanelController; + @Mock + private ClipboardManager mClipboardManager; + private FakeTunerService mFakeTunerService; + private MetricsLogger mMetricsLogger = new FakeMetricsLogger(); + + @Mock + private SettingsButton mSettingsButton; + @Mock + private TextView mBuildText; + @Mock + private View mEdit; + + private QSFooterViewController mController; + + @Before + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + + injectLeakCheckedDependencies(ALL_SUPPORTED_CLASSES); + + mFakeTunerService = (FakeTunerService) Dependency.get(TunerService.class); + + mContext.addMockSystemService(ClipboardManager.class, mClipboardManager); + + when(mView.getContext()).thenReturn(mContext); + when(mView.getResources()).thenReturn(mContext.getResources()); + when(mUserTracker.getUserContext()).thenReturn(mContext); + + when(mView.isAttachedToWindow()).thenReturn(true); + when(mView.findViewById(R.id.settings_button)).thenReturn(mSettingsButton); + when(mView.findViewById(R.id.build)).thenReturn(mBuildText); + when(mView.findViewById(android.R.id.edit)).thenReturn(mEdit); + + mController = new QSFooterViewController(mView, mUserManager, mUserInfoController, + mActivityStarter, mDeviceProvisionedController, mUserTracker, mQSPanelController, + mFakeTunerService, mMetricsLogger); + + mController.init(); + } + + @Test + public void testBuildTextCopy() { + String text = "TEST"; + ArgumentCaptor<View.OnLongClickListener> onLongClickCaptor = + ArgumentCaptor.forClass(View.OnLongClickListener.class); + + verify(mBuildText).setOnLongClickListener(onLongClickCaptor.capture()); + + when(mBuildText.getText()).thenReturn(text); + onLongClickCaptor.getValue().onLongClick(mBuildText); + + ArgumentCaptor<ClipData> captor = ArgumentCaptor.forClass(ClipData.class); + verify(mClipboardManager).setPrimaryClip(captor.capture()); + assertThat(captor.getValue().getItemAt(0).getText()).isEqualTo(text); + } + + @Test + public void testSettings_UserNotSetup() { + ArgumentCaptor<View.OnClickListener> onClickCaptor = + ArgumentCaptor.forClass(View.OnClickListener.class); + verify(mSettingsButton).setOnClickListener(onClickCaptor.capture()); + + when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(false); + + onClickCaptor.getValue().onClick(mSettingsButton); + // Verify Settings wasn't launched. + verify(mActivityStarter, never()).startActivity(any(), anyBoolean()); + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java index e472cb22ed6b..90609ccb48d6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java @@ -16,7 +16,9 @@ package com.android.systemui.qs; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import android.app.Fragment; import android.content.Context; @@ -42,6 +44,7 @@ import com.android.systemui.SysuiBaseFragmentTest; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dump.DumpManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.qs.dagger.QSFragmentComponent; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSFactoryImpl; import com.android.systemui.settings.UserTracker; @@ -61,6 +64,8 @@ import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import java.util.Optional; @@ -71,6 +76,12 @@ import java.util.Optional; public class QSFragmentTest extends SysuiBaseFragmentTest { private MetricsLogger mMockMetricsLogger; + @Mock + private QSFragmentComponent.Factory mQsComponentFactory; + @Mock + private QSFragmentComponent mQsFragmentComponent; + @Mock + private QSPanelController mQSPanelController; public QSFragmentTest() { super(QSFragment.class); @@ -80,6 +91,10 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { @Before @Ignore("failing") public void addLeakCheckDependencies() { + MockitoAnnotations.initMocks(this); + when(mQsComponentFactory.create(any(QSFragment.class))).thenReturn(mQsFragmentComponent); + when(mQsFragmentComponent.getQSPanelController()).thenReturn(mQSPanelController); + mMockMetricsLogger = mDependency.injectMockDependency(MetricsLogger.class); mContext.addMockSystemService(Context.LAYOUT_INFLATER_SERVICE, new LayoutInflaterBuilder(mContext) @@ -152,6 +167,6 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { mock(QSTileHost.class), mock(StatusBarStateController.class), commandQueue, - mock(QSContainerImplController.Builder.class)); + mQsComponentFactory); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java new file mode 100644 index 000000000000..bf0e0841de9a --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2020 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.systemui.qs; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper.RunWithLooper; + +import androidx.test.filters.SmallTest; + +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.UiEventLogger; +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.internal.logging.testing.UiEventLoggerFake; +import com.android.systemui.SysuiTestCase; +import com.android.systemui.dump.DumpManager; +import com.android.systemui.media.MediaHost; +import com.android.systemui.plugins.qs.QSTileView; +import com.android.systemui.qs.tileimpl.QSTileImpl; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.io.FileDescriptor; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.Collections; + +@RunWith(AndroidTestingRunner.class) +@RunWithLooper +@SmallTest +public class QSPanelControllerBaseTest extends SysuiTestCase { + + @Mock + private QSPanel mQSPanel; + @Mock + private QSTileHost mQSTileHost; + @Mock + private MediaHost mMediaHost; + @Mock + private MetricsLogger mMetricsLogger; + private UiEventLoggerFake mUiEventLogger = new UiEventLoggerFake(); + private DumpManager mDumpManager = new DumpManager(); + @Mock + QSTileImpl mQSTile; + @Mock + QSTileView mQSTileView; + + private QSPanelControllerBase<QSPanel> mController; + + /** Implementation needed to ensure we have a reflectively-available class name. */ + private static class TestableQSPanelControllerBase extends QSPanelControllerBase<QSPanel> { + protected TestableQSPanelControllerBase(QSPanel view, QSTileHost host, + MetricsLogger metricsLogger, + UiEventLogger uiEventLogger, DumpManager dumpManager) { + super(view, host, metricsLogger, uiEventLogger, dumpManager); + } + } + + @Before + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + + when(mQSPanel.getMediaHost()).thenReturn(mMediaHost); + when(mQSPanel.isAttachedToWindow()).thenReturn(true); + when(mQSPanel.getDumpableTag()).thenReturn("QSPanel"); + when(mQSPanel.openPanelEvent()).thenReturn(QSEvent.QS_PANEL_EXPANDED); + when(mQSPanel.closePanelEvent()).thenReturn(QSEvent.QS_PANEL_COLLAPSED); + when(mQSTileHost.getTiles()).thenReturn(Collections.singleton(mQSTile)); + when(mQSTileHost.createTileView(eq(mQSTile), anyBoolean())).thenReturn(mQSTileView); + + mController = new TestableQSPanelControllerBase(mQSPanel, mQSTileHost, + mMetricsLogger, mUiEventLogger, mDumpManager); + + mController.init(); + } + + @Test + public void testSetExpanded_Metrics() { + mController.setExpanded(true); + verify(mMetricsLogger).visibility(eq(MetricsEvent.QS_PANEL), eq(true)); + assertEquals(1, mUiEventLogger.numLogs()); + assertEquals(QSEvent.QS_PANEL_EXPANDED.getId(), mUiEventLogger.eventId(0)); + mUiEventLogger.getLogs().clear(); + + mController.setExpanded(false); + verify(mMetricsLogger).visibility(eq(MetricsEvent.QS_PANEL), eq(false)); + assertEquals(1, mUiEventLogger.numLogs()); + assertEquals(QSEvent.QS_PANEL_COLLAPSED.getId(), mUiEventLogger.eventId(0)); + mUiEventLogger.getLogs().clear(); + + } + + @Test + public void testDump() { + String mockTileViewString = "Mock Tile View"; + String mockTileString = "Mock Tile"; + doAnswer(invocation -> { + PrintWriter pw = invocation.getArgument(1); + pw.println(mockTileString); + return null; + }).when(mQSTile).dump(any(FileDescriptor.class), any(PrintWriter.class), + any(String[].class)); + when(mQSTileView.toString()).thenReturn(mockTileViewString); + + StringWriter w = new StringWriter(); + PrintWriter pw = new PrintWriter(w); + mController.dump(mock(FileDescriptor.class), pw, new String[]{}); + String expected = "TestableQSPanelControllerBase:\n" + + " Tile records:\n" + + " " + mockTileString + "\n" + + " " + mockTileViewString + "\n"; + assertEquals(expected, w.getBuffer().toString()); + } + +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java new file mode 100644 index 000000000000..0ba0214d2173 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2020 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.systemui.qs; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper.RunWithLooper; + +import androidx.test.filters.SmallTest; + +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.UiEventLogger; +import com.android.internal.logging.testing.UiEventLoggerFake; +import com.android.systemui.SysuiTestCase; +import com.android.systemui.dump.DumpManager; +import com.android.systemui.media.MediaHost; +import com.android.systemui.plugins.qs.QSTileView; +import com.android.systemui.qs.tileimpl.QSTileImpl; +import com.android.systemui.settings.BrightnessController; +import com.android.systemui.settings.ToggleSlider; +import com.android.systemui.tuner.TunerService; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.Collections; + +@RunWith(AndroidTestingRunner.class) +@RunWithLooper +@SmallTest +public class QSPanelControllerTest extends SysuiTestCase { + + @Mock + private QSPanel mQSPanel; + @Mock + private QSTileHost mQSTileHost; + @Mock + private MediaHost mMediaHost; + @Mock + private MetricsLogger mMetricsLogger; + private UiEventLogger mUiEventLogger = new UiEventLoggerFake(); + private DumpManager mDumpManager = new DumpManager(); + @Mock + private TunerService mTunerService; + @Mock + private QSSecurityFooter mQSSecurityFooter; + @Mock + private BrightnessController.Factory mBrightnessControllerFactory; + @Mock + private BrightnessController mBrightnessController; + @Mock + QSTileImpl mQSTile; + @Mock + QSTileView mQSTileView; + + private QSPanelController mController; + + @Before + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + + when(mQSPanel.getMediaHost()).thenReturn(mMediaHost); + when(mQSPanel.isAttachedToWindow()).thenReturn(true); + when(mQSPanel.getDumpableTag()).thenReturn("QSPanel"); + when(mQSTileHost.getTiles()).thenReturn(Collections.singleton(mQSTile)); + when(mQSTileHost.createTileView(eq(mQSTile), anyBoolean())).thenReturn(mQSTileView); + when(mBrightnessControllerFactory.create(any(ToggleSlider.class))) + .thenReturn(mBrightnessController); + + mController = new QSPanelController(mQSPanel, mQSSecurityFooter, mTunerService, + mQSTileHost, mDumpManager, mMetricsLogger, mUiEventLogger, + mBrightnessControllerFactory); + + mController.init(); + } + + @Test + public void testOpenDetailsWithNonExistingTile_NoException() { + mController.openDetails("none"); + + verify(mQSPanel, never()).openDetails(any()); + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java index 4b7a26870308..e38d54b90f69 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java @@ -14,12 +14,9 @@ package com.android.systemui.qs; -import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -36,19 +33,15 @@ import android.widget.FrameLayout; import androidx.test.filters.SmallTest; import com.android.internal.logging.MetricsLogger; -import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.testing.UiEventLoggerFake; import com.android.systemui.Dependency; import com.android.systemui.SysuiTestCase; -import com.android.systemui.broadcast.BroadcastDispatcher; -import com.android.systemui.dump.DumpManager; import com.android.systemui.media.MediaHost; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.qs.QSTileView; import com.android.systemui.qs.customize.QSCustomizer; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileImpl; -import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.policy.SecurityController; import com.android.systemui.util.animation.DisappearParameters; import com.android.systemui.util.animation.UniqueObjectHostView; @@ -59,9 +52,6 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.io.FileDescriptor; -import java.io.PrintWriter; -import java.io.StringWriter; import java.util.Collections; @RunWith(AndroidTestingRunner.class) @@ -79,9 +69,9 @@ public class QSPanelTest extends SysuiTestCase { @Mock private QSTileImpl dndTile; @Mock - private BroadcastDispatcher mBroadcastDispatcher; + private QSTileImpl mNonTile; @Mock - private DumpManager mDumpManager; + private QSPanelControllerBase.TileRecord mDndTileRecord; @Mock private QSLogger mQSLogger; private ViewGroup mParentView; @@ -93,9 +83,8 @@ public class QSPanelTest extends SysuiTestCase { private MediaHost mMediaHost; @Mock private ActivityStarter mActivityStarter; - @Mock(stubOnly = true) - private UserTracker mUserTracker; private UiEventLoggerFake mUiEventLogger; + private String mCachedSpecs = ""; @Before public void setup() throws Exception { @@ -109,12 +98,13 @@ public class QSPanelTest extends SysuiTestCase { mContext.addMockSystemService(Context.USER_SERVICE, mock(UserManager.class)); when(mMediaHost.getHostView()).thenReturn(new UniqueObjectHostView(getContext())); when(mMediaHost.getDisappearParameters()).thenReturn(new DisappearParameters()); + mDndTileRecord.tile = dndTile; + mDndTileRecord.tileView = mQSTileView; mUiEventLogger = new UiEventLoggerFake(); mTestableLooper.runWithLooper(() -> { mMetricsLogger = mDependency.injectMockDependency(MetricsLogger.class); - mQsPanel = new QSPanel(mContext, null, mDumpManager, mBroadcastDispatcher, - mQSLogger, mMediaHost, mUiEventLogger, mUserTracker); + mQsPanel = new QSPanel(mContext, null, mQSLogger, mMediaHost, mUiEventLogger); mQsPanel.onFinishInflate(); // Provides a parent with non-zero size for QSPanel mParentView = new FrameLayout(mContext); @@ -124,8 +114,8 @@ public class QSPanelTest extends SysuiTestCase { when(mHost.getTiles()).thenReturn(Collections.emptyList()); when(mHost.createTileView(any(), anyBoolean())).thenReturn(mQSTileView); - mQsPanel.setHost(mHost, mCustomizer); - mQsPanel.addTile(dndTile, true); + mQsPanel.setCustomizer(mCustomizer); + mQsPanel.addTile(mDndTileRecord); mQsPanel.setCallback(mCallback); }); } @@ -133,25 +123,16 @@ public class QSPanelTest extends SysuiTestCase { @Test public void testSetExpanded_Metrics() { mQsPanel.setExpanded(true); - verify(mMetricsLogger).visibility(eq(MetricsEvent.QS_PANEL), eq(true)); verify(mQSLogger).logPanelExpanded(true, mQsPanel.getDumpableTag()); - assertEquals(1, mUiEventLogger.numLogs()); - assertEquals(QSEvent.QS_PANEL_EXPANDED.getId(), mUiEventLogger.eventId(0)); - mUiEventLogger.getLogs().clear(); mQsPanel.setExpanded(false); - verify(mMetricsLogger).visibility(eq(MetricsEvent.QS_PANEL), eq(false)); verify(mQSLogger).logPanelExpanded(false, mQsPanel.getDumpableTag()); - assertEquals(1, mUiEventLogger.numLogs()); - assertEquals(QSEvent.QS_PANEL_COLLAPSED.getId(), mUiEventLogger.eventId(0)); - mUiEventLogger.getLogs().clear(); - } @Test public void testOpenDetailsWithExistingTile_NoException() { mTestableLooper.processAllMessages(); - mQsPanel.openDetails("dnd"); + mQsPanel.openDetails(dndTile); mTestableLooper.processAllMessages(); verify(mCallback).onShowingDetail(any(), anyInt(), anyInt()); @@ -159,53 +140,19 @@ public class QSPanelTest extends SysuiTestCase { @Test public void setListening() { - when(dndTile.getTileSpec()).thenReturn("dnd"); - - mQsPanel.setListening(true); + mQsPanel.setListening(true, "dnd"); verify(mQSLogger).logAllTilesChangeListening(true, mQsPanel.getDumpableTag(), "dnd"); - mQsPanel.setListening(false); + mQsPanel.setListening(false, "dnd"); verify(mQSLogger).logAllTilesChangeListening(false, mQsPanel.getDumpableTag(), "dnd"); } -/* @Test + @Test public void testOpenDetailsWithNullParameter_NoException() { mTestableLooper.processAllMessages(); mQsPanel.openDetails(null); mTestableLooper.processAllMessages(); verify(mCallback, never()).onShowingDetail(any(), anyInt(), anyInt()); - }*/ - - @Test - public void testOpenDetailsWithNonExistingTile_NoException() { - mTestableLooper.processAllMessages(); - mQsPanel.openDetails("invalid-name"); - mTestableLooper.processAllMessages(); - - verify(mCallback, never()).onShowingDetail(any(), anyInt(), anyInt()); - } - - @Test - public void testDump() { - String mockTileViewString = "Mock Tile View"; - String mockTileString = "Mock Tile"; - doAnswer(invocation -> { - PrintWriter pw = invocation.getArgument(1); - pw.println(mockTileString); - return null; - }).when(dndTile).dump(any(FileDescriptor.class), any(PrintWriter.class), - any(String[].class)); - when(mQSTileView.toString()).thenReturn(mockTileViewString); - - StringWriter w = new StringWriter(); - PrintWriter pw = new PrintWriter(w); - mQsPanel.dump(mock(FileDescriptor.class), pw, new String[]{}); - String expected = "QSPanel:\n" - + " Tile records:\n" - + " " + mockTileString + "\n" - + " " + mockTileViewString + "\n"; - assertEquals(expected, w.getBuffer().toString()); } - } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/TileLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/TileLayoutTest.java index fef47bd6a392..6c7c20a15140 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/TileLayoutTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/TileLayoutTest.java @@ -57,8 +57,8 @@ public class TileLayoutTest extends SysuiTestCase { mContext.getResources().getDimensionPixelSize(R.dimen.qs_tile_margin_horizontal) * 3; } - private QSPanel.TileRecord createTileRecord() { - QSPanel.TileRecord tileRecord = new QSPanel.TileRecord(); + private QSPanelControllerBase.TileRecord createTileRecord() { + QSPanelControllerBase.TileRecord tileRecord = new QSPanelControllerBase.TileRecord(); tileRecord.tile = mock(QSTile.class); tileRecord.tileView = spy(new QSTileView(mContext, new QSIconViewImpl(mContext))); return tileRecord; @@ -66,14 +66,14 @@ public class TileLayoutTest extends SysuiTestCase { @Test public void testAddTile_CallsSetListeningOnTile() { - QSPanel.TileRecord tileRecord = createTileRecord(); + QSPanelControllerBase.TileRecord tileRecord = createTileRecord(); mTileLayout.addTile(tileRecord); verify(tileRecord.tile, times(1)).setListening(mTileLayout, false); } @Test public void testSetListening_CallsSetListeningOnTile() { - QSPanel.TileRecord tileRecord = createTileRecord(); + QSPanelControllerBase.TileRecord tileRecord = createTileRecord(); mTileLayout.addTile(tileRecord); mTileLayout.setListening(true); verify(tileRecord.tile, times(1)).setListening(mTileLayout, true); @@ -81,7 +81,7 @@ public class TileLayoutTest extends SysuiTestCase { @Test public void testSetListening_SameValueIsNoOp() { - QSPanel.TileRecord tileRecord = createTileRecord(); + QSPanelControllerBase.TileRecord tileRecord = createTileRecord(); mTileLayout.addTile(tileRecord); mTileLayout.setListening(false); verify(tileRecord.tile, times(1)).setListening(any(), anyBoolean()); @@ -89,7 +89,7 @@ public class TileLayoutTest extends SysuiTestCase { @Test public void testSetListening_ChangesValueForAddingFutureTiles() { - QSPanel.TileRecord tileRecord = createTileRecord(); + QSPanelControllerBase.TileRecord tileRecord = createTileRecord(); mTileLayout.setListening(true); mTileLayout.addTile(tileRecord); verify(tileRecord.tile, times(1)).setListening(mTileLayout, true); @@ -97,7 +97,7 @@ public class TileLayoutTest extends SysuiTestCase { @Test public void testRemoveTile_CallsSetListeningFalseOnTile() { - QSPanel.TileRecord tileRecord = createTileRecord(); + QSPanelControllerBase.TileRecord tileRecord = createTileRecord(); mTileLayout.setListening(true); mTileLayout.addTile(tileRecord); mTileLayout.removeTile(tileRecord); @@ -106,8 +106,8 @@ public class TileLayoutTest extends SysuiTestCase { @Test public void testRemoveAllViews_CallsSetListeningFalseOnAllTiles() { - QSPanel.TileRecord tileRecord1 = createTileRecord(); - QSPanel.TileRecord tileRecord2 = createTileRecord(); + QSPanelControllerBase.TileRecord tileRecord1 = createTileRecord(); + QSPanelControllerBase.TileRecord tileRecord2 = createTileRecord(); mTileLayout.setListening(true); mTileLayout.addTile(tileRecord1); mTileLayout.addTile(tileRecord2); @@ -118,7 +118,7 @@ public class TileLayoutTest extends SysuiTestCase { @Test public void testMeasureLayout_CallsLayoutOnTile() { - QSPanel.TileRecord tileRecord = createTileRecord(); + QSPanelControllerBase.TileRecord tileRecord = createTileRecord(); mTileLayout.addTile(tileRecord); mTileLayout.measure(mLayoutSizeForOneTile, mLayoutSizeForOneTile); mTileLayout.layout(0, 0, mLayoutSizeForOneTile, mLayoutSizeForOneTile); @@ -127,8 +127,8 @@ public class TileLayoutTest extends SysuiTestCase { @Test public void testMeasureLayout_CallsLayoutOnTilesWithNeighboredBounds() { - QSPanel.TileRecord tileRecord1 = createTileRecord(); - QSPanel.TileRecord tileRecord2 = createTileRecord(); + QSPanelControllerBase.TileRecord tileRecord1 = createTileRecord(); + QSPanelControllerBase.TileRecord tileRecord2 = createTileRecord(); mTileLayout.addTile(tileRecord1); mTileLayout.addTile(tileRecord2); mTileLayout.measure(mLayoutSizeForOneTile * 2, mLayoutSizeForOneTile * 2); diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScrollCaptureTest.java b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScrollCaptureTest.java index e7ef64e6adad..2b3ca7c00a49 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScrollCaptureTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScrollCaptureTest.java @@ -25,8 +25,8 @@ import android.os.RemoteException; import android.testing.AndroidTestingRunner; import android.util.Log; import android.view.Display; -import android.view.IScrollCaptureClient; -import android.view.IScrollCaptureController; +import android.view.IScrollCaptureCallbacks; +import android.view.IScrollCaptureConnection; import android.view.IWindowManager; import android.view.WindowManagerGlobal; @@ -65,19 +65,20 @@ public class ScrollCaptureTest extends SysuiTestCase { final CountDownLatch latch = new CountDownLatch(1); try { wms.requestScrollCapture(Display.DEFAULT_DISPLAY, null, -1, - new IScrollCaptureController.Stub() { + new IScrollCaptureCallbacks.Stub() { @Override - public void onClientConnected( - IScrollCaptureClient client, Rect scrollBounds, + public void onConnected( + IScrollCaptureConnection connection, Rect scrollBounds, Point positionInWindow) { Log.d(TAG, - "client connected: " + client + "[scrollBounds= " + scrollBounds - + ", positionInWindow=" + positionInWindow + "]"); + "client connected: " + connection + "[scrollBounds= " + + scrollBounds + ", " + + "positionInWindow=" + positionInWindow + "]"); latch.countDown(); } @Override - public void onClientUnavailable() { + public void onUnavailable() { } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java index 8f1d71c80e2d..891179c32315 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java @@ -96,8 +96,8 @@ public class ExpandableNotificationRowTest extends SysuiTestCase { mGroupRow.setSensitive(true, true); mGroupRow.setHideSensitive(true, false, 0, 0); mGroupRow.setHideSensitive(false, true, 0, 0); - assertTrue(mGroupRow.getChildrenContainer().getVisibleHeader().getVisibility() - == View.VISIBLE); + assertEquals(View.VISIBLE, mGroupRow.getChildrenContainer().getVisibleWrapper() + .getNotificationHeader().getVisibility()); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainerTest.java index b9055ec0bb7b..7c41abba6176 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainerTest.java @@ -57,7 +57,7 @@ public class NotificationChildrenContainerTest extends SysuiTestCase { public void testGetMaxAllowedVisibleChildren_lowPriority() { mChildrenContainer.setIsLowPriority(true); Assert.assertEquals(mChildrenContainer.getMaxAllowedVisibleChildren(), - NotificationChildrenContainer.NUMBER_OF_CHILDREN_WHEN_SYSTEM_EXPANDED); + NotificationChildrenContainer.NUMBER_OF_CHILDREN_WHEN_SYSTEM_EXPANDED); } @Test @@ -72,7 +72,7 @@ public class NotificationChildrenContainerTest extends SysuiTestCase { mChildrenContainer.setIsLowPriority(true); mChildrenContainer.setChildrenExpanded(true); Assert.assertEquals(mChildrenContainer.getMaxAllowedVisibleChildren(), - NotificationChildrenContainer.NUMBER_OF_CHILDREN_WHEN_SYSTEM_EXPANDED); + NotificationChildrenContainer.NUMBER_OF_CHILDREN_WHEN_SYSTEM_EXPANDED); } @Test @@ -80,13 +80,13 @@ public class NotificationChildrenContainerTest extends SysuiTestCase { mChildrenContainer.setIsLowPriority(true); mChildrenContainer.setUserLocked(true); Assert.assertEquals(mChildrenContainer.getMaxAllowedVisibleChildren(), - NotificationChildrenContainer.NUMBER_OF_CHILDREN_WHEN_SYSTEM_EXPANDED); + NotificationChildrenContainer.NUMBER_OF_CHILDREN_WHEN_SYSTEM_EXPANDED); } @Test public void testGetMaxAllowedVisibleChildren_likeCollapsed() { Assert.assertEquals(mChildrenContainer.getMaxAllowedVisibleChildren(true), - NotificationChildrenContainer.NUMBER_OF_CHILDREN_WHEN_COLLAPSED); + NotificationChildrenContainer.NUMBER_OF_CHILDREN_WHEN_COLLAPSED); } @@ -136,12 +136,13 @@ public class NotificationChildrenContainerTest extends SysuiTestCase { @Test public void testLowPriorityHeaderCleared() { mGroup.setIsLowPriority(true); - NotificationHeaderView lowPriorityHeaderView = mChildrenContainer.getLowPriorityHeaderView(); - Assert.assertTrue(lowPriorityHeaderView.getVisibility() == View.VISIBLE); - Assert.assertTrue(lowPriorityHeaderView.getParent() == mChildrenContainer); + NotificationHeaderView lowPriorityHeaderView = + mChildrenContainer.getLowPriorityViewWrapper().getNotificationHeader(); + Assert.assertEquals(View.VISIBLE, lowPriorityHeaderView.getVisibility()); + Assert.assertSame(mChildrenContainer, lowPriorityHeaderView.getParent()); mGroup.setIsLowPriority(false); - Assert.assertTrue(lowPriorityHeaderView.getParent() == null); - Assert.assertTrue(mChildrenContainer.getLowPriorityHeaderView() == null); + Assert.assertNull(lowPriorityHeaderView.getParent()); + Assert.assertNull(mChildrenContainer.getLowPriorityViewWrapper()); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeTunerService.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeTunerService.java index 8db82e2a52fc..97d4aa7e4d19 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeTunerService.java +++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeTunerService.java @@ -14,7 +14,7 @@ package com.android.systemui.utils.leaks; -import android.content.Context; +import android.os.UserHandle; import android.testing.LeakCheck; import com.android.systemui.tuner.TunerService; @@ -22,8 +22,10 @@ import com.android.systemui.tuner.TunerService; public class FakeTunerService extends TunerService { private final BaseLeakChecker<Tunable> mBaseLeakChecker; + private boolean mEnabled; public FakeTunerService(LeakCheck test) { + super(null); mBaseLeakChecker = new BaseLeakChecker<>(test, "tunable"); } @@ -74,4 +76,14 @@ public class FakeTunerService extends TunerService { public void setValue(String setting, int value) { } + + @Override + public void setTunerEnabled(UserHandle user, boolean enabled) { + mEnabled = enabled; + } + + @Override + public boolean isTunerEnabled(UserHandle user) { + return mEnabled; + } } diff --git a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java index a167ab16f944..d6d4e4f6c746 100644 --- a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java +++ b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java @@ -150,6 +150,8 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ private boolean mRequestTwoFingerPassthrough; + private boolean mSendMotionEvents; + boolean mRequestFilterKeyEvents; boolean mRetrieveInteractiveWindows; @@ -329,6 +331,8 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ & AccessibilityServiceInfo.FLAG_REQUEST_MULTI_FINGER_GESTURES) != 0; mRequestTwoFingerPassthrough = (info.flags & AccessibilityServiceInfo.FLAG_REQUEST_2_FINGER_PASSTHROUGH) != 0; + mSendMotionEvents = + (info.flags & AccessibilityServiceInfo.FLAG_SEND_MOTION_EVENTS) != 0; mRequestFilterKeyEvents = (info.flags & AccessibilityServiceInfo.FLAG_REQUEST_FILTER_KEY_EVENTS) != 0; mRetrieveInteractiveWindows = (info.flags @@ -1780,6 +1784,10 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ return mRequestTwoFingerPassthrough; } + public boolean isSendMotionEventsEnabled() { + return mSendMotionEvents; + } + @Override public void setGestureDetectionPassthroughRegion(int displayId, Region region) { mSystemSupport.setGestureDetectionPassthroughRegion(displayId, region); diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java index cd9ab8db0854..857ac6ae62a9 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java @@ -119,12 +119,19 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo static final int FLAG_REQUEST_MULTI_FINGER_GESTURES = 0x00000100; /** - * Flag for enabling multi-finger gestures. + * Flag for enabling two-finger passthrough when multi-finger gestures are enabled. * * @see #setUserAndEnabledFeatures(int, int) */ static final int FLAG_REQUEST_2_FINGER_PASSTHROUGH = 0x00000200; + /** + * Flag for including motion events when dispatching a gesture. + * + * @see #setUserAndEnabledFeatures(int, int) + */ + static final int FLAG_SEND_MOTION_EVENTS = 0x00000400; + static final int FEATURES_AFFECTING_MOTION_EVENTS = FLAG_FEATURE_INJECT_MOTION_EVENTS | FLAG_FEATURE_AUTOCLICK @@ -432,6 +439,9 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo if ((mEnabledFeatures & FLAG_REQUEST_2_FINGER_PASSTHROUGH) != 0) { explorer.setTwoFingerPassthroughEnabled(true); } + if ((mEnabledFeatures & FLAG_SEND_MOTION_EVENTS) != 0) { + explorer.setSendMotionEventsEnabled(true); + } addFirstEventHandler(displayId, explorer); mTouchExplorer.put(displayId, explorer); } diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index e1c499389ec5..35481a282701 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -1867,6 +1867,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub if (userState.isFilterKeyEventsEnabledLocked()) { flags |= AccessibilityInputFilter.FLAG_FEATURE_FILTER_KEY_EVENTS; } + if (userState.isSendMotionEventsEnabled()) { + flags |= AccessibilityInputFilter.FLAG_SEND_MOTION_EVENTS; + } + if (userState.isAutoclickEnabledLocked()) { flags |= AccessibilityInputFilter.FLAG_FEATURE_AUTOCLICK; } @@ -2147,6 +2151,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub boolean serviceHandlesDoubleTapEnabled = false; boolean requestMultiFingerGestures = false; boolean requestTwoFingerPassthrough = false; + boolean sendMotionEvents = false; final int serviceCount = userState.mBoundServices.size(); for (int i = 0; i < serviceCount; i++) { AccessibilityServiceConnection service = userState.mBoundServices.get(i); @@ -2155,6 +2160,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub serviceHandlesDoubleTapEnabled = service.isServiceHandlesDoubleTapEnabled(); requestMultiFingerGestures = service.isMultiFingerGesturesEnabled(); requestTwoFingerPassthrough = service.isTwoFingerPassthroughEnabled(); + sendMotionEvents = service.isSendMotionEventsEnabled(); break; } } @@ -2172,6 +2178,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub userState.setServiceHandlesDoubleTapLocked(serviceHandlesDoubleTapEnabled); userState.setMultiFingerGesturesLocked(requestMultiFingerGestures); userState.setTwoFingerPassthroughLocked(requestTwoFingerPassthrough); + userState.setSendMotionEventsEnabled(sendMotionEvents); } private boolean readAccessibilityShortcutKeySettingLocked(AccessibilityUserState userState) { diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java index 4c9e44403026..240c7ff061c8 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java @@ -111,6 +111,7 @@ class AccessibilityUserState { private boolean mServiceHandlesDoubleTap; private boolean mRequestMultiFingerGestures; private boolean mRequestTwoFingerPassthrough; + private boolean mSendMotionEventsEnabled; private int mUserInteractiveUiTimeout; private int mUserNonInteractiveUiTimeout; private int mNonInteractiveUiTimeout = 0; @@ -171,6 +172,7 @@ class AccessibilityUserState { mServiceHandlesDoubleTap = false; mRequestMultiFingerGestures = false; mRequestTwoFingerPassthrough = false; + mSendMotionEventsEnabled = false; mIsDisplayMagnificationEnabled = false; mIsAutoclickEnabled = false; mUserNonInteractiveUiTimeout = 0; @@ -460,6 +462,7 @@ class AccessibilityUserState { .append(String.valueOf(mRequestMultiFingerGestures)); pw.append(", requestTwoFingerPassthrough=") .append(String.valueOf(mRequestTwoFingerPassthrough)); + pw.append(", sendMotionEventsEnabled").append(String.valueOf(mSendMotionEventsEnabled)); pw.append(", displayMagnificationEnabled=").append(String.valueOf( mIsDisplayMagnificationEnabled)); pw.append(", autoclickEnabled=").append(String.valueOf(mIsAutoclickEnabled)); @@ -802,6 +805,13 @@ class AccessibilityUserState { mRequestTwoFingerPassthrough = enabled; } + public boolean isSendMotionEventsEnabled() { + return mSendMotionEventsEnabled; + } + + public void setSendMotionEventsEnabled(boolean mode) { + mSendMotionEventsEnabled = mode; + } public int getUserInteractiveUiTimeoutLocked() { return mUserInteractiveUiTimeout; diff --git a/services/accessibility/java/com/android/server/accessibility/gestures/GestureManifold.java b/services/accessibility/java/com/android/server/accessibility/gestures/GestureManifold.java index 14af8c63073e..2c38dc330a62 100644 --- a/services/accessibility/java/com/android/server/accessibility/gestures/GestureManifold.java +++ b/services/accessibility/java/com/android/server/accessibility/gestures/GestureManifold.java @@ -99,11 +99,15 @@ class GestureManifold implements GestureMatcher.StateChangeListener { boolean mMultiFingerGesturesEnabled; // Whether the two-finger passthrough is enabled when multi-finger gestures are enabled. private boolean mTwoFingerPassthroughEnabled; + // Whether to send the motion events during gesture dispatch. + private boolean mSendMotionEventsEnabled = false; // A list of all the multi-finger gestures, for easy adding and removal. private final List<GestureMatcher> mMultiFingerGestures = new ArrayList<>(); // A list of two-finger swipes, for easy adding and removal when turning on or off two-finger // passthrough. private final List<GestureMatcher> mTwoFingerSwipes = new ArrayList<>(); + // The list of motion events for the current gesture. + private List<MotionEvent> mEvents = new ArrayList<>(); // Shared state information. private TouchState mState; @@ -230,6 +234,9 @@ class GestureManifold implements GestureMatcher.StateChangeListener { return false; } } + if (mSendMotionEventsEnabled) { + mEvents.add(MotionEvent.obtainNoHistory(rawEvent)); + } for (GestureMatcher matcher : mGestures) { if (matcher.getState() != GestureMatcher.STATE_GESTURE_CANCELED) { if (DEBUG) { @@ -240,9 +247,8 @@ class GestureManifold implements GestureMatcher.StateChangeListener { Slog.d(LOG_TAG, matcher.toString()); } if (matcher.getState() == GestureMatcher.STATE_GESTURE_COMPLETED) { - // Here we just clear and return. The actual gesture dispatch is done in + // Here we just return. The actual gesture dispatch is done in // onStateChanged(). - clear(); // No need to process this event any further. return true; } @@ -255,6 +261,11 @@ class GestureManifold implements GestureMatcher.StateChangeListener { for (GestureMatcher matcher : mGestures) { matcher.clear(); } + if (mEvents != null) { + while (mEvents.size() > 0) { + mEvents.remove(0).recycle(); + } + } } /** @@ -340,29 +351,28 @@ class GestureManifold implements GestureMatcher.StateChangeListener { case GESTURE_DOUBLE_TAP: if (mServiceHandlesDoubleTap) { AccessibilityGestureEvent gestureEvent = - new AccessibilityGestureEvent(gestureId, event.getDisplayId()); + new AccessibilityGestureEvent(gestureId, event.getDisplayId(), mEvents); mListener.onGestureCompleted(gestureEvent); } else { mListener.onDoubleTap(event, rawEvent, policyFlags); } - clear(); break; case GESTURE_DOUBLE_TAP_AND_HOLD: if (mServiceHandlesDoubleTap) { AccessibilityGestureEvent gestureEvent = - new AccessibilityGestureEvent(gestureId, event.getDisplayId()); + new AccessibilityGestureEvent(gestureId, event.getDisplayId(), mEvents); mListener.onGestureCompleted(gestureEvent); } else { mListener.onDoubleTapAndHold(event, rawEvent, policyFlags); } - clear(); break; default: AccessibilityGestureEvent gestureEvent = - new AccessibilityGestureEvent(gestureId, event.getDisplayId()); + new AccessibilityGestureEvent(gestureId, event.getDisplayId(), mEvents); mListener.onGestureCompleted(gestureEvent); break; } + clear(); } public boolean isMultiFingerGesturesEnabled() { @@ -406,4 +416,25 @@ class GestureManifold implements GestureMatcher.StateChangeListener { public boolean isServiceHandlesDoubleTapEnabled() { return mServiceHandlesDoubleTap; } + + public void setSendMotionEventsEnabled(boolean mode) { + mSendMotionEventsEnabled = mode; + if (!mode) { + while (mEvents.size() > 0) { + mEvents.remove(0).recycle(); + } + } + } + + public boolean isSendMotionEventsEnabled() { + return mSendMotionEventsEnabled; + } + + /** + * Returns the current list of motion events. It is the caller's responsibility to copy the list + * if they want it to persist after a call to clear(). + */ + public List<MotionEvent> getMotionEvents() { + return mEvents; + } } diff --git a/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java b/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java index d8c692b88a0f..5460e80a2802 100644 --- a/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java +++ b/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java @@ -37,6 +37,7 @@ import static android.view.accessibility.AccessibilityEvent.TYPE_VIEW_HOVER_EXIT import static com.android.server.accessibility.gestures.TouchState.ALL_POINTER_ID_BITS; import android.accessibilityservice.AccessibilityGestureEvent; +import android.accessibilityservice.AccessibilityService; import android.annotation.NonNull; import android.content.Context; import android.graphics.Region; @@ -340,6 +341,14 @@ public class TouchExplorer extends BaseEventStreamTransformation public void onDoubleTapAndHold(MotionEvent event, MotionEvent rawEvent, int policyFlags) { if (mDispatcher.longPressWithTouchEvents(event, policyFlags)) { sendHoverExitAndTouchExplorationGestureEndIfNeeded(policyFlags); + if (isSendMotionEventsEnabled()) { + AccessibilityGestureEvent gestureEvent = + new AccessibilityGestureEvent( + AccessibilityService.GESTURE_DOUBLE_TAP_AND_HOLD, + event.getDisplayId(), + mGestureDetector.getMotionEvents()); + mAms.onGesture(gestureEvent); + } mState.startDelegating(); } } @@ -350,7 +359,14 @@ public class TouchExplorer extends BaseEventStreamTransformation // Remove pending event deliveries. mSendHoverEnterAndMoveDelayed.cancel(); mSendHoverExitDelayed.cancel(); - + if (isSendMotionEventsEnabled()) { + AccessibilityGestureEvent gestureEvent = + new AccessibilityGestureEvent( + AccessibilityService.GESTURE_DOUBLE_TAP, + event.getDisplayId(), + mGestureDetector.getMotionEvents()); + mAms.onGesture(gestureEvent); + } if (mSendTouchExplorationEndDelayed.isPending()) { mSendTouchExplorationEndDelayed.forceSendAndRemove(); } @@ -385,6 +401,9 @@ public class TouchExplorer extends BaseEventStreamTransformation @Override public boolean onGestureCompleted(AccessibilityGestureEvent gestureEvent) { + if (DEBUG) { + Slog.d(LOG_TAG, "Dispatching gesture event:" + gestureEvent.toString()); + } endGestureDetection(true); mSendTouchInteractionEndDelayed.cancel(); mAms.onGesture(gestureEvent); @@ -411,12 +430,24 @@ public class TouchExplorer extends BaseEventStreamTransformation mDispatcher.sendMotionEvent( event, ACTION_HOVER_MOVE, - mState.getLastReceivedEvent(), + event, pointerIdBits, policyFlags); return true; } } + if (isSendMotionEventsEnabled()) { + // Send a gesture with motion events to represent the cancelled gesture. + AccessibilityGestureEvent gestureEvent = + new AccessibilityGestureEvent( + AccessibilityService.GESTURE_UNKNOWN, + event.getDisplayId(), + mGestureDetector.getMotionEvents()); + if (DEBUG) { + Slog.d(LOG_TAG, "Dispatching gesture event:" + gestureEvent.toString()); + } + mAms.onGesture(gestureEvent); + } return false; } @@ -620,6 +651,14 @@ public class TouchExplorer extends BaseEventStreamTransformation if (isDraggingGesture(event)) { // Two pointers moving in the same direction within // a given distance perform a drag. + if (isSendMotionEventsEnabled()) { + AccessibilityGestureEvent gestureEvent = + new AccessibilityGestureEvent( + AccessibilityService.GESTURE_PASSTHROUGH, + event.getDisplayId(), + mGestureDetector.getMotionEvents()); + mAms.onGesture(gestureEvent); + } computeDraggingPointerIdIfNeeded(event); pointerIdBits = 1 << mDraggingPointerId; event.setEdgeFlags(mReceivedPointerTracker.getLastReceivedDownEdgeFlags()); @@ -636,6 +675,14 @@ public class TouchExplorer extends BaseEventStreamTransformation mState.startDragging(); } else { // Two pointers moving arbitrary are delegated to the view hierarchy. + if (isSendMotionEventsEnabled()) { + AccessibilityGestureEvent gestureEvent = + new AccessibilityGestureEvent( + AccessibilityService.GESTURE_PASSTHROUGH, + event.getDisplayId(), + mGestureDetector.getMotionEvents()); + mAms.onGesture(gestureEvent); + } mState.startDelegating(); mDispatcher.sendDownForAllNotInjectedPointers(event, policyFlags); } @@ -650,6 +697,14 @@ public class TouchExplorer extends BaseEventStreamTransformation if (DEBUG) { Slog.d(LOG_TAG, "Three-finger edge swipe detected."); } + if (isSendMotionEventsEnabled()) { + AccessibilityGestureEvent gestureEvent = + new AccessibilityGestureEvent( + AccessibilityService.GESTURE_PASSTHROUGH, + event.getDisplayId(), + mGestureDetector.getMotionEvents()); + mAms.onGesture(gestureEvent); + } mState.startDelegating(); if (mState.isTouchExploring()) { mDispatcher.sendDownForAllNotInjectedPointers(event, @@ -663,6 +718,14 @@ public class TouchExplorer extends BaseEventStreamTransformation } } else { // More than two pointers are delegated to the view hierarchy. + if (isSendMotionEventsEnabled()) { + AccessibilityGestureEvent gestureEvent = + new AccessibilityGestureEvent( + AccessibilityService.GESTURE_PASSTHROUGH, + event.getDisplayId(), + mGestureDetector.getMotionEvents()); + mAms.onGesture(gestureEvent); + } mState.startDelegating(); event = MotionEvent.obtainNoHistory(event); mDispatcher.sendDownForAllNotInjectedPointers(event, policyFlags); @@ -1109,6 +1172,7 @@ public class TouchExplorer extends BaseEventStreamTransformation public void setTwoFingerPassthroughEnabled(boolean enabled) { mGestureDetector.setTwoFingerPassthroughEnabled(enabled); } + public void setGestureDetectionPassthroughRegion(Region region) { mGestureDetectionPassthroughRegion = region; } @@ -1117,6 +1181,17 @@ public class TouchExplorer extends BaseEventStreamTransformation mTouchExplorationPassthroughRegion = region; } + /** + * Whether to send the motion events that make up each gesture to the accessibility service. + */ + public void setSendMotionEventsEnabled(boolean mode) { + mGestureDetector.setSendMotionEventsEnabled(mode); + } + + public boolean isSendMotionEventsEnabled() { + return mGestureDetector.isSendMotionEventsEnabled(); + } + private boolean shouldPerformGestureDetection(MotionEvent event) { if (mState.isDelegating()) { return false; @@ -1213,7 +1288,14 @@ public class TouchExplorer extends BaseEventStreamTransformation public void run() { // Send an accessibility event to announce the touch exploration start. mDispatcher.sendAccessibilityEvent(TYPE_TOUCH_EXPLORATION_GESTURE_START); - + if (isSendMotionEventsEnabled()) { + AccessibilityGestureEvent gestureEvent = + new AccessibilityGestureEvent( + AccessibilityService.GESTURE_TOUCH_EXPLORATION, + mState.getLastReceivedEvent().getDisplayId(), + mGestureDetector.getMotionEvents()); + mAms.onGesture(gestureEvent); + } if (!mEvents.isEmpty() && !mRawEvents.isEmpty()) { // Deliver a down event. mDispatcher.sendMotionEvent(mEvents.get(0), ACTION_HOVER_ENTER, diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index 35312a3a2fac..1c4d752c9775 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -664,8 +664,12 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku if (targetWidget != null && targetWidget != widget) continue; PendingIntent intent = null; if (onClickIntent != null) { + // Rare informational activity click is okay being + // immutable; the tradeoff is more security in exchange for + // losing bounds-based window animations intent = PendingIntent.getActivity(mContext, widget.appWidgetId, - onClickIntent, PendingIntent.FLAG_UPDATE_CURRENT); + onClickIntent, + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); } RemoteViews views = createMaskedWidgetRemoteViews(iconBitmap, showBadge, intent); if (widget.replaceWithMaskedViewsLocked(views)) { @@ -2409,8 +2413,10 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku intent.setComponent(provider.info.provider); final long token = Binder.clearCallingIdentity(); try { + // Broadcast alarms sent by system are immutable provider.broadcast = PendingIntent.getBroadcastAsUser(mContext, 1, intent, - PendingIntent.FLAG_UPDATE_CURRENT, provider.info.getProfile()); + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE, + provider.info.getProfile()); } finally { Binder.restoreCallingIdentity(token); } diff --git a/services/autofill/java/com/android/server/autofill/AutofillInlineSessionController.java b/services/autofill/java/com/android/server/autofill/AutofillInlineSessionController.java index c25dd37bc7d9..dd5e58a94d15 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillInlineSessionController.java +++ b/services/autofill/java/com/android/server/autofill/AutofillInlineSessionController.java @@ -35,8 +35,8 @@ import java.util.function.Consumer; * Controls the interaction with the IME for the {@link AutofillInlineSuggestionsRequestSession}s. * * <p>The class maintains the inline suggestion session with the autofill service. There is at most - * one active inline suggestion session at any given corresponding to one focused view. - * New sessions are created only when {@link #onCreateInlineSuggestionsRequestLocked} is called.</p> + * one active inline suggestion session at any given corresponding to one focused view. New + * sessions are created only when {@link #onCreateInlineSuggestionsRequestLocked} is called.</p> * * <p>The class manages the interaction between the {@link com.android.server.autofill.Session} and * the inline suggestion session whenever inline suggestions can be provided. All calls to the @@ -83,7 +83,6 @@ final class AutofillInlineSessionController { @GuardedBy("mLock") void onCreateInlineSuggestionsRequestLocked(@NonNull AutofillId autofillId, @NonNull Consumer<InlineSuggestionsRequest> requestConsumer, @NonNull Bundle uiExtras) { - // TODO(b/151123764): rename the method to better reflect what it does. if (mSession != null) { // Destroy the existing session. mSession.destroySessionLocked(); diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java index c563b6c11d86..864ead1485b5 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java @@ -1055,7 +1055,7 @@ final class AutofillManagerServiceImpl pw.println(compatPkgs); } pw.print(prefix); pw.print("Inline Suggestions Enabled: "); - pw.println(isInlineSuggestionsEnabled()); + pw.println(isInlineSuggestionsEnabledLocked()); pw.print(prefix); pw.print("Last prune: "); pw.println(mLastPrune); mDisabledInfoCache.dump(mUserId, prefix, pw); @@ -1168,7 +1168,7 @@ final class AutofillManagerServiceImpl } @GuardedBy("mLock") - boolean isInlineSuggestionsEnabled() { + boolean isInlineSuggestionsEnabledLocked() { if (mInfo != null) { return mInfo.isInlineSuggestionsEnabled(); } diff --git a/services/autofill/java/com/android/server/autofill/Helper.java b/services/autofill/java/com/android/server/autofill/Helper.java index 80b0375a229d..e35c0ee4e59b 100644 --- a/services/autofill/java/com/android/server/autofill/Helper.java +++ b/services/autofill/java/com/android/server/autofill/Helper.java @@ -24,6 +24,9 @@ import android.app.assist.AssistStructure.WindowNode; import android.content.ComponentName; import android.metrics.LogMaker; import android.service.autofill.Dataset; +import android.service.autofill.InternalSanitizer; +import android.service.autofill.SaveInfo; +import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Slog; @@ -38,6 +41,7 @@ import com.android.internal.util.ArrayUtils; import java.io.PrintWriter; import java.util.ArrayDeque; import java.util.ArrayList; +import java.util.Arrays; public final class Helper { @@ -234,6 +238,46 @@ public final class Helper { } } + @Nullable + static ArrayMap<AutofillId, InternalSanitizer> createSanitizers(@Nullable SaveInfo saveInfo) { + if (saveInfo == null) return null; + + final InternalSanitizer[] sanitizerKeys = saveInfo.getSanitizerKeys(); + if (sanitizerKeys == null) return null; + + final int size = sanitizerKeys.length; + final ArrayMap<AutofillId, InternalSanitizer> sanitizers = new ArrayMap<>(size); + if (sDebug) Slog.d(TAG, "Service provided " + size + " sanitizers"); + final AutofillId[][] sanitizerValues = saveInfo.getSanitizerValues(); + for (int i = 0; i < size; i++) { + final InternalSanitizer sanitizer = sanitizerKeys[i]; + final AutofillId[] ids = sanitizerValues[i]; + if (sDebug) { + Slog.d(TAG, "sanitizer #" + i + " (" + sanitizer + ") for ids " + + Arrays.toString(ids)); + } + for (AutofillId id : ids) { + sanitizers.put(id, sanitizer); + } + } + return sanitizers; + } + + /** + * Returns true if {@code s1} contains all characters of {@code s2}, in order. + */ + static boolean containsCharsInOrder(String s1, String s2) { + int prevIndex = -1; + for (char ch : s2.toCharArray()) { + int index = TextUtils.indexOf(s1, ch, prevIndex + 1); + if (index == -1) { + return false; + } + prevIndex = index; + } + return true; + } + private interface ViewNodeFilter { boolean matches(ViewNode node); } diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index 6c9d35cb2fef..f596b072d713 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -30,6 +30,8 @@ import static android.view.autofill.AutofillManager.FLAG_SMART_SUGGESTION_SYSTEM import static android.view.autofill.AutofillManager.getSmartSuggestionModeToString; import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; +import static com.android.server.autofill.Helper.containsCharsInOrder; +import static com.android.server.autofill.Helper.createSanitizers; import static com.android.server.autofill.Helper.getNumericValue; import static com.android.server.autofill.Helper.sDebug; import static com.android.server.autofill.Helper.sVerbose; @@ -117,7 +119,6 @@ import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Optional; -import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; import java.util.function.Function; @@ -372,26 +373,24 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState * CountDownLatch. */ private final class AssistDataReceiverImpl extends IAssistDataReceiver.Stub { - + @GuardedBy("mLock") + private boolean mWaitForInlineRequest; @GuardedBy("mLock") private InlineSuggestionsRequest mPendingInlineSuggestionsRequest; @GuardedBy("mLock") private FillRequest mPendingFillRequest; - @GuardedBy("mLock") - private CountDownLatch mCountDownLatch = new CountDownLatch(0); @Nullable Consumer<InlineSuggestionsRequest> newAutofillRequestLocked(ViewState viewState, boolean isInlineRequest) { - mCountDownLatch = new CountDownLatch(isInlineRequest ? 2 : 1); mPendingFillRequest = null; + mWaitForInlineRequest = isInlineRequest; mPendingInlineSuggestionsRequest = null; return isInlineRequest ? (inlineSuggestionsRequest) -> { synchronized (mLock) { - if (mCountDownLatch.getCount() == 0) { + if (!mWaitForInlineRequest || mPendingInlineSuggestionsRequest != null) { return; } mPendingInlineSuggestionsRequest = inlineSuggestionsRequest; - mCountDownLatch.countDown(); maybeRequestFillLocked(); viewState.resetState(ViewState.STATE_PENDING_CREATE_INLINE_REQUEST); } @@ -399,16 +398,23 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } void maybeRequestFillLocked() { - if (mCountDownLatch.getCount() > 0 || mPendingFillRequest == null) { + if (mPendingFillRequest == null) { return; } - if (mPendingInlineSuggestionsRequest != null) { + + if (mWaitForInlineRequest) { + if (mPendingInlineSuggestionsRequest == null) { + return; + } + mPendingFillRequest = new FillRequest(mPendingFillRequest.getId(), mPendingFillRequest.getFillContexts(), mPendingFillRequest.getClientState(), mPendingFillRequest.getFlags(), mPendingInlineSuggestionsRequest); } + mRemoteFillService.onFillRequest(mPendingFillRequest); mPendingInlineSuggestionsRequest = null; + mWaitForInlineRequest = false; mPendingFillRequest = null; } @@ -509,15 +515,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState request = new FillRequest(requestId, contexts, mClientState, flags, /*inlineSuggestionsRequest=*/null); - if (mCountDownLatch.getCount() > 0) { - mPendingFillRequest = request; - mCountDownLatch.countDown(); - maybeRequestFillLocked(); - } else { - // TODO(b/151867668): ideally this case should not happen, but it was - // observed, we should figure out why and fix. - mRemoteFillService.onFillRequest(request); - } + mPendingFillRequest = request; + maybeRequestFillLocked(); } if (mActivityToken != null) { @@ -545,6 +544,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState return ids; } + /** + * Returns the String value of an {@link AutofillValue} by {@link AutofillId id} if it is of + * type {@code AUTOFILL_TYPE_TEXT} or {@code AUTOFILL_TYPE_LIST}. + */ @Override @Nullable public String findByAutofillId(@NonNull AutofillId id) { @@ -706,7 +709,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState * Autofill provider). */ private boolean isInlineSuggestionsEnabledByAutofillProviderLocked() { - return mService.isInlineSuggestionsEnabled(); + return mService.isInlineSuggestionsEnabledLocked(); } private boolean isViewFocusedLocked(int flags) { @@ -767,7 +770,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // triggers a new partition and we end up with many duplicate partitions. This is // enhanced as the focus change can be much faster than the taking of the assist structure. // Hence remove the currently queued request and replace it with the one queued after the - // structure is taken. This causes only one fill request per bust of focus changes. + // structure is taken. This causes only one fill request per burst of focus changes. cancelCurrentRequestLocked(); // Only ask IME to create inline suggestions request if Autofill provider supports it and @@ -780,7 +783,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState && isViewFocusedLocked(flags)) { Consumer<InlineSuggestionsRequest> inlineSuggestionsRequestConsumer = mAssistReceiver.newAutofillRequestLocked(viewState, - /*isInlineRequest=*/ true); + /* isInlineRequest= */ true); if (inlineSuggestionsRequestConsumer != null) { final AutofillId focusedId = mCurrentViewId; remoteRenderService.getInlineSuggestionsRendererInfo( @@ -794,8 +797,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState viewState.setState(ViewState.STATE_PENDING_CREATE_INLINE_REQUEST); } } else { - mAssistReceiver.newAutofillRequestLocked(viewState, - /*isInlineRequest=*/ false); + mAssistReceiver.newAutofillRequestLocked(viewState, /* isInlineRequest= */ false); } // Now request the assist structure data. @@ -1172,7 +1174,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState return null; } - // FillServiceCallbacks + // VultureCallback + @Override + public void onServiceDied(@NonNull RemoteFillService service) { + Slog.w(TAG, "removing session because service died"); + forceRemoveSelfLocked(); + } + + // AutoFillUiCallback @Override public void authenticate(int requestId, int datasetIndex, IntentSender intent, Bundle extras, boolean authenticateInline) { @@ -1202,13 +1211,6 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState this, authenticationId, intent, fillInIntent, authenticateInline)); } - // VultureCallback - @Override - public void onServiceDied(@NonNull RemoteFillService service) { - Slog.w(TAG, "removing session because service died"); - forceRemoveSelfLocked(); - } - // AutoFillUiCallback @Override public void fill(int requestId, int datasetIndex, Dataset dataset) { @@ -1282,6 +1284,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } } + // AutoFillUiCallback @Override public void dispatchUnhandledKey(AutofillId id, KeyEvent keyEvent) { synchronized (mLock) { @@ -2281,31 +2284,6 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } @Nullable - private ArrayMap<AutofillId, InternalSanitizer> createSanitizers(@Nullable SaveInfo saveInfo) { - if (saveInfo == null) return null; - - final InternalSanitizer[] sanitizerKeys = saveInfo.getSanitizerKeys(); - if (sanitizerKeys == null) return null; - - final int size = sanitizerKeys.length ; - final ArrayMap<AutofillId, InternalSanitizer> sanitizers = new ArrayMap<>(size); - if (sDebug) Slog.d(TAG, "Service provided " + size + " sanitizers"); - final AutofillId[][] sanitizerValues = saveInfo.getSanitizerValues(); - for (int i = 0; i < size; i++) { - final InternalSanitizer sanitizer = sanitizerKeys[i]; - final AutofillId[] ids = sanitizerValues[i]; - if (sDebug) { - Slog.d(TAG, "sanitizer #" + i + " (" + sanitizer + ") for ids " - + Arrays.toString(ids)); - } - for (AutofillId id : ids) { - sanitizers.put(id, sanitizer); - } - } - return sanitizers; - } - - @Nullable private AutofillValue getSanitizedValue( @Nullable ArrayMap<AutofillId, InternalSanitizer> sanitizers, @NonNull AutofillId id, @@ -2369,12 +2347,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState */ @GuardedBy("mLock") @Nullable - private CharSequence[] getAutofillOptionsFromContextsLocked(AutofillId id) { + private CharSequence[] getAutofillOptionsFromContextsLocked(@NonNull AutofillId autofillId) { final int numContexts = mContexts.size(); - for (int i = numContexts - 1; i >= 0; i--) { final FillContext context = mContexts.get(i); - final ViewNode node = Helper.findViewNodeByAutofillId(context.getStructure(), id); + final ViewNode node = Helper.findViewNodeByAutofillId(context.getStructure(), + autofillId); if (node != null && node.getAutofillOptions() != null) { return node.getAutofillOptions(); } @@ -2480,7 +2458,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // TODO(b/113281366): rather than merge it here, it might be better to simply reuse the old // session instead of creating a new one. But we need to consider what would happen on corner // cases such as "Main Activity M -> activity A with username -> activity B with password" - // If user follows the normal workflow, than session A would be merged with session B as + // If user follows the normal workflow, then session A would be merged with session B as // expected. But if when on Activity A the user taps back or somehow launches another activity, // session A could be merged with the wrong session. /** @@ -2573,11 +2551,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } requestNewFillResponseLocked(viewState, ViewState.STATE_STARTED_PARTITION, flags); return true; - } else { - if (sVerbose) { - Slog.v(TAG, "Not starting new partition for view " + id + ": " - + viewState.getStateAsString()); - } + } + + if (sVerbose) { + Slog.v(TAG, "Not starting new partition for view " + id + ": " + + viewState.getStateAsString()); } return false; } @@ -2938,21 +2916,6 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } } - /** - * Returns true if {@code s1} contains all characters of {@code s2}, in order. - */ - private static boolean containsCharsInOrder(String s1, String s2) { - int prevIndex = -1; - for (char ch : s2.toCharArray()) { - int index = TextUtils.indexOf(s1, ch, prevIndex + 1); - if (index == -1) { - return false; - } - prevIndex = index; - } - return true; - } - @Override public void onFillReady(@NonNull FillResponse response, @NonNull AutofillId filledId, @Nullable AutofillValue value) { @@ -3421,7 +3384,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState mInlineSessionController.getInlineSuggestionsRequestLocked().orElse(null)); } if (mAugmentedAutofillDestroyer == null) { - mAugmentedAutofillDestroyer = () -> remoteService.onDestroyAutofillWindowsRequest(); + mAugmentedAutofillDestroyer = remoteService::onDestroyAutofillWindowsRequest; } return mAugmentedAutofillDestroyer; } diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java index aa8532b67c43..2ff66b564ec9 100644 --- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java +++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java @@ -650,7 +650,7 @@ public class UserBackupManagerService { context, /* requestCode */ 0, initIntent, - /* flags */ 0, + /* flags */ PendingIntent.FLAG_IMMUTABLE, UserHandle.of(userId)); // Set up the backup-request journaling diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 35f119428dc7..cdc06aec0744 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -1169,7 +1169,7 @@ public class ConnectivityService extends IConnectivityManager.Stub mMultipathPolicyTracker = new MultipathPolicyTracker(mContext, mHandler); - mDnsManager = new DnsManager(mContext, mDnsResolver, mSystemProperties); + mDnsManager = new DnsManager(mContext, mDnsResolver); registerPrivateDnsSettingsCallbacks(); } diff --git a/services/core/java/com/android/server/NetworkTimeUpdateService.java b/services/core/java/com/android/server/NetworkTimeUpdateService.java index c34dd984f865..ff2308c35b9f 100644 --- a/services/core/java/com/android/server/NetworkTimeUpdateService.java +++ b/services/core/java/com/android/server/NetworkTimeUpdateService.java @@ -103,7 +103,9 @@ public class NetworkTimeUpdateService extends Binder { mCM = mContext.getSystemService(ConnectivityManager.class); Intent pollIntent = new Intent(ACTION_POLL, null); - mPendingPollIntent = PendingIntent.getBroadcast(mContext, POLL_REQUEST, pollIntent, 0); + // Broadcast alarms sent by system are immutable + mPendingPollIntent = PendingIntent.getBroadcast(mContext, POLL_REQUEST, pollIntent, + PendingIntent.FLAG_IMMUTABLE); mPollingIntervalMs = mContext.getResources().getInteger( com.android.internal.R.integer.config_ntpPollingInterval); diff --git a/services/core/java/com/android/server/SystemServiceManager.java b/services/core/java/com/android/server/SystemServiceManager.java index b87468419430..ff2661b19b48 100644 --- a/services/core/java/com/android/server/SystemServiceManager.java +++ b/services/core/java/com/android/server/SystemServiceManager.java @@ -26,12 +26,14 @@ import android.os.SystemClock; import android.os.Trace; import android.os.UserManagerInternal; import android.util.ArrayMap; +import android.util.EventLog; import android.util.Slog; import android.util.SparseArray; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.Preconditions; import com.android.server.SystemService.TargetUser; +import com.android.server.am.EventLogTags; import com.android.server.utils.TimingsTraceAndSlog; import dalvik.system.PathClassLoader; @@ -53,12 +55,14 @@ public final class SystemServiceManager { private static final int SERVICE_CALL_WARN_TIME_MS = 50; // Constants used on onUser(...) - private static final String START = "Start"; - private static final String UNLOCKING = "Unlocking"; - private static final String UNLOCKED = "Unlocked"; - private static final String SWITCH = "Switch"; - private static final String STOP = "Stop"; - private static final String CLEANUP = "Cleanup"; + // NOTE: do not change their values, as they're used on Trace calls and changes might break + // performance tests that rely on them. + private static final String USER_STARTING = "Start"; + private static final String USER_UNLOCKING = "Unlocking"; + private static final String USER_UNLOCKED = "Unlocked"; + private static final String USER_SWITCHING = "Switch"; + private static final String USER_STOPPING = "Stop"; + private static final String USER_STOPPED = "Cleanup"; private static File sSystemDir; private final Context mContext; @@ -86,7 +90,7 @@ public final class SystemServiceManager { /** * Reference to the current user, it's used to set the {@link TargetUser} on - * {@link #switchUser(int, int)} as the previous user might have been removed already. + * {@link #onUserSwitching(int, int)} as the previous user might have been removed already. */ @GuardedBy("mTargetUsers") private @Nullable TargetUser mCurrentUser; @@ -275,33 +279,38 @@ public final class SystemServiceManager { /** * Starts the given user. */ - public void startUser(@NonNull TimingsTraceAndSlog t, @UserIdInt int userId) { + public void onUserStarting(@NonNull TimingsTraceAndSlog t, @UserIdInt int userId) { + EventLog.writeEvent(EventLogTags.SSM_USER_STARTING, userId); + final TargetUser targetUser = newTargetUser(userId); synchronized (mTargetUsers) { mTargetUsers.put(userId, targetUser); } - onUser(t, START, /* prevUser= */ null, targetUser); + onUser(t, USER_STARTING, /* prevUser= */ null, targetUser); } /** * Unlocks the given user. */ - public void unlockUser(@UserIdInt int userId) { - onUser(UNLOCKING, userId); + public void onUserUnlocking(@UserIdInt int userId) { + EventLog.writeEvent(EventLogTags.SSM_USER_UNLOCKING, userId); + onUser(USER_UNLOCKING, userId); } /** * Called after the user was unlocked. */ public void onUserUnlocked(@UserIdInt int userId) { - onUser(UNLOCKED, userId); + EventLog.writeEvent(EventLogTags.SSM_USER_UNLOCKED, userId); + onUser(USER_UNLOCKED, userId); } /** * Switches to the given user. */ - public void switchUser(@UserIdInt int from, @UserIdInt int to) { + public void onUserSwitching(@UserIdInt int from, @UserIdInt int to) { + EventLog.writeEvent(EventLogTags.SSM_USER_SWITCHING, from, to); final TargetUser curUser, prevUser; synchronized (mTargetUsers) { if (mCurrentUser == null) { @@ -321,21 +330,23 @@ public final class SystemServiceManager { Slog.d(TAG, "Set mCurrentUser to " + mCurrentUser); } } - onUser(TimingsTraceAndSlog.newAsyncLog(), SWITCH, prevUser, curUser); + onUser(TimingsTraceAndSlog.newAsyncLog(), USER_SWITCHING, prevUser, curUser); } /** * Stops the given user. */ - public void stopUser(@UserIdInt int userId) { - onUser(STOP, userId); + public void onUserStopping(@UserIdInt int userId) { + EventLog.writeEvent(EventLogTags.SSM_USER_STOPPING, userId); + onUser(USER_STOPPING, userId); } /** * Cleans up the given user. */ - public void cleanupUser(@UserIdInt int userId) { - onUser(CLEANUP, userId); + public void onUserStopped(@UserIdInt int userId) { + EventLog.writeEvent(EventLogTags.SSM_USER_STOPPED, userId); + onUser(USER_STOPPED, userId); // Remove cached TargetUser synchronized (mTargetUsers) { @@ -351,6 +362,7 @@ public final class SystemServiceManager { private void onUser(@NonNull TimingsTraceAndSlog t, @NonNull String onWhat, @Nullable TargetUser prevUser, @NonNull TargetUser curUser) { final int curUserId = curUser.getUserIdentifier(); + // NOTE: do not change label below, or it might break performance tests that rely on it. t.traceBegin("ssm." + onWhat + "User-" + curUserId); Slog.i(TAG, "Calling on" + onWhat + "User " + curUserId + (prevUser != null ? " (from " + prevUser + ")" : "")); @@ -381,22 +393,22 @@ public final class SystemServiceManager { long time = SystemClock.elapsedRealtime(); try { switch (onWhat) { - case SWITCH: + case USER_SWITCHING: service.onUserSwitching(prevUser, curUser); break; - case START: + case USER_STARTING: service.onUserStarting(curUser); break; - case UNLOCKING: + case USER_UNLOCKING: service.onUserUnlocking(curUser); break; - case UNLOCKED: + case USER_UNLOCKED: service.onUserUnlocked(curUser); break; - case STOP: + case USER_STOPPING: service.onUserStopping(curUser); break; - case CLEANUP: + case USER_STOPPED: service.onUserStopped(curUser); break; default: diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 79a660a48540..63f7d44da1de 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -7361,7 +7361,7 @@ public class ActivityManagerService extends IActivityManager.Stub final boolean bootingSystemUser = currentUserId == UserHandle.USER_SYSTEM; if (bootingSystemUser) { - mSystemServiceManager.startUser(t, currentUserId); + mSystemServiceManager.onUserStarting(t, currentUserId); } synchronized (this) { diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 3eb4ddebaf06..6f706acf1706 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -651,12 +651,13 @@ public final class BatteryStatsService extends IBatteryStats.Stub public void noteWakupAlarm(final String name, final int uid, final WorkSource workSource, final String tag) { enforceCallingPermission(); + final WorkSource localWs = workSource != null ? new WorkSource(workSource) : null; synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { - mStats.noteWakupAlarmLocked(name, uid, workSource, tag, + mStats.noteWakupAlarmLocked(name, uid, localWs, tag, elapsedRealtime, uptime); } }); @@ -665,12 +666,13 @@ public final class BatteryStatsService extends IBatteryStats.Stub public void noteAlarmStart(final String name, final WorkSource workSource, final int uid) { enforceCallingPermission(); + final WorkSource localWs = workSource != null ? new WorkSource(workSource) : null; synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { - mStats.noteAlarmStartLocked(name, workSource, uid, elapsedRealtime, uptime); + mStats.noteAlarmStartLocked(name, localWs, uid, elapsedRealtime, uptime); } }); } @@ -678,12 +680,13 @@ public final class BatteryStatsService extends IBatteryStats.Stub public void noteAlarmFinish(final String name, final WorkSource workSource, final int uid) { enforceCallingPermission(); + final WorkSource localWs = workSource != null ? new WorkSource(workSource) : null; synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { - mStats.noteAlarmFinishLocked(name, workSource, uid, elapsedRealtime, uptime); + mStats.noteAlarmFinishLocked(name, localWs, uid, elapsedRealtime, uptime); } }); } @@ -722,12 +725,13 @@ public final class BatteryStatsService extends IBatteryStats.Stub public void noteStartWakelockFromSource(final WorkSource ws, final int pid, final String name, final String historyName, final int type, final boolean unimportantForLogging) { enforceCallingPermission(); + final WorkSource localWs = ws != null ? new WorkSource(ws) : null; synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { - mStats.noteStartWakeFromSourceLocked(ws, pid, name, historyName, + mStats.noteStartWakeFromSourceLocked(localWs, pid, name, historyName, type, unimportantForLogging, elapsedRealtime, uptime); } }); @@ -739,13 +743,15 @@ public final class BatteryStatsService extends IBatteryStats.Stub final String newName, final String newHistoryName, final int newType, final boolean newUnimportantForLogging) { enforceCallingPermission(); + final WorkSource localWs = ws != null ? new WorkSource(ws) : null; + final WorkSource localNewWs = newWs != null ? new WorkSource(newWs) : null; synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { - mStats.noteChangeWakelockFromSourceLocked(ws, pid, name, historyName, type, - newWs, newPid, newName, newHistoryName, newType, + mStats.noteChangeWakelockFromSourceLocked(localWs, pid, name, historyName, type, + localNewWs, newPid, newName, newHistoryName, newType, newUnimportantForLogging, elapsedRealtime, uptime); } }); @@ -755,12 +761,13 @@ public final class BatteryStatsService extends IBatteryStats.Stub public void noteStopWakelockFromSource(final WorkSource ws, final int pid, final String name, final String historyName, final int type) { enforceCallingPermission(); + final WorkSource localWs = ws != null ? new WorkSource(ws) : null; synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { - mStats.noteStopWakeFromSourceLocked(ws, pid, name, historyName, type, + mStats.noteStopWakeFromSourceLocked(localWs, pid, name, historyName, type, elapsedRealtime, uptime); } }); @@ -787,12 +794,13 @@ public final class BatteryStatsService extends IBatteryStats.Stub public void noteLongPartialWakelockStartFromSource(final String name, final String historyName, final WorkSource workSource) { enforceCallingPermission(); + final WorkSource localWs = workSource != null ? new WorkSource(workSource) : null; synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { - mStats.noteLongPartialWakelockStartFromSource(name, historyName, workSource, + mStats.noteLongPartialWakelockStartFromSource(name, historyName, localWs, elapsedRealtime, uptime); } }); @@ -819,12 +827,13 @@ public final class BatteryStatsService extends IBatteryStats.Stub public void noteLongPartialWakelockFinishFromSource(final String name, final String historyName, final WorkSource workSource) { enforceCallingPermission(); + final WorkSource localWs = workSource != null ? new WorkSource(workSource) : null; synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { - mStats.noteLongPartialWakelockFinishFromSource(name, historyName, workSource, + mStats.noteLongPartialWakelockFinishFromSource(name, historyName, localWs, elapsedRealtime, uptime); } }); @@ -890,12 +899,14 @@ public final class BatteryStatsService extends IBatteryStats.Stub @Override public void noteGpsChanged(final WorkSource oldWs, final WorkSource newWs) { enforceCallingPermission(); + final WorkSource localOldWs = oldWs != null ? new WorkSource(oldWs) : null; + final WorkSource localNewWs = newWs != null ? new WorkSource(newWs) : null; synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { - mStats.noteGpsChangedLocked(oldWs, newWs, elapsedRealtime, uptime); + mStats.noteGpsChangedLocked(localOldWs, localNewWs, elapsedRealtime, uptime); } }); } @@ -1322,12 +1333,13 @@ public final class BatteryStatsService extends IBatteryStats.Stub public void noteWifiRunning(final WorkSource ws) { enforceCallingPermission(); + final WorkSource localWs = ws != null ? new WorkSource(ws) : null; synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { - mStats.noteWifiRunningLocked(ws, elapsedRealtime, uptime); + mStats.noteWifiRunningLocked(localWs, elapsedRealtime, uptime); } // TODO: Log WIFI_RUNNING_STATE_CHANGED in a better spot to include Hotspot too. FrameworkStatsLog.write(FrameworkStatsLog.WIFI_RUNNING_STATE_CHANGED, @@ -1338,12 +1350,15 @@ public final class BatteryStatsService extends IBatteryStats.Stub public void noteWifiRunningChanged(final WorkSource oldWs, final WorkSource newWs) { enforceCallingPermission(); + final WorkSource localOldWs = oldWs != null ? new WorkSource(oldWs) : null; + final WorkSource localNewWs = newWs != null ? new WorkSource(newWs) : null; synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { - mStats.noteWifiRunningChangedLocked(oldWs, newWs, elapsedRealtime, uptime); + mStats.noteWifiRunningChangedLocked( + localOldWs, localNewWs, elapsedRealtime, uptime); } FrameworkStatsLog.write(FrameworkStatsLog.WIFI_RUNNING_STATE_CHANGED, newWs, FrameworkStatsLog.WIFI_RUNNING_STATE_CHANGED__STATE__ON); @@ -1355,12 +1370,13 @@ public final class BatteryStatsService extends IBatteryStats.Stub public void noteWifiStopped(final WorkSource ws) { enforceCallingPermission(); + final WorkSource localWs = ws != null ? new WorkSource(ws) : ws; synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { - mStats.noteWifiStoppedLocked(ws, elapsedRealtime, uptime); + mStats.noteWifiStoppedLocked(localWs, elapsedRealtime, uptime); } FrameworkStatsLog.write(FrameworkStatsLog.WIFI_RUNNING_STATE_CHANGED, ws, FrameworkStatsLog.WIFI_RUNNING_STATE_CHANGED__STATE__OFF); @@ -1487,12 +1503,14 @@ public final class BatteryStatsService extends IBatteryStats.Stub public void noteFullWifiLockAcquiredFromSource(final WorkSource ws) { enforceCallingPermission(); + final WorkSource localWs = ws != null ? new WorkSource(ws) : null; synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { - mStats.noteFullWifiLockAcquiredFromSourceLocked(ws, elapsedRealtime, uptime); + mStats.noteFullWifiLockAcquiredFromSourceLocked( + localWs, elapsedRealtime, uptime); } }); } @@ -1500,12 +1518,14 @@ public final class BatteryStatsService extends IBatteryStats.Stub public void noteFullWifiLockReleasedFromSource(final WorkSource ws) { enforceCallingPermission(); + final WorkSource localWs = ws != null ? new WorkSource(ws) : null; synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { - mStats.noteFullWifiLockReleasedFromSourceLocked(ws, elapsedRealtime, uptime); + mStats.noteFullWifiLockReleasedFromSourceLocked( + localWs, elapsedRealtime, uptime); } }); } @@ -1513,12 +1533,13 @@ public final class BatteryStatsService extends IBatteryStats.Stub public void noteWifiScanStartedFromSource(final WorkSource ws) { enforceCallingPermission(); + final WorkSource localWs = ws != null ? new WorkSource(ws) : null; synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { - mStats.noteWifiScanStartedFromSourceLocked(ws, elapsedRealtime, uptime); + mStats.noteWifiScanStartedFromSourceLocked(localWs, elapsedRealtime, uptime); } }); } @@ -1526,12 +1547,13 @@ public final class BatteryStatsService extends IBatteryStats.Stub public void noteWifiScanStoppedFromSource(final WorkSource ws) { enforceCallingPermission(); + final WorkSource localWs = ws != null ? new WorkSource(ws) : null; synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { - mStats.noteWifiScanStoppedFromSourceLocked(ws, elapsedRealtime, uptime); + mStats.noteWifiScanStoppedFromSourceLocked(localWs, elapsedRealtime, uptime); } }); } @@ -1539,12 +1561,13 @@ public final class BatteryStatsService extends IBatteryStats.Stub public void noteWifiBatchedScanStartedFromSource(final WorkSource ws, final int csph) { enforceCallingPermission(); + final WorkSource localWs = ws != null ? new WorkSource(ws) : null; synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { - mStats.noteWifiBatchedScanStartedFromSourceLocked(ws, csph, + mStats.noteWifiBatchedScanStartedFromSourceLocked(localWs, csph, elapsedRealtime, uptime); } }); @@ -1553,12 +1576,14 @@ public final class BatteryStatsService extends IBatteryStats.Stub public void noteWifiBatchedScanStoppedFromSource(final WorkSource ws) { enforceCallingPermission(); + final WorkSource localWs = ws != null ? new WorkSource(ws) : null; synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { - mStats.noteWifiBatchedScanStoppedFromSourceLocked(ws, elapsedRealtime, uptime); + mStats.noteWifiBatchedScanStoppedFromSourceLocked( + localWs, elapsedRealtime, uptime); } }); } @@ -1635,12 +1660,13 @@ public final class BatteryStatsService extends IBatteryStats.Stub @Override public void noteBleScanStarted(final WorkSource ws, final boolean isUnoptimized) { enforceCallingPermission(); + final WorkSource localWs = ws != null ? new WorkSource(ws) : null; synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { - mStats.noteBluetoothScanStartedFromSourceLocked(ws, isUnoptimized, + mStats.noteBluetoothScanStartedFromSourceLocked(localWs, isUnoptimized, elapsedRealtime, uptime); } }); @@ -1650,12 +1676,13 @@ public final class BatteryStatsService extends IBatteryStats.Stub @Override public void noteBleScanStopped(final WorkSource ws, final boolean isUnoptimized) { enforceCallingPermission(); + final WorkSource localWs = ws != null ? new WorkSource(ws) : null; synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { - mStats.noteBluetoothScanStoppedFromSourceLocked(ws, isUnoptimized, + mStats.noteBluetoothScanStoppedFromSourceLocked(localWs, isUnoptimized, uptime, elapsedRealtime); } }); @@ -1679,12 +1706,13 @@ public final class BatteryStatsService extends IBatteryStats.Stub @Override public void noteBleScanResults(final WorkSource ws, final int numNewResults) { enforceCallingPermission(); + final WorkSource localWs = ws != null ? new WorkSource(ws) : null; synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { - mStats.noteBluetoothScanResultsFromSourceLocked(ws, numNewResults, + mStats.noteBluetoothScanResultsFromSourceLocked(localWs, numNewResults, elapsedRealtime, uptime); } }); diff --git a/services/core/java/com/android/server/am/EventLogTags.logtags b/services/core/java/com/android/server/am/EventLogTags.logtags index b818ccf275c4..68f2e35094fc 100644 --- a/services/core/java/com/android/server/am/EventLogTags.logtags +++ b/services/core/java/com/android/server/am/EventLogTags.logtags @@ -104,6 +104,14 @@ option java_package com.android.server.am 30076 uc_start_user_internal (userId|1|5) 30077 uc_unlock_user (userId|1|5) 30078 uc_finish_user_boot (userId|1|5) -30079 uc_dispatch_user_switch (oldUserId|1|5) (newUserId|1|5) -30080 uc_continue_user_switch (oldUserId|1|5) (newUserId|1|5) -30081 uc_send_user_broadcast (userId|1|5),(IntentAction|3)
\ No newline at end of file +30079 uc_dispatch_user_switch (oldUserId|1|5),(newUserId|1|5) +30080 uc_continue_user_switch (oldUserId|1|5),(newUserId|1|5) +30081 uc_send_user_broadcast (userId|1|5),(IntentAction|3) +# Tags below are used by SystemServiceManager - although it's technically part of am, these are +# also user switch events and useful to be analyzed together with events above. +30082 ssm_user_starting (userId|1|5) +30083 ssm_user_switching (oldUserId|1|5),(newUserId|1|5) +30084 ssm_user_unlocking (userId|1|5) +30085 ssm_user_unlocked (userId|1|5) +30086 ssm_user_stopping (userId|1|5) +30087 ssm_user_stopped (userId|1|5) diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index d1126ee1bf1c..c29df6c44d5c 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -952,7 +952,7 @@ class UserController implements Handler.Callback { mInjector.batteryStatsServiceNoteEvent( BatteryStats.HistoryItem.EVENT_USER_RUNNING_FINISH, Integer.toString(userId), userId); - mInjector.getSystemServiceManager().stopUser(userId); + mInjector.getSystemServiceManager().onUserStopping(userId); Runnable finishUserStoppedAsync = () -> mHandler.post(() -> finishUserStopped(uss, allowDelayedLocking)); @@ -1028,7 +1028,7 @@ class UserController implements Handler.Callback { } if (stopped) { - mInjector.systemServiceManagerCleanupUser(userId); + mInjector.systemServiceManagerOnUserStopped(userId); mInjector.stackSupervisorRemoveUser(userId); // Remove the user if it is ephemeral. @@ -2494,8 +2494,8 @@ class UserController implements Handler.Callback { logUserLifecycleEvent(msg.arg1, USER_LIFECYCLE_EVENT_START_USER, USER_LIFECYCLE_EVENT_STATE_BEGIN); - mInjector.getSystemServiceManager().startUser(TimingsTraceAndSlog.newAsyncLog(), - msg.arg1); + mInjector.getSystemServiceManager().onUserStarting( + TimingsTraceAndSlog.newAsyncLog(), msg.arg1); logUserLifecycleEvent(msg.arg1, USER_LIFECYCLE_EVENT_START_USER, USER_LIFECYCLE_EVENT_STATE_FINISH); @@ -2503,7 +2503,7 @@ class UserController implements Handler.Callback { break; case USER_UNLOCK_MSG: final int userId = msg.arg1; - mInjector.getSystemServiceManager().unlockUser(userId); + mInjector.getSystemServiceManager().onUserUnlocking(userId); // Loads recents on a worker thread that allows disk I/O FgThread.getHandler().post(() -> { mInjector.loadUserRecents(userId); @@ -2528,7 +2528,7 @@ class UserController implements Handler.Callback { BatteryStats.HistoryItem.EVENT_USER_FOREGROUND_START, Integer.toString(msg.arg1), msg.arg1); - mInjector.getSystemServiceManager().switchUser(msg.arg2, msg.arg1); + mInjector.getSystemServiceManager().onUserSwitching(msg.arg2, msg.arg1); break; case FOREGROUND_PROFILE_CHANGED_MSG: dispatchForegroundProfileChanged(msg.arg1); @@ -2781,8 +2781,8 @@ class UserController implements Handler.Callback { LocalServices.getService(ActivityTaskManagerInternal.class).onUserStopped(userId); } - void systemServiceManagerCleanupUser(@UserIdInt int userId) { - mService.mSystemServiceManager.cleanupUser(userId); + void systemServiceManagerOnUserStopped(@UserIdInt int userId) { + mService.mSystemServiceManager.onUserStopped(userId); } protected UserManagerService getUserManager() { diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java index 1f71d7809133..5dcadee20e13 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java @@ -127,12 +127,12 @@ public class FingerprintService extends SystemService { } @Override - public void notifyAcquired(int userId) { + public void notifyAcquired(int userId, int acquireInfo) { Utils.checkPermission(getContext(), TEST_BIOMETRIC); } @Override - public void notifyError(int userId) { + public void notifyError(int userId, int errorCode) { Utils.checkPermission(getContext(), TEST_BIOMETRIC); } diff --git a/services/core/java/com/android/server/connectivity/DnsManager.java b/services/core/java/com/android/server/connectivity/DnsManager.java index 271ec4eac9e8..c7891865644a 100644 --- a/services/core/java/com/android/server/connectivity/DnsManager.java +++ b/services/core/java/com/android/server/connectivity/DnsManager.java @@ -237,7 +237,6 @@ public class DnsManager { private final Context mContext; private final ContentResolver mContentResolver; private final IDnsResolver mDnsResolver; - private final MockableSystemProperties mSystemProperties; private final ConcurrentHashMap<Integer, PrivateDnsConfig> mPrivateDnsMap; // TODO: Replace the Map with SparseArrays. private final Map<Integer, PrivateDnsValidationStatuses> mPrivateDnsValidationMap; @@ -249,11 +248,10 @@ public class DnsManager { private int mMinSamples; private int mMaxSamples; - public DnsManager(Context ctx, IDnsResolver dnsResolver, MockableSystemProperties sp) { + public DnsManager(Context ctx, IDnsResolver dnsResolver) { mContext = ctx; mContentResolver = mContext.getContentResolver(); mDnsResolver = dnsResolver; - mSystemProperties = sp; mPrivateDnsMap = new ConcurrentHashMap<>(); mPrivateDnsValidationMap = new HashMap<>(); mLinkPropertiesMap = new HashMap<>(); diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index 4f5a0faee8dd..71b377cc2f11 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -123,7 +123,6 @@ public class DisplayModeDirector { public void start(SensorManager sensorManager) { mSettingsObserver.observe(); mDisplayObserver.observe(); - mSettingsObserver.observe(); mBrightnessObserver.observe(sensorManager); synchronized (mLock) { // We may have a listener already registered before the call to start, so go ahead and diff --git a/services/core/java/com/android/server/pm/IncrementalStates.java b/services/core/java/com/android/server/pm/IncrementalStates.java index ababb8365c4f..43f4a3477a98 100644 --- a/services/core/java/com/android/server/pm/IncrementalStates.java +++ b/services/core/java/com/android/server/pm/IncrementalStates.java @@ -16,18 +16,21 @@ package com.android.server.pm; -import android.content.pm.IDataLoaderStatusListener; +import static android.os.incremental.IStorageHealthListener.HEALTH_STATUS_OK; +import static android.os.incremental.IStorageHealthListener.HEALTH_STATUS_UNHEALTHY; +import static android.os.incremental.IStorageHealthListener.HEALTH_STATUS_UNHEALTHY_STORAGE; +import static android.os.incremental.IStorageHealthListener.HEALTH_STATUS_UNHEALTHY_TRANSPORT; + import android.content.pm.IncrementalStatesInfo; import android.content.pm.PackageManager; import android.os.Handler; -import android.os.incremental.IStorageHealthListener; import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.internal.os.BackgroundThread; import com.android.internal.util.function.pooled.PooledLambda; -import java.util.function.BiConsumer; +import java.util.function.Consumer; /** * Manages state transitions of a package installed on Incremental File System. Currently manages: @@ -36,8 +39,7 @@ import java.util.function.BiConsumer; * * The following events might change the states of a package: * 1. Installation commit - * 2. Incremental storage health - * 3. Data loader stream health + * 2. Incremental storage health changes * 4. Loading progress changes * * @hide @@ -48,16 +50,14 @@ public final class IncrementalStates { private final Handler mHandler = BackgroundThread.getHandler(); private final Object mLock = new Object(); @GuardedBy("mLock") - private int mStreamStatus = IDataLoaderStatusListener.STREAM_HEALTHY; - @GuardedBy("mLock") - private int mStorageHealthStatus = IStorageHealthListener.HEALTH_STATUS_OK; + private int mStorageHealthStatus = HEALTH_STATUS_OK; @GuardedBy("mLock") private final LoadingState mLoadingState; @GuardedBy("mLock") private StartableState mStartableState; @GuardedBy("mLock") private Callback mCallback = null; - private final BiConsumer<Integer, Integer> mStatusConsumer; + private final Consumer<Integer> mStatusConsumer; public IncrementalStates() { // By default the package is not startable and not fully loaded (i.e., is loading) @@ -148,12 +148,9 @@ public final class IncrementalStates { } } - private class StatusConsumer implements BiConsumer<Integer, Integer> { + private class StatusConsumer implements Consumer<Integer> { @Override - public void accept(Integer streamStatus, Integer storageStatus) { - if (streamStatus == null && storageStatus == null) { - return; - } + public void accept(Integer storageStatus) { final boolean oldState, newState; synchronized (mLock) { if (!mLoadingState.isLoading()) { @@ -161,12 +158,7 @@ public final class IncrementalStates { return; } oldState = mStartableState.isStartable(); - if (streamStatus != null) { - mStreamStatus = (Integer) streamStatus; - } - if (storageStatus != null) { - mStorageHealthStatus = (Integer) storageStatus; - } + mStorageHealthStatus = storageStatus; updateStartableStateLocked(); newState = mStartableState.isStartable(); } @@ -188,21 +180,7 @@ public final class IncrementalStates { Slog.i(TAG, "received storage health status changed event : storageHealthStatus=" + storageHealthStatus); } - mStatusConsumer.accept(null, storageHealthStatus); - } - - /** - * By calling this method, the caller indicates that the stream status of the package has - * been - * changed. This could indicate a streaming error. The state will change according to the - * status - * code defined in {@code IDataLoaderStatusListener}. - */ - public void onStreamStatusChanged(int streamState) { - if (DEBUG) { - Slog.i(TAG, "received stream status changed event : streamState=" + streamState); - } - mStatusConsumer.accept(streamState, null); + mStatusConsumer.accept(storageHealthStatus); } /** @@ -284,35 +262,16 @@ public final class IncrementalStates { final boolean currentState = mStartableState.isStartable(); boolean nextState = currentState; if (!currentState) { - if (mStorageHealthStatus == IStorageHealthListener.HEALTH_STATUS_OK - && mStreamStatus == IDataLoaderStatusListener.STREAM_HEALTHY) { - // change from unstartable -> startable when both stream and storage are healthy + if (mStorageHealthStatus == HEALTH_STATUS_OK) { + // change from unstartable -> startable nextState = true; } } else { - if (mStorageHealthStatus == IStorageHealthListener.HEALTH_STATUS_UNHEALTHY) { - // unrecoverable if storage is unhealthy + if (mStorageHealthStatus == HEALTH_STATUS_UNHEALTHY + || mStorageHealthStatus == HEALTH_STATUS_UNHEALTHY_STORAGE + || mStorageHealthStatus == HEALTH_STATUS_UNHEALTHY_TRANSPORT) { + // change from startable -> unstartable nextState = false; - } else { - switch (mStreamStatus) { - case IDataLoaderStatusListener.STREAM_INTEGRITY_ERROR: - // unrecoverable, fall through - case IDataLoaderStatusListener.STREAM_SOURCE_ERROR: { - // unrecoverable - nextState = false; - break; - } - case IDataLoaderStatusListener.STREAM_STORAGE_ERROR: { - if (mStorageHealthStatus != IStorageHealthListener.HEALTH_STATUS_OK) { - // unrecoverable if there is a pending read AND storage is limited - nextState = false; - } - break; - } - default: - // anything else, remain startable - break; - } } } if (nextState == currentState) { @@ -370,17 +329,11 @@ public final class IncrementalStates { return PackageManager.UNSTARTABLE_REASON_UNKNOWN; } // Translate stream status to reason for unstartable state - switch (mStreamStatus) { - case IDataLoaderStatusListener.STREAM_TRANSPORT_ERROR: - // fall through - case IDataLoaderStatusListener.STREAM_INTEGRITY_ERROR: - // fall through - case IDataLoaderStatusListener.STREAM_SOURCE_ERROR: { - return PackageManager.UNSTARTABLE_REASON_CONNECTION_ERROR; - } - case IDataLoaderStatusListener.STREAM_STORAGE_ERROR: { + switch (mStorageHealthStatus) { + case HEALTH_STATUS_UNHEALTHY_STORAGE: return PackageManager.UNSTARTABLE_REASON_INSUFFICIENT_STORAGE; - } + case HEALTH_STATUS_UNHEALTHY_TRANSPORT: + return PackageManager.UNSTARTABLE_REASON_CONNECTION_ERROR; default: return PackageManager.UNSTARTABLE_REASON_UNKNOWN; } @@ -464,7 +417,6 @@ public final class IncrementalStates { } IncrementalStates l = (IncrementalStates) o; return l.mStorageHealthStatus == mStorageHealthStatus - && l.mStreamStatus == mStreamStatus && l.mStartableState.equals(mStartableState) && l.mLoadingState.equals(mLoadingState); } @@ -474,7 +426,6 @@ public final class IncrementalStates { int hashCode = mStartableState.hashCode(); hashCode = 31 * hashCode + mLoadingState.hashCode(); hashCode = 31 * hashCode + mStorageHealthStatus; - hashCode = 31 * hashCode + mStreamStatus; return hashCode; } } diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 649cafb1cb06..5d2928e1a854 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -143,7 +143,6 @@ import com.android.internal.util.ArrayUtils; import com.android.internal.util.FrameworkStatsLog; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; -import com.android.internal.util.function.pooled.PooledLambda; import com.android.server.LocalServices; import com.android.server.pm.Installer.InstallerException; import com.android.server.pm.dex.DexManager; @@ -1702,28 +1701,6 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { dispatchSessionFinished(error, detailedMessage, null); } - private void onStorageHealthStatusChanged(int status) { - final String packageName = getPackageName(); - if (TextUtils.isEmpty(packageName)) { - // The package has not been installed. - return; - } - mHandler.post(PooledLambda.obtainRunnable( - PackageManagerService::onStorageHealthStatusChanged, - mPm, packageName, status, userId).recycleOnUse()); - } - - private void onStreamHealthStatusChanged(int status) { - final String packageName = getPackageName(); - if (TextUtils.isEmpty(packageName)) { - // The package has not been installed. - return; - } - mHandler.post(PooledLambda.obtainRunnable( - PackageManagerService::onStreamStatusChanged, - mPm, packageName, status, userId).recycleOnUse()); - } - /** * If session should be sealed, then it's sealed to prevent further modification. * If the session can't be sealed then it's destroyed. @@ -3315,19 +3292,11 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { return; } - final boolean isDestroyedOrDataLoaderFinished; synchronized (mLock) { - isDestroyedOrDataLoaderFinished = mDestroyed || mDataLoaderFinished; - } - if (isDestroyedOrDataLoaderFinished) { - switch (status) { - case IDataLoaderStatusListener.DATA_LOADER_UNRECOVERABLE: - // treat as unhealthy storage - onStorageHealthStatusChanged( - IStorageHealthListener.HEALTH_STATUS_UNHEALTHY); - return; + if (mDestroyed || mDataLoaderFinished) { + // No need to worry about post installation + return; } - return; } try { @@ -3423,13 +3392,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } @Override public void reportStreamHealth(int dataLoaderId, int streamStatus) { - synchronized (mLock) { - if (!mDestroyed && !mDataLoaderFinished) { - // ignore streaming status if package isn't installed - return; - } - } - onStreamHealthStatusChanged(streamStatus); + // Currently the stream status is not used during package installation. It is + // technically possible for the data loader to report stream status via this + // callback, but if something is wrong with the streaming, it is more likely that + // prepareDataLoaderLocked will return false and the installation will be aborted. } }; @@ -3438,20 +3404,16 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { healthCheckParams.blockedTimeoutMs = INCREMENTAL_STORAGE_BLOCKED_TIMEOUT_MS; healthCheckParams.unhealthyTimeoutMs = INCREMENTAL_STORAGE_UNHEALTHY_TIMEOUT_MS; healthCheckParams.unhealthyMonitoringMs = INCREMENTAL_STORAGE_UNHEALTHY_MONITORING_MS; - final boolean systemDataLoader = params.getComponentName().getPackageName() == SYSTEM_DATA_LOADER_PACKAGE; final IStorageHealthListener healthListener = new IStorageHealthListener.Stub() { @Override public void onHealthStatus(int storageId, int status) { - final boolean isDestroyedOrDataLoaderFinished; synchronized (mLock) { - isDestroyedOrDataLoaderFinished = mDestroyed || mDataLoaderFinished; - } - if (isDestroyedOrDataLoaderFinished) { - // App's installed. - onStorageHealthStatusChanged(status); - return; + if (mDestroyed || mDataLoaderFinished) { + // No need to worry about post installation + return; + } } switch (status) { diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index ff84e2ebfa51..3f16abfa04b7 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -271,8 +271,10 @@ import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.os.UserManagerInternal; +import android.os.incremental.IStorageHealthListener; import android.os.incremental.IncrementalManager; import android.os.incremental.IncrementalStorage; +import android.os.incremental.StorageHealthCheckParams; import android.os.storage.DiskInfo; import android.os.storage.IStorageManager; import android.os.storage.StorageEventListener; @@ -506,9 +508,6 @@ public class PackageManagerService extends IPackageManager.Stub private static final boolean HIDE_EPHEMERAL_APIS = false; - private static final boolean ENABLE_FREE_CACHE_V2 = - SystemProperties.getBoolean("fw.free_cache_v2", true); - private static final String PRECOMPILE_LAYOUTS = "pm.precompile_layouts"; private static final int RADIO_UID = Process.PHONE_UID; @@ -732,14 +731,23 @@ public class PackageManagerService extends IPackageManager.Stub private static final String RANDOM_DIR_PREFIX = "~~"; + /** + * Timeout configurations for incremental storage health monitor. + * See {@link IStorageHealthListener} + */ + private static final int INCREMENTAL_STORAGE_BLOCKED_TIMEOUT_MS = 2000; + private static final int INCREMENTAL_STORAGE_UNHEALTHY_TIMEOUT_MS = 7000; + private static final int INCREMENTAL_STORAGE_UNHEALTHY_MONITORING_MS = 60000; + final ServiceThread mHandlerThread; final Handler mHandler; private final ProcessLoggingHandler mProcessLoggingHandler; - final int mSdkVersion = Build.VERSION.SDK_INT; + private final boolean mEnableFreeCacheV2; + final int mSdkVersion; final Context mContext; final boolean mFactoryTest; final boolean mOnlyCore; @@ -894,24 +902,8 @@ public class PackageManagerService extends IPackageManager.Stub T produce(Injector injector, PackageManagerService packageManager); } - static class LocalServicesProducer<T> implements Producer<T> { - private final Class<T> mProducingClass; - LocalServicesProducer(Class<T> clazz) { - this.mProducingClass = clazz; - } - public T produce(Injector injector, PackageManagerService packageManager) { - return LocalServices.getService(mProducingClass); - } - } - - static class SystemServiceProducer<T> implements Producer<T> { - private final Class<T> mProducingClass; - SystemServiceProducer(Class<T> clazz) { - this.mProducingClass = clazz; - } - public T produce(Injector injector, PackageManagerService packageManager) { - return packageManager.mContext.getSystemService(mProducingClass); - } + interface ServiceProducer { + <T> T produce(Class<T> c); } @VisibleForTesting(visibility = Visibility.PRIVATE) @@ -941,41 +933,43 @@ public class PackageManagerService extends IPackageManager.Stub // ----- producers ----- private final Singleton<ComponentResolver> mComponentResolverProducer; - private final Singleton<PermissionManagerServiceInternal> mPermissionManagerProducer; + private final Singleton<PermissionManagerServiceInternal> mPermissionManagerServiceProducer; private final Singleton<UserManagerService> mUserManagerProducer; private final Singleton<Settings> mSettingsProducer; - private final Singleton<ActivityTaskManagerInternal> mActivityTaskManagerProducer; - private final Singleton<ActivityManagerInternal> mActivityManagerInternalProducer; - private final Singleton<DeviceIdleInternal> mLocalDeviceIdleController; - private final Singleton<StorageManagerInternal> mStorageManagerInternalProducer; - private final Singleton<NetworkPolicyManagerInternal> mNetworkPolicyManagerProducer; - private final Singleton<PermissionPolicyInternal> mPermissionPolicyProducer; - private final Singleton<DeviceStorageMonitorInternal> mDeviceStorageMonitorProducer; - private final Singleton<DisplayManager> mDisplayManagerProducer; - private final Singleton<StorageManager> mStorageManagerProducer; - private final Singleton<AppOpsManager> mAppOpsManagerProducer; private final Singleton<AppsFilter> mAppsFilterProducer; private final Singleton<PlatformCompat> mPlatformCompatProducer; + private final Singleton<SystemConfig> mSystemConfigProducer; + private final Singleton<PackageDexOptimizer> mPackageDexOptimizerProducer; + private final Singleton<DexManager> mDexManagerProducer; + private final Singleton<ArtManagerService> mArtManagerServiceProducer; + private final Singleton<ApexManager> mApexManagerProducer; + private final Singleton<ViewCompiler> mViewCompilerProducer; + private final Singleton<IPermissionManager> mPermissionManagerProducer; + private final Singleton<IncrementalManager> mIncrementalManagerProducer; + private final SystemWrapper mSystemWrapper; + private final ServiceProducer mGetLocalServiceProducer; + private final ServiceProducer mGetSystemServiceProducer; Injector(Context context, Object lock, Installer installer, Object installLock, PackageAbiHelper abiHelper, Handler backgroundHandler, Producer<ComponentResolver> componentResolverProducer, - Producer<PermissionManagerServiceInternal> permissionManagerProducer, + Producer<PermissionManagerServiceInternal> permissionManagerServiceProducer, Producer<UserManagerService> userManagerProducer, Producer<Settings> settingsProducer, - Producer<ActivityTaskManagerInternal> activityTaskManagerProducer, - Producer<ActivityManagerInternal> activityManagerInternalProducer, - Producer<DeviceIdleInternal> deviceIdleControllerProducer, - Producer<StorageManagerInternal> storageManagerInternalProducer, - Producer<NetworkPolicyManagerInternal> networkPolicyManagerProducer, - Producer<PermissionPolicyInternal> permissionPolicyProvider, - Producer<DeviceStorageMonitorInternal> deviceStorageMonitorProducer, - Producer<DisplayManager> displayManagerProducer, - Producer<StorageManager> storageManagerProducer, - Producer<AppOpsManager> appOpsManagerProducer, Producer<AppsFilter> appsFilterProducer, - Producer<PlatformCompat> platformCompatProducer) { + Producer<PlatformCompat> platformCompatProducer, + Producer<SystemConfig> systemConfigProducer, + Producer<PackageDexOptimizer> packageDexOptimizerProducer, + Producer<DexManager> dexManagerProducer, + Producer<ArtManagerService> artManagerServiceProducer, + Producer<ApexManager> apexManagerProducer, + Producer<IPermissionManager> permissionManagerProducer, + Producer<ViewCompiler> viewCompilerProducer, + Producer<IncrementalManager> incrementalManagerProducer, + SystemWrapper systemWrapper, + ServiceProducer getLocalServiceProducer, + ServiceProducer getSystemServiceProducer) { mContext = context; mLock = lock; mInstaller = installer; @@ -984,21 +978,22 @@ public class PackageManagerService extends IPackageManager.Stub mBackgroundHandler = backgroundHandler; mBackgroundExecutor = new HandlerExecutor(backgroundHandler); mComponentResolverProducer = new Singleton<>(componentResolverProducer); - mPermissionManagerProducer = new Singleton<>(permissionManagerProducer); + mPermissionManagerServiceProducer = new Singleton<>(permissionManagerServiceProducer); mUserManagerProducer = new Singleton<>(userManagerProducer); mSettingsProducer = new Singleton<>(settingsProducer); - mActivityTaskManagerProducer = new Singleton<>(activityTaskManagerProducer); - mActivityManagerInternalProducer = new Singleton<>(activityManagerInternalProducer); - mLocalDeviceIdleController = new Singleton<>(deviceIdleControllerProducer); - mStorageManagerInternalProducer = new Singleton<>(storageManagerInternalProducer); - mNetworkPolicyManagerProducer = new Singleton<>(networkPolicyManagerProducer); - mPermissionPolicyProducer = new Singleton<>(permissionPolicyProvider); - mDeviceStorageMonitorProducer = new Singleton<>(deviceStorageMonitorProducer); - mDisplayManagerProducer = new Singleton<>(displayManagerProducer); - mStorageManagerProducer = new Singleton<>(storageManagerProducer); - mAppOpsManagerProducer = new Singleton<>(appOpsManagerProducer); mAppsFilterProducer = new Singleton<>(appsFilterProducer); mPlatformCompatProducer = new Singleton<>(platformCompatProducer); + mSystemConfigProducer = new Singleton<>(systemConfigProducer); + mPackageDexOptimizerProducer = new Singleton<>(packageDexOptimizerProducer); + mDexManagerProducer = new Singleton<>(dexManagerProducer); + mArtManagerServiceProducer = new Singleton<>(artManagerServiceProducer); + mApexManagerProducer = new Singleton<>(apexManagerProducer); + mPermissionManagerProducer = new Singleton<>(permissionManagerProducer); + mViewCompilerProducer = new Singleton<>(viewCompilerProducer); + mIncrementalManagerProducer = new Singleton<>(incrementalManagerProducer); + mSystemWrapper = systemWrapper; + mGetLocalServiceProducer = getLocalServiceProducer; + mGetSystemServiceProducer = getSystemServiceProducer; } /** @@ -1038,7 +1033,7 @@ public class PackageManagerService extends IPackageManager.Stub } public PermissionManagerServiceInternal getPermissionManagerServiceInternal() { - return mPermissionManagerProducer.get(this, mPackageManager); + return mPermissionManagerServiceProducer.get(this, mPackageManager); } public Context getContext() { @@ -1049,60 +1044,112 @@ public class PackageManagerService extends IPackageManager.Stub return mSettingsProducer.get(this, mPackageManager); } - public ActivityTaskManagerInternal getActivityTaskManagerInternal() { - return mActivityTaskManagerProducer.get(this, mPackageManager); + public AppsFilter getAppsFilter() { + return mAppsFilterProducer.get(this, mPackageManager); } - public ActivityManagerInternal getActivityManagerInternal() { - return mActivityManagerInternalProducer.get(this, mPackageManager); + public PlatformCompat getCompatibility() { + return mPlatformCompatProducer.get(this, mPackageManager); } - public DeviceIdleInternal getLocalDeviceIdleController() { - return mLocalDeviceIdleController.get(this, mPackageManager); + public SystemConfig getSystemConfig() { + return mSystemConfigProducer.get(this, mPackageManager); } - public StorageManagerInternal getStorageManagerInternal() { - return mStorageManagerInternalProducer.get(this, mPackageManager); + public PackageDexOptimizer getPackageDexOptimizer() { + return mPackageDexOptimizerProducer.get(this, mPackageManager); } - public NetworkPolicyManagerInternal getNetworkPolicyManagerInternal() { - return mNetworkPolicyManagerProducer.get(this, mPackageManager); + public DexManager getDexManager() { + return mDexManagerProducer.get(this, mPackageManager); } - public PermissionPolicyInternal getPermissionPolicyInternal() { - return mPermissionPolicyProducer.get(this, mPackageManager); + public ArtManagerService getArtManagerService() { + return mArtManagerServiceProducer.get(this, mPackageManager); } - public DeviceStorageMonitorInternal getDeviceStorageMonitorInternal() { - return mDeviceStorageMonitorProducer.get(this, mPackageManager); + public ApexManager getApexManager() { + return mApexManagerProducer.get(this, mPackageManager); } - public DisplayManager getDisplayManager() { - return mDisplayManagerProducer.get(this, mPackageManager); + public ViewCompiler getViewCompiler() { + return mViewCompilerProducer.get(this, mPackageManager); } - public StorageManager getStorageManager() { - return mStorageManagerProducer.get(this, mPackageManager); + public IPermissionManager getPermissionManagerService() { + return mPermissionManagerProducer.get(this, mPackageManager); } - public AppOpsManager getAppOpsManager() { - return mAppOpsManagerProducer.get(this, mPackageManager); + public Handler getBackgroundHandler() { + return mBackgroundHandler; } - public AppsFilter getAppsFilter() { - return mAppsFilterProducer.get(this, mPackageManager); + public Executor getBackgroundExecutor() { + return mBackgroundExecutor; } - public PlatformCompat getCompatibility() { - return mPlatformCompatProducer.get(this, mPackageManager); + public <T> T getLocalService(Class<T> c) { + return mGetLocalServiceProducer.produce(c); } - public Handler getBackgroundHandler() { - return mBackgroundHandler; + public <T> T getSystemService(Class<T> c) { + return mGetSystemServiceProducer.produce(c); } - public Executor getBackgroundExecutor() { - return mBackgroundExecutor; + public SystemWrapper getSystemWrapper() { + return mSystemWrapper; + } + + public IncrementalManager getIncrementalManager() { + return mIncrementalManagerProducer.get(this, mPackageManager); + } + } + + /** Provides an abstraction to static access to system state. */ + public interface SystemWrapper { + /** @see SystemProperties#get(String) */ + String getProperty(String key); + /** @see SystemProperties#getInt(String, int) */ + int getPropertyInt(String key, int defValue); + /** @see SystemProperties#getBoolean(String, boolean) */ + boolean getPropertyBoolean(String key, boolean defValue); + /** @see SystemProperties#digestOf(String...) */ + String digestOfProperties(@NonNull String... keys); + /** @see SystemProperties#set(String, String) */ + void setProperty(String key, String value); + /** @see Build.VERSION#SDK_INT */ + int getSdkInt(); + } + + private static class DefaultSystemWrapper implements SystemWrapper { + @Override + public String getProperty(String key) { + return SystemProperties.get(key); + } + + @Override + public int getPropertyInt(String key, int defValue) { + return SystemProperties.getInt(key, defValue); + } + + @Override + public boolean getPropertyBoolean(String key, boolean defValue) { + return SystemProperties.getBoolean(key, defValue); + } + + @Override + public String digestOfProperties(String... keys) { + return SystemProperties.digestOf(keys); + } + + @Override + public void setProperty(String key, String value) { + SystemProperties.set(key, value); + } + + @Override + public int getSdkInt() { + return Build.VERSION.SDK_INT; } } @@ -1161,6 +1208,8 @@ public class PackageManagerService extends IPackageManager.Stub public @Nullable String retailDemoPackage; public ComponentName resolveComponentName; public ArrayMap<String, AndroidPackage> packages; + public boolean enableFreeCacheV2; + public int sdkVersion; } private final AppsFilter mAppsFilter; @@ -1354,7 +1403,7 @@ public class PackageManagerService extends IPackageManager.Stub options.setTemporaryAppWhitelistDuration(whitelistTimeout); DeviceIdleInternal idleController = - mInjector.getLocalDeviceIdleController(); + mInjector.getLocalService(DeviceIdleInternal.class); idleController.addPowerSaveTempWhitelistApp(Process.myUid(), mIntentFilterVerifierComponent.getPackageName(), whitelistTimeout, UserHandle.USER_SYSTEM, true, "intent filter verifier"); @@ -1427,7 +1476,7 @@ public class PackageManagerService extends IPackageManager.Stub case INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS: if (!verified) { // Don't demote if sysconfig says 'always' - SystemConfig systemConfig = SystemConfig.getInstance(); + SystemConfig systemConfig = mInjector.getSystemConfig(); ArraySet<String> packages = systemConfig.getLinkedApps(); if (!packages.contains(packageName)) { // updatedStatus is already UNDEFINED @@ -2324,7 +2373,8 @@ public class PackageManagerService extends IPackageManager.Stub // Send broadcast package appeared if external for all users if (res.pkg.isExternalStorage()) { if (!update) { - final StorageManager storage = mInjector.getStorageManager(); + final StorageManager storage = mInjector.getSystemService( + StorageManager.class); VolumeInfo volume = storage.findVolumeByUuid( res.pkg.getStorageUuid().toString()); @@ -2503,7 +2553,7 @@ public class PackageManagerService extends IPackageManager.Stub ApkChecksums.Injector injector = new ApkChecksums.Injector( () -> mContext, () -> mInjector.getBackgroundHandler(), - () -> mContext.getSystemService(IncrementalManager.class)); + () -> mInjector.getIncrementalManager()); ApkChecksums.getChecksums(filesToChecksum, optional, required, trustedCerts, statusReceiver, injector); }); @@ -2679,31 +2729,32 @@ public class PackageManagerService extends IPackageManager.Stub Injector injector = new Injector( context, lock, installer, installLock, new PackageAbiHelperImpl(), backgroundHandler, - (i, pm) -> - new ComponentResolver(i.getUserManagerService(), pm.mPmInternal, lock), - (i, pm) -> - PermissionManagerService.create(context, lock), - (i, pm) -> - new UserManagerService(context, pm, + (i, pm) -> new ComponentResolver(i.getUserManagerService(), pm.mPmInternal, lock), + (i, pm) -> PermissionManagerService.create(context, lock), + (i, pm) -> new UserManagerService(context, pm, new UserDataPreparer(installer, installLock, context, onlyCore), lock), - (i, pm) -> - new Settings(Environment.getDataDirectory(), - i.getPermissionManagerServiceInternal().getPermissionSettings(), - RuntimePermissionsPersistence.createInstance(), - i.getPermissionManagerServiceInternal(), lock), - new Injector.LocalServicesProducer<>(ActivityTaskManagerInternal.class), - new Injector.LocalServicesProducer<>(ActivityManagerInternal.class), - new Injector.LocalServicesProducer<>(DeviceIdleInternal.class), - new Injector.LocalServicesProducer<>(StorageManagerInternal.class), - new Injector.LocalServicesProducer<>(NetworkPolicyManagerInternal.class), - new Injector.LocalServicesProducer<>(PermissionPolicyInternal.class), - new Injector.LocalServicesProducer<>(DeviceStorageMonitorInternal.class), - new Injector.SystemServiceProducer<>(DisplayManager.class), - new Injector.SystemServiceProducer<>(StorageManager.class), - new Injector.SystemServiceProducer<>(AppOpsManager.class), + (i, pm) -> new Settings(Environment.getDataDirectory(), + i.getPermissionManagerServiceInternal().getPermissionSettings(), + RuntimePermissionsPersistence.createInstance(), + i.getPermissionManagerServiceInternal(), lock), (i, pm) -> AppsFilter.create(pm.mPmInternal, i), - (i, pm) -> (PlatformCompat) ServiceManager.getService("platform_compat")); + (i, pm) -> (PlatformCompat) ServiceManager.getService("platform_compat"), + (i, pm) -> SystemConfig.getInstance(), + (i, pm) -> new PackageDexOptimizer(i.getInstaller(), i.getInstallLock(), + i.getContext(), "*dexopt*"), + (i, pm) -> new DexManager(i.getContext(), pm, i.getPackageDexOptimizer(), + i.getInstaller(), i.getInstallLock()), + (i, pm) -> new ArtManagerService(i.getContext(), pm, i.getInstaller(), + i.getInstallLock()), + (i, pm) -> ApexManager.getInstance(), + (i, pm) -> (IPermissionManager) ServiceManager.getService("permissionmgr"), + (i, pm) -> new ViewCompiler(i.getInstallLock(), i.getInstaller()), + (i, pm) -> (IncrementalManager) + pm.mContext.getSystemService(Context.INCREMENTAL_SERVICE), + new DefaultSystemWrapper(), + LocalServices::getService, + context::getSystemService); PackageManagerService m = new PackageManagerService(injector, onlyCore, factoryTest); t.traceEnd(); // "create package manager" @@ -2776,16 +2827,17 @@ public class PackageManagerService extends IPackageManager.Stub * reasons. This simply requests that the copy takes place and awaits confirmation of its * completion. See platform/system/extras/cppreopt/ for the implementation of the actual copy. */ - private static void requestCopyPreoptedFiles() { + private static void requestCopyPreoptedFiles(Injector injector) { final int WAIT_TIME_MS = 100; final String CP_PREOPT_PROPERTY = "sys.cppreopt"; - if (SystemProperties.getInt("ro.cp_system_other_odex", 0) == 1) { - SystemProperties.set(CP_PREOPT_PROPERTY, "requested"); + if (injector.getSystemWrapper().getPropertyInt("ro.cp_system_other_odex", 0) == 1) { + injector.getSystemWrapper().setProperty(CP_PREOPT_PROPERTY, "requested"); // We will wait for up to 100 seconds. final long timeStart = SystemClock.uptimeMillis(); final long timeEnd = timeStart + 100 * 1000; long timeNow = timeStart; - while (!SystemProperties.get(CP_PREOPT_PROPERTY).equals("finished")) { + while (!injector.getSystemWrapper() + .getProperty(CP_PREOPT_PROPERTY).equals("finished")) { try { Thread.sleep(WAIT_TIME_MS); } catch (InterruptedException e) { @@ -2793,7 +2845,7 @@ public class PackageManagerService extends IPackageManager.Stub } timeNow = SystemClock.uptimeMillis(); if (timeNow > timeEnd) { - SystemProperties.set(CP_PREOPT_PROPERTY, "timed-out"); + injector.getSystemWrapper().setProperty(CP_PREOPT_PROPERTY, "timed-out"); Slog.wtf(TAG, "cppreopt did not finish!"); break; } @@ -2925,6 +2977,8 @@ public class PackageManagerService extends IPackageManager.Stub mResolveComponentName = testParams.resolveComponentName; mPackages.putAll(testParams.packages); + mEnableFreeCacheV2 = testParams.enableFreeCacheV2; + mSdkVersion = testParams.sdkVersion; } public PackageManagerService(Injector injector, boolean onlyCore, boolean factoryTest) { @@ -2950,6 +3004,7 @@ public class PackageManagerService extends IPackageManager.Stub LockGuard.installLock(mLock, LockGuard.INDEX_PACKAGES); EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START, SystemClock.uptimeMillis()); + mSdkVersion = injector.getSystemWrapper().getSdkInt(); if (mSdkVersion <= 0) { Slog.w(TAG, "**** ro.build.version.sdk not set!"); @@ -2960,6 +3015,8 @@ public class PackageManagerService extends IPackageManager.Stub mOnlyCore = onlyCore; mMetrics = new DisplayMetrics(); mInstaller = injector.getInstaller(); + mEnableFreeCacheV2 = + injector.getSystemWrapper().getPropertyBoolean("fw.free_cache_v2", true); // Create sub-components that provide services / data. Order here is important. t.traceBegin("createSubComponents"); @@ -2971,9 +3028,8 @@ public class PackageManagerService extends IPackageManager.Stub mComponentResolver = injector.getComponentResolver(); mPermissionManager = injector.getPermissionManagerServiceInternal(); mSettings = injector.getSettings(); - mPermissionManagerService = (IPermissionManager) ServiceManager.getService("permissionmgr"); - mIncrementalManager = - (IncrementalManager) mContext.getSystemService(Context.INCREMENTAL_SERVICE); + mPermissionManagerService = injector.getPermissionManagerService(); + mIncrementalManager = mInjector.getIncrementalManager(); PlatformCompat platformCompat = mInjector.getCompatibility(); mPackageParserCallback = new PackageParser2.Callback() { @Override @@ -3009,7 +3065,8 @@ public class PackageManagerService extends IPackageManager.Stub ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED); t.traceEnd(); - String separateProcesses = SystemProperties.get("debug.separate_processes"); + String separateProcesses = + injector.getSystemWrapper().getProperty("debug.separate_processes"); if (separateProcesses != null && separateProcesses.length() > 0) { if ("*".equals(separateProcesses)) { mDefParseFlags = PackageParser.PARSE_IGNORE_PROCESSES; @@ -3026,25 +3083,22 @@ public class PackageManagerService extends IPackageManager.Stub mSeparateProcesses = null; } - mPackageDexOptimizer = new PackageDexOptimizer(mInstaller, mInstallLock, mContext, - "*dexopt*"); - mDexManager = - new DexManager(mContext, this, mPackageDexOptimizer, mInstaller, mInstallLock); - mArtManagerService = new ArtManagerService(mContext, this, mInstaller, mInstallLock); + mPackageDexOptimizer = injector.getPackageDexOptimizer(); + mDexManager = injector.getDexManager(); + mArtManagerService = injector.getArtManagerService(); mMoveCallbacks = new MoveCallbacks(FgThread.get().getLooper()); + mViewCompiler = injector.getViewCompiler(); - mViewCompiler = new ViewCompiler(mInstallLock, mInstaller); - - getDefaultDisplayMetrics(mInjector.getDisplayManager(), mMetrics); + getDefaultDisplayMetrics(mInjector.getSystemService(DisplayManager.class), mMetrics); t.traceBegin("get system config"); - SystemConfig systemConfig = SystemConfig.getInstance(); + SystemConfig systemConfig = injector.getSystemConfig(); mAvailableFeatures = systemConfig.getAvailableFeatures(); t.traceEnd(); mProtectedPackages = new ProtectedPackages(mContext); - mApexManager = ApexManager.getInstance(); + mApexManager = injector.getApexManager(); mAppsFilter = mInjector.getAppsFilter(); final List<ScanPartition> scanPartitions = new ArrayList<>(); @@ -3122,7 +3176,7 @@ public class PackageManagerService extends IPackageManager.Stub } if (!mOnlyCore && mFirstBoot) { - requestCopyPreoptedFiles(); + requestCopyPreoptedFiles(mInjector); } String customResolverActivityName = Resources.getSystem().getString( @@ -3177,7 +3231,7 @@ public class PackageManagerService extends IPackageManager.Stub } } - mCacheDir = preparePackageParserCache(); + mCacheDir = preparePackageParserCache(injector); // Set flag to monitor and not change apk file paths when // scanning install directories. @@ -4000,7 +4054,7 @@ public class PackageManagerService extends IPackageManager.Stub setUpInstantAppInstallerActivityLP(getInstantAppInstallerLPr()); } - private static @Nullable File preparePackageParserCache() { + private static @Nullable File preparePackageParserCache(Injector injector) { if (!FORCE_PACKAGE_PARSED_CACHE_ENABLED) { if (!DEFAULT_PACKAGE_PARSER_CACHE_ENABLED) { return null; @@ -4011,7 +4065,8 @@ public class PackageManagerService extends IPackageManager.Stub return null; } - if (SystemProperties.getBoolean("pm.boot.disable_package_cache", false)) { + if (injector.getSystemWrapper() + .getPropertyBoolean("pm.boot.disable_package_cache", false)) { Slog.i(TAG, "Disabling package parser cache due to system property."); return null; } @@ -4027,7 +4082,7 @@ public class PackageManagerService extends IPackageManager.Stub // identify cached items. In particular, changing the value of certain // feature flags should cause us to invalidate any caches. final String cacheName = FORCE_PACKAGE_PARSED_CACHE_ENABLED ? "debug" - : SystemProperties.digestOf( + : injector.getSystemWrapper().digestOfProperties( "ro.build.fingerprint", StorageManager.PROP_ISOLATED_STORAGE, StorageManager.PROP_ISOLATED_STORAGE_SNAPSHOT @@ -4093,7 +4148,7 @@ public class PackageManagerService extends IPackageManager.Stub public boolean isDeviceUpgrading() { // allow instant applications // The system property allows testing ota flow when upgraded to the same image. - return mIsUpgrade || SystemProperties.getBoolean( + return mIsUpgrade || mInjector.getSystemWrapper().getPropertyBoolean( "persist.pm.mock-upgrade", false /* default */); } @@ -4360,7 +4415,7 @@ public class PackageManagerService extends IPackageManager.Stub Slog.d(TAG, "Priming domain verifications in user " + userId); } - SystemConfig systemConfig = SystemConfig.getInstance(); + SystemConfig systemConfig = mInjector.getSystemConfig(); ArraySet<String> packages = systemConfig.getLinkedApps(); for (String packageName : packages) { @@ -5169,11 +5224,11 @@ public class PackageManagerService extends IPackageManager.Stub * until the requested bytes are available. */ public void freeStorage(String volumeUuid, long bytes, int storageFlags) throws IOException { - final StorageManager storage = mInjector.getStorageManager(); + final StorageManager storage = mInjector.getSystemService(StorageManager.class); final File file = storage.findPathForUuid(volumeUuid); if (file.getUsableSpace() >= bytes) return; - if (ENABLE_FREE_CACHE_V2) { + if (mEnableFreeCacheV2) { final boolean internalVolume = Objects.equals(StorageManager.UUID_PRIVATE_INTERNAL, volumeUuid); final boolean aggressive = (storageFlags @@ -5252,7 +5307,7 @@ public class PackageManagerService extends IPackageManager.Stub private boolean pruneUnusedStaticSharedLibraries(long neededSpace, long maxCachePeriod) throws IOException { - final StorageManager storage = mInjector.getStorageManager(); + final StorageManager storage = mInjector.getSystemService(StorageManager.class); final File volume = storage.findPathForUuid(StorageManager.UUID_PRIVATE_INTERNAL); List<VersionedPackage> packagesToDelete = null; @@ -5500,7 +5555,8 @@ public class PackageManagerService extends IPackageManager.Stub } private boolean isRecentsAccessingChildProfiles(int callingUid, int targetUserId) { - if (!mInjector.getActivityTaskManagerInternal().isCallerRecents(callingUid)) { + if (!mInjector.getLocalService(ActivityTaskManagerInternal.class) + .isCallerRecents(callingUid)) { return false; } final long token = Binder.clearCallingIdentity(); @@ -5983,7 +6039,7 @@ public class PackageManagerService extends IPackageManager.Stub res.addAll(mAvailableFeatures.values()); } final FeatureInfo fi = new FeatureInfo(); - fi.reqGlEsVersion = SystemProperties.getInt("ro.opengles.version", + fi.reqGlEsVersion = mInjector.getSystemWrapper().getPropertyInt("ro.opengles.version", FeatureInfo.GL_ES_VERSION_UNDEFINED); res.add(fi); @@ -9065,10 +9121,10 @@ public class PackageManagerService extends IPackageManager.Stub if (providerInfo != null) { // Looking for cross-user grants before enforcing the typical cross-users permissions if (userId != UserHandle.getUserId(callingUid)) { - final UriGrantsManagerInternal mUgmInternal = - LocalServices.getService(UriGrantsManagerInternal.class); + final UriGrantsManagerInternal ugmInternal = + mInjector.getLocalService(UriGrantsManagerInternal.class); checkedGrants = - mUgmInternal.checkAuthorityGrants(callingUid, providerInfo, userId, true); + ugmInternal.checkAuthorityGrants(callingUid, providerInfo, userId, true); } } if (!checkedGrants) { @@ -9678,7 +9734,7 @@ public class PackageManagerService extends IPackageManager.Stub pkgName, getSettingsVersionForPackage(parsedPackage)), Collections.singletonMap(pkgName, getSharedLibLatestVersionSetting(scanResult))), - mSettings.mKeySetManagerService); + mSettings.mKeySetManagerService, mInjector); appIdCreated = optimisticallyRegisterAppId(scanResult); commitReconciledScanResultLocked( reconcileResult.get(pkgName), mUserManager.getUserIds()); @@ -9696,6 +9752,18 @@ public class PackageManagerService extends IPackageManager.Stub mSettings.disableSystemPackageLPw(parsedPackage.getPackageName(), true); } } + if (mIncrementalManager != null && isIncrementalPath(parsedPackage.getPath())) { + if (pkgSetting != null && pkgSetting.isPackageLoading()) { + final StorageHealthCheckParams healthCheckParams = new StorageHealthCheckParams(); + healthCheckParams.blockedTimeoutMs = INCREMENTAL_STORAGE_BLOCKED_TIMEOUT_MS; + healthCheckParams.unhealthyTimeoutMs = INCREMENTAL_STORAGE_UNHEALTHY_TIMEOUT_MS; + healthCheckParams.unhealthyMonitoringMs = + INCREMENTAL_STORAGE_UNHEALTHY_MONITORING_MS; + mIncrementalManager.registerHealthListener(parsedPackage.getPath(), + healthCheckParams, + new IncrementalHealthListener(parsedPackage.getPackageName())); + } + } return scanResult.pkgSetting.pkg; } @@ -9957,7 +10025,7 @@ public class PackageManagerService extends IPackageManager.Stub pkgCompilationReason = PackageManagerService.REASON_BACKGROUND_DEXOPT; } - if (SystemProperties.getBoolean(PRECOMPILE_LAYOUTS, false)) { + if (mInjector.getSystemWrapper().getPropertyBoolean(PRECOMPILE_LAYOUTS, false)) { mArtManagerService.compileLayouts(pkg); } @@ -10933,7 +11001,7 @@ public class PackageManagerService extends IPackageManager.Stub } private int getVendorPartitionVersion() { - final String version = SystemProperties.get("ro.vndk.version"); + final String version = mInjector.getSystemWrapper().getProperty("ro.vndk.version"); if (!version.isEmpty()) { try { return Integer.parseInt(version); @@ -12958,7 +13026,7 @@ public class PackageManagerService extends IPackageManager.Stub + intent.toShortString(false, true, false, false) + " " + intent.getExtras(), here); } - mInjector.getActivityManagerInternal().broadcastIntent( + mInjector.getLocalService(ActivityManagerInternal.class).broadcastIntent( intent, finishedReceiver, requiredPermissions, finishedReceiver != null, id, broadcastAllowList == null ? null : broadcastAllowList.get(id)); @@ -14263,7 +14331,7 @@ public class PackageManagerService extends IPackageManager.Stub && mInstantAppInstallerActivity.packageName.equals( mRequiredVerifierPackage)) { try { - mInjector.getAppOpsManager() + mInjector.getSystemService(AppOpsManager.class) .checkPackage(installerUid, mRequiredVerifierPackage); if (DEBUG_VERIFY) { Slog.i(TAG, "disable verification for instant app"); @@ -14513,7 +14581,7 @@ public class PackageManagerService extends IPackageManager.Stub if (getInstantAppPackageName(Binder.getCallingUid()) != null) { throw new SecurityException("Instant applications don't have access to this method"); } - mInjector.getAppOpsManager().checkPackage(Binder.getCallingUid(), + mInjector.getSystemService(AppOpsManager.class).checkPackage(Binder.getCallingUid(), callerPackageName); synchronized (mLock) { PackageSetting ps = mSettings.mPackages.get(packageName); @@ -14673,7 +14741,7 @@ public class PackageManagerService extends IPackageManager.Stub */ private boolean performRollbackManagerRestore(int userId, int token, PackageInstalledInfo res, PostInstallData data) { - RollbackManagerInternal rm = LocalServices.getService(RollbackManagerInternal.class); + RollbackManagerInternal rm = mInjector.getLocalService(RollbackManagerInternal.class); final String packageName = res.pkg.getPackageName(); final int[] allUsers = mUserManager.getUserIds(); @@ -15436,7 +15504,7 @@ public class PackageManagerService extends IPackageManager.Stub integrityVerification.setPackage("android"); DeviceIdleInternal idleController = - mInjector.getLocalDeviceIdleController(); + mInjector.getLocalService(DeviceIdleInternal.class); final long idleDuration = getVerificationTimeout(); idleController.addPowerSaveTempWhitelistAppDirect(Process.myUid(), @@ -15546,7 +15614,7 @@ public class PackageManagerService extends IPackageManager.Stub receivers, verificationState); DeviceIdleInternal idleController = - mInjector.getLocalDeviceIdleController(); + mInjector.getLocalService(DeviceIdleInternal.class); final long idleDuration = getVerificationTimeout(); final BroadcastOptions options = BroadcastOptions.makeBasic(); options.setTemporaryAppWhitelistDuration(idleDuration); @@ -16356,12 +16424,25 @@ public class PackageManagerService extends IPackageManager.Stub // TODO(b/169721400): generalize Incremental States and create a Callback object // that can be used for all the packages. - final IncrementalStatesCallback incrementalStatesCallback = - new IncrementalStatesCallback(ps, userId); final String codePath = ps.getPathString(); if (IncrementalManager.isIncrementalPath(codePath) && mIncrementalManager != null) { - mIncrementalManager.registerCallback(codePath, incrementalStatesCallback); + final IncrementalStatesCallback incrementalStatesCallback = + new IncrementalStatesCallback(ps.name, + UserHandle.getUid(userId, ps.appId), + getInstalledUsers(ps, userId)); ps.setIncrementalStatesCallback(incrementalStatesCallback); + mIncrementalManager.registerLoadingProgressCallback(codePath, + new IncrementalProgressListener(ps.name)); + final IncrementalHealthListener incrementalHealthListener = + new IncrementalHealthListener(ps.name); + final StorageHealthCheckParams healthCheckParams = + new StorageHealthCheckParams(); + healthCheckParams.blockedTimeoutMs = INCREMENTAL_STORAGE_BLOCKED_TIMEOUT_MS; + healthCheckParams.unhealthyTimeoutMs = INCREMENTAL_STORAGE_UNHEALTHY_TIMEOUT_MS; + healthCheckParams.unhealthyMonitoringMs = + INCREMENTAL_STORAGE_UNHEALTHY_MONITORING_MS; + mIncrementalManager.registerHealthListener(codePath, + new StorageHealthCheckParams(), incrementalHealthListener); } // Ensure that the uninstall reason is UNKNOWN for users with the package installed. @@ -16545,7 +16626,7 @@ public class PackageManagerService extends IPackageManager.Stub @GuardedBy("mLock") private static Map<String, ReconciledPackage> reconcilePackagesLocked( - final ReconcileRequest request, KeySetManagerService ksms) + final ReconcileRequest request, KeySetManagerService ksms, Injector injector) throws ReconcileFailure { final Map<String, ScanResult> scannedPackages = request.scannedPackages; @@ -16696,7 +16777,8 @@ public class PackageManagerService extends IPackageManager.Stub && compareSignatures(sharedUserSignatures, parsedPackage.getSigningDetails().signatures) != PackageManager.SIGNATURE_MATCH) { - if (SystemProperties.getInt("ro.product.first_api_level", 0) <= 29) { + if (injector.getSystemWrapper() + .getPropertyInt("ro.product.first_api_level", 0) <= 29) { // Mismatched signatures is an error and silently skipping system // packages will likely break the device in unforeseen ways. // However, we allow the device to boot anyway because, prior to Q, @@ -17070,7 +17152,7 @@ public class PackageManagerService extends IPackageManager.Stub try { Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "reconcilePackages"); reconciledPackages = reconcilePackagesLocked( - reconcileRequest, mSettings.mKeySetManagerService); + reconcileRequest, mSettings.mKeySetManagerService, mInjector); } catch (ReconcileFailure e) { for (InstallRequest request : requests) { request.installResult.setError("Reconciliation failed...", e); @@ -17205,7 +17287,7 @@ public class PackageManagerService extends IPackageManager.Stub if (performDexopt) { // Compile the layout resources. - if (SystemProperties.getBoolean(PRECOMPILE_LAYOUTS, false)) { + if (mInjector.getSystemWrapper().getPropertyBoolean(PRECOMPILE_LAYOUTS, false)) { Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "compileLayouts"); mViewCompiler.compileLayouts(pkg); Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); @@ -17264,45 +17346,39 @@ public class PackageManagerService extends IPackageManager.Stub NativeLibraryHelper.waitForNativeBinariesExtraction(incrementalStorages); } - private class IncrementalStatesCallback extends IPackageLoadingProgressCallback.Stub - implements IncrementalStates.Callback { - @GuardedBy("mPackageSetting") - private final PackageSetting mPackageSetting; - private final String mPackageName; - private final String mPathString; - private final int mUid; - private final int[] mInstalledUserIds; - - IncrementalStatesCallback(PackageSetting packageSetting, int userId) { - mPackageSetting = packageSetting; - mPackageName = packageSetting.name; - mUid = UserHandle.getUid(userId, packageSetting.appId); - mPathString = packageSetting.getPathString(); - final int[] allUserIds = resolveUserIds(userId); - final ArrayList<Integer> installedUserIds = new ArrayList<>(); - for (int i = 0; i < allUserIds.length; i++) { - if (packageSetting.getInstalled(allUserIds[i])) { - installedUserIds.add(allUserIds[i]); - } - } - final int numInstalledUserId = installedUserIds.size(); - mInstalledUserIds = new int[numInstalledUserId]; - for (int i = 0; i < numInstalledUserId; i++) { - mInstalledUserIds[i] = installedUserIds.get(i); + private int[] getInstalledUsers(PackageSetting ps, int userId) { + final int[] allUserIds = resolveUserIds(userId); + final ArrayList<Integer> installedUserIdsList = new ArrayList<>(); + for (int i = 0; i < allUserIds.length; i++) { + if (ps.getInstalled(allUserIds[i])) { + installedUserIdsList.add(allUserIds[i]); } } + final int numInstalledUserId = installedUserIdsList.size(); + final int[] installedUserIds = new int[numInstalledUserId]; + for (int i = 0; i < numInstalledUserId; i++) { + installedUserIds[i] = installedUserIdsList.get(i); + } + return installedUserIds; + } - @Override - public void onPackageLoadingProgressChanged(float progress) { - synchronized (mPackageSetting) { - mPackageSetting.setLoadingProgress(progress); - } + /** + * Package states callback, used to listen for package state changes and send broadcasts + */ + private final class IncrementalStatesCallback implements IncrementalStates.Callback { + private final String mPackageName; + private final int mUid; + private final int[] mInstalledUserIds; + IncrementalStatesCallback(String packageName, int uid, int[] installedUserIds) { + mPackageName = packageName; + mUid = uid; + mInstalledUserIds = installedUserIds; } @Override public void onPackageFullyLoaded() { - mIncrementalManager.unregisterCallback(mPathString, this); final SparseArray<int[]> newBroadcastAllowList; + final String codePath; synchronized (mLock) { final PackageSetting ps = mSettings.mPackages.get(mPackageName); if (ps == null) { @@ -17310,6 +17386,7 @@ public class PackageManagerService extends IPackageManager.Stub } newBroadcastAllowList = mAppsFilter.getVisibilityAllowList( ps, mInstalledUserIds, mSettings.mPackages); + codePath = ps.getPathString(); } Bundle extras = new Bundle(); extras.putInt(Intent.EXTRA_UID, mUid); @@ -17318,6 +17395,8 @@ public class PackageManagerService extends IPackageManager.Stub extras, 0 /*flags*/, null /*targetPackage*/, null /*finishedReceiver*/, mInstalledUserIds, null /* instantUserIds */, newBroadcastAllowList); + // Unregister health listener as it will always be healthy from now + mIncrementalManager.unregisterHealthListener(codePath); } @Override @@ -17365,37 +17444,48 @@ public class PackageManagerService extends IPackageManager.Stub } /** - * This is an internal method that is used to indicate changes on the health status of the - * Incremental Storage used by an installed package with an associated user id. This might - * result in a change in the loading state of the package. + * Loading progress callback, used to listen for progress changes and update package setting */ - public void onStorageHealthStatusChanged(String packageName, int status, int userId) { - final int callingUid = Binder.getCallingUid(); - mPermissionManager.enforceCrossUserPermission( - callingUid, userId, true, false, - "onStorageHealthStatusChanged"); - final PackageSetting ps = getPackageSettingForUser(packageName, callingUid, userId); - if (ps == null) { - return; + private class IncrementalProgressListener extends IPackageLoadingProgressCallback.Stub { + private final String mPackageName; + IncrementalProgressListener(String packageName) { + mPackageName = packageName; + } + + @Override + public void onPackageLoadingProgressChanged(float progress) { + final PackageSetting ps; + synchronized (mLock) { + ps = mSettings.mPackages.get(mPackageName); + } + if (ps == null) { + return; + } + ps.setLoadingProgress(progress); } - ps.setStorageHealthStatus(status); } /** - * This is an internal method that is used to indicate changes on the stream status of the - * data loader used by an installed package with an associated user id. This might - * result in a change in the loading state of the package. + * Incremental storage health status callback, used to listen for monitoring changes and update + * package setting. */ - public void onStreamStatusChanged(String packageName, int status, int userId) { - final int callingUid = Binder.getCallingUid(); - mPermissionManager.enforceCrossUserPermission( - callingUid, userId, true, false, - "onStreamStatusChanged"); - final PackageSetting ps = getPackageSettingForUser(packageName, callingUid, userId); - if (ps == null) { - return; + private class IncrementalHealthListener extends IStorageHealthListener.Stub { + private final String mPackageName; + IncrementalHealthListener(String packageName) { + mPackageName = packageName; + } + + @Override + public void onHealthStatus(int storageId, int status) throws RemoteException { + final PackageSetting ps; + synchronized (mLock) { + ps = mSettings.mPackages.get(mPackageName); + } + if (ps == null) { + return; + } + ps.setStorageHealthStatus(status); } - ps.setStreamStatus(status); } @Nullable PackageSetting getPackageSettingForUser(String packageName, int callingUid, @@ -19840,7 +19930,7 @@ public class PackageManagerService extends IPackageManager.Stub } private void resetNetworkPolicies(int userId) { - mInjector.getNetworkPolicyManagerInternal().resetUserState(userId); + mInjector.getLocalService(NetworkPolicyManagerInternal.class).resetUserState(userId); } /** @@ -21106,7 +21196,7 @@ public class PackageManagerService extends IPackageManager.Stub } public String getOverlayConfigSignaturePackageName() { - return ensureSystemPackageName(SystemConfig.getInstance() + return ensureSystemPackageName(mInjector.getSystemConfig() .getOverlayConfigSignaturePackage()); } @@ -21876,7 +21966,7 @@ public class PackageManagerService extends IPackageManager.Stub mPermissionManager.updateAllPermissions(StorageManager.UUID_PRIVATE_INTERNAL, false); final PermissionPolicyInternal permissionPolicyInternal = - mInjector.getPermissionPolicyInternal(); + mInjector.getLocalService(PermissionPolicyInternal.class); permissionPolicyInternal.setOnInitializedCallback(userId -> { // The SDK updated case is already handled when we run during the ctor. synchronized (mLock) { @@ -21887,13 +21977,13 @@ public class PackageManagerService extends IPackageManager.Stub } // Watch for external volumes that come and go over time - final StorageManager storage = mInjector.getStorageManager(); + final StorageManager storage = mInjector.getSystemService(StorageManager.class); storage.registerListener(mStorageListener); mInstallerService.systemReady(); mPackageDexOptimizer.systemReady(); - mInjector.getStorageManagerInternal().addExternalStoragePolicy( + mInjector.getLocalService(StorageManagerInternal.class).addExternalStoragePolicy( new StorageManagerInternal.ExternalStorageMountPolicy() { @Override public int getMountMode(int uid, String packageName) { @@ -22626,7 +22716,7 @@ public class PackageManagerService extends IPackageManager.Stub if (ArrayUtils.isEmpty(apkList)) { return; } - String sku = SystemProperties.get("ro.boot.hardware.sku"); + String sku = mInjector.getSystemWrapper().getProperty("ro.boot.hardware.sku"); if (!TextUtils.isEmpty(sku) && ArrayUtils.contains(skuArray, sku)) { return; } @@ -22922,7 +23012,7 @@ public class PackageManagerService extends IPackageManager.Stub } // Reconcile app data for all started/unlocked users - final StorageManager sm = mInjector.getStorageManager(); + final StorageManager sm = mInjector.getSystemService(StorageManager.class); UserManagerInternal umInternal = mInjector.getUserManagerInternal(); for (UserInfo user : mUserManager.getUsers(false /* includeDying */)) { final int flags; @@ -23123,7 +23213,7 @@ public class PackageManagerService extends IPackageManager.Stub * correct for all installed apps on all mounted volumes. */ void reconcileAppsData(int userId, int flags, boolean migrateAppsData) { - final StorageManager storage = mInjector.getStorageManager(); + final StorageManager storage = mInjector.getSystemService(StorageManager.class); for (VolumeInfo vol : storage.getWritablePrivateVolumes()) { final String volumeUuid = vol.getFsUuid(); synchronized (mInstallLock) { @@ -23258,7 +23348,7 @@ public class PackageManagerService extends IPackageManager.Stub Installer.Batch batch = new Installer.Batch(); UserManagerInternal umInternal = mInjector.getUserManagerInternal(); - StorageManagerInternal smInternal = mInjector.getStorageManagerInternal(); + StorageManagerInternal smInternal = mInjector.getLocalService(StorageManagerInternal.class); for (UserInfo user : mUserManager.getUsers(false /*excludeDying*/)) { final int flags; if (umInternal.isUserUnlockingOrUnlocked(user.id)) { @@ -23587,7 +23677,7 @@ public class PackageManagerService extends IPackageManager.Stub private void movePackageInternal(final String packageName, final String volumeUuid, final int moveId, final int callingUid, UserHandle user) throws PackageManagerException { - final StorageManager storage = mInjector.getStorageManager(); + final StorageManager storage = mInjector.getSystemService(StorageManager.class); final PackageManager pm = mContext.getPackageManager(); final String currentVolumeUuid; @@ -23825,7 +23915,7 @@ public class PackageManagerService extends IPackageManager.Stub return; } - final StorageManager storage = mInjector.getStorageManager();; + final StorageManager storage = mInjector.getSystemService(StorageManager.class);; VolumeInfo volume = storage.findVolumeByUuid(pkg.getStorageUuid().toString()); int packageExternalStorageType = getPackageExternalStorageType(volume, pkg.isExternalStorage()); @@ -23865,7 +23955,7 @@ public class PackageManagerService extends IPackageManager.Stub } }; - final StorageManager storage = mInjector.getStorageManager(); + final StorageManager storage = mInjector.getSystemService(StorageManager.class); storage.setPrimaryStorageUuid(volumeUuid, callback); return realMoveId; } @@ -24045,7 +24135,7 @@ public class PackageManagerService extends IPackageManager.Stub final long token = Binder.clearCallingIdentity(); try { final DeviceStorageMonitorInternal - dsm = mInjector.getDeviceStorageMonitorInternal(); + dsm = mInjector.getLocalService(DeviceStorageMonitorInternal.class); if (dsm != null) { return dsm.isMemoryLow(); } else { @@ -25637,7 +25727,7 @@ public class PackageManagerService extends IPackageManager.Stub "Failed registering loading progress callback. Incremental is not enabled"); return false; } - return mIncrementalManager.registerCallback(ps.getPathString(), + return mIncrementalManager.registerLoadingProgressCallback(ps.getPathString(), (IPackageLoadingProgressCallback) callback.getBinder()); } @@ -25656,7 +25746,7 @@ public class PackageManagerService extends IPackageManager.Stub if (mIncrementalManager == null) { return false; } - return mIncrementalManager.unregisterCallback(ps.getPathString(), + return mIncrementalManager.unregisterLoadingProgressCallback(ps.getPathString(), (IPackageLoadingProgressCallback) callback.getBinder()); } } @@ -25829,7 +25919,7 @@ public class PackageManagerService extends IPackageManager.Stub @Override public boolean isAutoRevokeWhitelisted(String packageName) { - int mode = mInjector.getAppOpsManager().checkOpNoThrow( + int mode = mInjector.getSystemService(AppOpsManager.class).checkOpNoThrow( AppOpsManager.OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED, Binder.getCallingUid(), packageName); return mode == MODE_IGNORED; diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index c46a7efaa704..9aa1a621a760 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -2729,13 +2729,13 @@ class PackageManagerShellCommand extends ShellCommand { Slog.i(TAG, "Removing " + userId + " or set as ephemeral if in use."); int result = um.removeUserOrSetEphemeral(userId); switch (result) { - case UserManagerService.REMOVE_RESULT_REMOVED: + case UserManager.REMOVE_RESULT_REMOVED: getOutPrintWriter().printf("Success: user %d removed\n", userId); return 0; - case UserManagerService.REMOVE_RESULT_SET_EPHEMERAL: + case UserManager.REMOVE_RESULT_SET_EPHEMERAL: getOutPrintWriter().printf("Success: user %d set as ephemeral\n", userId); return 0; - case UserManagerService.REMOVE_RESULT_ALREADY_BEING_REMOVED: + case UserManager.REMOVE_RESULT_ALREADY_BEING_REMOVED: getOutPrintWriter().printf("Success: user %d is already being removed\n", userId); return 0; default: diff --git a/services/core/java/com/android/server/pm/PackageSettingBase.java b/services/core/java/com/android/server/pm/PackageSettingBase.java index d52ad46d4b7e..be7c7c6ff1d6 100644 --- a/services/core/java/com/android/server/pm/PackageSettingBase.java +++ b/services/core/java/com/android/server/pm/PackageSettingBase.java @@ -793,13 +793,6 @@ public abstract class PackageSettingBase extends SettingBase { incrementalStates.onStorageHealthStatusChanged(status); } - /** - * @see IncrementalStates#onStreamStatusChanged(int) - */ - public void setStreamStatus(int status) { - incrementalStates.onStreamStatusChanged(status); - } - protected PackageSettingBase updateFrom(PackageSettingBase other) { super.copyFrom(other); setPath(other.getPath()); diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 66e84b180588..a0344e27f96c 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -22,7 +22,6 @@ import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import android.Manifest; import android.annotation.ColorRes; import android.annotation.DrawableRes; -import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.StringRes; @@ -132,8 +131,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; @@ -248,43 +245,6 @@ public class UserManagerService extends IUserManager.Stub { static final int WRITE_USER_MSG = 1; static final int WRITE_USER_DELAY = 2*1000; // 2 seconds - /** - * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that the specified - * user has been successfully removed. - */ - public static final int REMOVE_RESULT_REMOVED = 0; - - /** - * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that the specified - * user has had its {@link UserInfo#FLAG_EPHEMERAL} flag set to {@code true}, so that it will be - * removed when the user is stopped or on boot. - */ - public static final int REMOVE_RESULT_SET_EPHEMERAL = 1; - - /** - * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that the specified - * user is already in the process of being removed. - */ - public static final int REMOVE_RESULT_ALREADY_BEING_REMOVED = 2; - - /** - * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that an error occurred - * that prevented the user from being removed or set as ephemeral. - */ - public static final int REMOVE_RESULT_ERROR = 3; - - /** - * Possible response codes from {@link #removeUserOrSetEphemeral(int)}. - */ - @IntDef(prefix = { "REMOVE_RESULT_" }, value = { - REMOVE_RESULT_REMOVED, - REMOVE_RESULT_SET_EPHEMERAL, - REMOVE_RESULT_ALREADY_BEING_REMOVED, - REMOVE_RESULT_ERROR, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface RemoveResult {} - // Tron counters private static final String TRON_GUEST_CREATED = "users_guest_created"; private static final String TRON_USER_CREATED = "users_user_created"; @@ -4031,17 +3991,17 @@ public class UserManagerService extends IUserManager.Stub { } @Override - public @RemoveResult int removeUserOrSetEphemeral(@UserIdInt int userId) { + public @UserManager.RemoveResult int removeUserOrSetEphemeral(@UserIdInt int userId) { Slog.i(LOG_TAG, "removeUserOrSetEphemeral u" + userId); checkManageUsersPermission("Only the system can remove users"); final String restriction = getUserRemovalRestriction(userId); if (getUserRestrictions(UserHandle.getCallingUserId()).getBoolean(restriction, false)) { Slog.w(LOG_TAG, "Cannot remove user. " + restriction + " is enabled."); - return REMOVE_RESULT_ERROR; + return UserManager.REMOVE_RESULT_ERROR; } if (userId == UserHandle.USER_SYSTEM) { Slog.e(LOG_TAG, "System user cannot be removed."); - return REMOVE_RESULT_ERROR; + return UserManager.REMOVE_RESULT_ERROR; } final long ident = Binder.clearCallingIdentity(); @@ -4053,12 +4013,12 @@ public class UserManagerService extends IUserManager.Stub { if (userData == null) { Slog.e(LOG_TAG, "Cannot remove user " + userId + ", invalid user id provided."); - return REMOVE_RESULT_ERROR; + return UserManager.REMOVE_RESULT_ERROR; } if (mRemovingUserIds.get(userId)) { Slog.e(LOG_TAG, "User " + userId + " is already scheduled for removal."); - return REMOVE_RESULT_ALREADY_BEING_REMOVED; + return UserManager.REMOVE_RESULT_ALREADY_BEING_REMOVED; } } @@ -4067,7 +4027,7 @@ public class UserManagerService extends IUserManager.Stub { if (currentUser != userId) { // Attempt to remove the user. This will fail if the user is the current user if (removeUser(userId)) { - return REMOVE_RESULT_REMOVED; + return UserManager.REMOVE_RESULT_REMOVED; } Slog.w(LOG_TAG, "Unable to immediately remove non-current user: " + userId @@ -4081,7 +4041,7 @@ public class UserManagerService extends IUserManager.Stub { userData.info.flags |= UserInfo.FLAG_EPHEMERAL; writeUserLP(userData); - return REMOVE_RESULT_SET_EPHEMERAL; + return UserManager.REMOVE_RESULT_SET_EPHEMERAL; } } finally { Binder.restoreCallingIdentity(ident); diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java index 0e47ea8058f1..6caf9162b7a8 100644 --- a/services/core/java/com/android/server/wm/AppTransition.java +++ b/services/core/java/com/android/server/wm/AppTransition.java @@ -21,7 +21,6 @@ import static android.view.WindowManager.TRANSIT_ACTIVITY_CLOSE; import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN; import static android.view.WindowManager.TRANSIT_ACTIVITY_RELAUNCH; import static android.view.WindowManager.TRANSIT_CRASHING_ACTIVITY_CLOSE; -import static android.view.WindowManager.TRANSIT_DOCK_TASK_FROM_RECENTS; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_SUBTLE_ANIMATION; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE; @@ -92,7 +91,6 @@ import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; -import android.graphics.Path; import android.graphics.Picture; import android.graphics.Rect; import android.graphics.drawable.Drawable; @@ -134,7 +132,6 @@ import com.android.internal.util.function.pooled.PooledPredicate; import com.android.server.AttributeCache; import com.android.server.wm.animation.ClipRectLRAnimation; import com.android.server.wm.animation.ClipRectTBAnimation; -import com.android.server.wm.animation.CurvedTranslateAnimation; import java.io.PrintWriter; import java.util.ArrayList; @@ -161,9 +158,6 @@ public class AppTransition implements Dump { static final Interpolator TOUCH_RESPONSE_INTERPOLATOR = new PathInterpolator(0.3f, 0f, 0.1f, 1f); - private static final Interpolator THUMBNAIL_DOCK_INTERPOLATOR = - new PathInterpolator(0.85f, 0f, 1f, 1f); - /** * Maximum duration for the clip reveal animation. This is used when there is a lot of movement * involved, to make it more understandable. @@ -1127,11 +1121,8 @@ public class AppTransition implements Dump { scale.setInterpolator(interpolator); scale.setDuration(duration); Animation alpha = new AlphaAnimation(1f, 0f); - alpha.setInterpolator(mNextAppTransition == TRANSIT_DOCK_TASK_FROM_RECENTS - ? THUMBNAIL_DOCK_INTERPOLATOR : mThumbnailFadeOutInterpolator); - alpha.setDuration(mNextAppTransition == TRANSIT_DOCK_TASK_FROM_RECENTS - ? duration / 2 - : duration); + alpha.setInterpolator(mThumbnailFadeOutInterpolator); + alpha.setDuration(duration); Animation translate = createCurvedMotion(fromX, toX, fromY, toY); translate.setInterpolator(interpolator); translate.setDuration(duration); @@ -1194,44 +1185,15 @@ public class AppTransition implements Dump { } private Animation createCurvedMotion(float fromX, float toX, float fromY, float toY) { - - // Almost no x-change - use linear animation - if (Math.abs(toX - fromX) < 1f || mNextAppTransition != TRANSIT_DOCK_TASK_FROM_RECENTS) { - return new TranslateAnimation(fromX, toX, fromY, toY); - } else { - final Path path = createCurvedPath(fromX, toX, fromY, toY); - return new CurvedTranslateAnimation(path); - } - } - - private Path createCurvedPath(float fromX, float toX, float fromY, float toY) { - final Path path = new Path(); - path.moveTo(fromX, fromY); - - if (fromY > toY) { - // If the object needs to go up, move it in horizontal direction first, then vertical. - path.cubicTo(fromX, fromY, toX, 0.9f * fromY + 0.1f * toY, toX, toY); - } else { - // If the object needs to go down, move it in vertical direction first, then horizontal. - path.cubicTo(fromX, fromY, fromX, 0.1f * fromY + 0.9f * toY, toX, toY); - } - return path; + return new TranslateAnimation(fromX, toX, fromY, toY); } private long getAspectScaleDuration() { - if (mNextAppTransition == TRANSIT_DOCK_TASK_FROM_RECENTS) { - return (long) (THUMBNAIL_APP_TRANSITION_DURATION * 1.35f); - } else { - return THUMBNAIL_APP_TRANSITION_DURATION; - } + return THUMBNAIL_APP_TRANSITION_DURATION; } private Interpolator getAspectScaleInterpolator() { - if (mNextAppTransition == TRANSIT_DOCK_TASK_FROM_RECENTS) { - return mFastOutSlowInInterpolator; - } else { - return TOUCH_RESPONSE_INTERPOLATOR; - } + return TOUCH_RESPONSE_INTERPOLATOR; } /** @@ -1734,7 +1696,6 @@ public class AppTransition implements Dump { ? WindowAnimation_activityCloseEnterAnimation : WindowAnimation_activityCloseExitAnimation; break; - case TRANSIT_DOCK_TASK_FROM_RECENTS: case TRANSIT_TASK_OPEN: animAttr = enter ? WindowAnimation_taskOpenEnterAnimation @@ -1805,7 +1766,6 @@ public class AppTransition implements Dump { int getAppStackClipMode() { return mNextAppTransition == TRANSIT_ACTIVITY_RELAUNCH - || mNextAppTransition == TRANSIT_DOCK_TASK_FROM_RECENTS || mNextAppTransitionType == NEXT_TRANSIT_TYPE_CLIP_REVEAL || mNextAppTransition == TRANSIT_KEYGUARD_GOING_AWAY || mNextAppTransition == TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER @@ -2059,9 +2019,6 @@ public class AppTransition implements Dump { case TRANSIT_ACTIVITY_RELAUNCH: { return "TRANSIT_ACTIVITY_RELAUNCH"; } - case TRANSIT_DOCK_TASK_FROM_RECENTS: { - return "TRANSIT_DOCK_TASK_FROM_RECENTS"; - } case TRANSIT_KEYGUARD_GOING_AWAY: { return "TRANSIT_KEYGUARD_GOING_AWAY"; } diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java index 57d51c51c12b..6b8a3e22795e 100644 --- a/services/core/java/com/android/server/wm/AppTransitionController.java +++ b/services/core/java/com/android/server/wm/AppTransitionController.java @@ -21,7 +21,6 @@ import static android.view.WindowManager.TRANSIT_ACTIVITY_CLOSE; import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN; import static android.view.WindowManager.TRANSIT_ACTIVITY_RELAUNCH; import static android.view.WindowManager.TRANSIT_CRASHING_ACTIVITY_CLOSE; -import static android.view.WindowManager.TRANSIT_DOCK_TASK_FROM_RECENTS; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_SUBTLE_ANIMATION; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE; @@ -701,11 +700,9 @@ public class AppTransitionController { boolean openingAppHasWallpaper, boolean closingAppHasWallpaper) { // Given no app transition pass it through instead of a wallpaper transition. // Never convert the crashing transition. - // Never update the transition for the wallpaper if we are just docking from recents // Never convert a change transition since the top activity isn't changing and will likely // still be above an opening wallpaper. if (transit == TRANSIT_NONE || transit == TRANSIT_CRASHING_ACTIVITY_CLOSE - || transit == TRANSIT_DOCK_TASK_FROM_RECENTS || AppTransition.isChangeTransit(transit)) { return transit; } diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java index 48550ed016c3..6486b78eb601 100644 --- a/services/core/java/com/android/server/wm/TaskOrganizerController.java +++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java @@ -161,17 +161,18 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { return; } ProtoLog.v(WM_DEBUG_WINDOW_ORGANIZER, "Task info changed taskId=%d", task.mTaskId); - mDeferTaskOrgCallbacksConsumer.accept(() -> { - if (!task.isOrganized()) { - // This is safe to ignore if the task is no longer organized - return; - } - try { - mTaskOrganizer.onTaskInfoChanged(taskInfo); - } catch (RemoteException e) { - Slog.e(TAG, "Exception sending onTaskInfoChanged callback", e); - } - }); + if (!task.isOrganized()) { + // This is safe to ignore if the task is no longer organized + return; + } + try { + // Purposely notify of task info change immediately instead of deferring (like + // appear and vanish) to allow info changes (such as new PIP params) to flow + // without waiting. + mTaskOrganizer.onTaskInfoChanged(taskInfo); + } catch (RemoteException e) { + Slog.e(TAG, "Exception sending onTaskInfoChanged callback", e); + } } void onBackPressedOnTaskRoot(Task task) { @@ -182,17 +183,15 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { // by the organizer that don't receive that signal return; } - mDeferTaskOrgCallbacksConsumer.accept(() -> { - if (!task.isOrganized()) { - // This is safe to ignore if the task is no longer organized - return; - } - try { - mTaskOrganizer.onBackPressedOnTaskRoot(task.getTaskInfo()); - } catch (Exception e) { - Slog.e(TAG, "Exception sending onBackPressedOnTaskRoot callback", e); - } - }); + if (!task.isOrganized()) { + // This is safe to ignore if the task is no longer organized + return; + } + try { + mTaskOrganizer.onBackPressedOnTaskRoot(task.getTaskInfo()); + } catch (Exception e) { + Slog.e(TAG, "Exception sending onBackPressedOnTaskRoot callback", e); + } } } @@ -390,6 +389,10 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { } void onTaskAppeared(ITaskOrganizer organizer, Task task) { + // Don't send onTaskAppeared signal for task created by organizer since we will return it in + // the creation call. + if (task.mCreatedByOrganizer) return; + final TaskOrganizerState state = mTaskOrganizerStates.get(organizer.asBinder()); state.addTask(task); } @@ -402,7 +405,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { } @Override - public RunningTaskInfo createRootTask(int displayId, int windowingMode) { + public TaskAppearedInfo createRootTask(int displayId, int windowingMode) { enforceStackPermission("createRootTask()"); final long origId = Binder.clearCallingIdentity(); try { @@ -419,7 +422,11 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { true /* createdByOrganizer */); RunningTaskInfo out = task.getTaskInfo(); mLastSentTaskInfos.put(task, out); - return out; + final TaskOrganizerState state = + mTaskOrganizerStates.get(task.mTaskOrganizer.asBinder()); + final SurfaceControl outSurfaceControl = state.addTaskWithoutCallback(task, + "TaskOrganizerController.createRootTask"); + return new TaskAppearedInfo(task.getTaskInfo(), outSurfaceControl); } } finally { Binder.restoreCallingIdentity(origId); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 40b770fc67ec..ad624d50f7fd 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -225,7 +225,7 @@ import android.view.IOnKeyguardExitResult; import android.view.IPinnedStackListener; import android.view.IRecentsAnimationRunner; import android.view.IRotationWatcher; -import android.view.IScrollCaptureController; +import android.view.IScrollCaptureCallbacks; import android.view.ISystemGestureExclusionListener; import android.view.IWallpaperVisibilityListener; import android.view.IWindow; @@ -6902,16 +6902,17 @@ public class WindowManagerService extends IWindowManager.Stub * * @param displayId the display for the request * @param behindClient token for a window, used to filter the search to windows behind it - * @param taskId specifies the id of a task the result must belong to or -1 to ignore task ids - * @param controller the controller to receive results; a call to either - * {@link IScrollCaptureController#onClientConnected} or - * {@link IScrollCaptureController#onClientUnavailable}. + * @param taskId specifies the id of a task the result must belong to or -1 to match any task + * @param callbacks to receive responses */ public void requestScrollCapture(int displayId, @Nullable IBinder behindClient, int taskId, - IScrollCaptureController controller) { + IScrollCaptureCallbacks callbacks) { if (!checkCallingPermission(READ_FRAME_BUFFER, "requestScrollCapture()")) { throw new SecurityException("Requires READ_FRAME_BUFFER permission"); } + if (behindClient != null && !isWindowToken(behindClient)) { + throw new IllegalArgumentException("behindClient must be a window token"); + } final long token = Binder.clearCallingIdentity(); try { synchronized (mGlobalLock) { @@ -6919,26 +6920,26 @@ public class WindowManagerService extends IWindowManager.Stub if (dc == null) { ProtoLog.e(WM_ERROR, "Invalid displayId for requestScrollCapture: %d", displayId); - controller.onClientUnavailable(); + callbacks.onUnavailable(); return; } WindowState topWindow = null; if (behindClient != null) { - topWindow = windowForClientLocked(null, behindClient, /* throwOnError*/ true); + topWindow = windowForClientLocked(null, behindClient, /* throwOnError*/ false); } WindowState targetWindow = dc.findScrollCaptureTargetWindow(topWindow, taskId); if (targetWindow == null) { - controller.onClientUnavailable(); + callbacks.onUnavailable(); return; } // Forward to the window for handling. try { - targetWindow.mClient.requestScrollCapture(controller); + targetWindow.mClient.requestScrollCapture(callbacks); } catch (RemoteException e) { ProtoLog.w(WM_ERROR, "requestScrollCapture: caught exception dispatching to window." + "token=%s", targetWindow.mClient.asBinder()); - controller.onClientUnavailable(); + callbacks.onUnavailable(); } } } catch (RemoteException e) { diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/CertificateMonitor.java b/services/devicepolicy/java/com/android/server/devicepolicy/CertificateMonitor.java index aa38880d6d7d..fdde4ea36583 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/CertificateMonitor.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/CertificateMonitor.java @@ -205,9 +205,10 @@ public class CertificateMonitor { dialogIntent.setComponent(targetInfo.getComponentName()); } + // Simple notification clicks are immutable PendingIntent notifyIntent = mInjector.pendingIntentGetActivityAsUser(userContext, 0, - dialogIntent, PendingIntent.FLAG_UPDATE_CURRENT, null, - UserHandle.of(parentUserId)); + dialogIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE, + null, UserHandle.of(parentUserId)); return new Notification.Builder(userContext, SystemNotificationChannels.SECURITY) .setSmallIcon(smallIconId) diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 5dbb34817188..cd3d50d91afd 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -2153,9 +2153,11 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { mInjector.binderWithCleanCallingIdentity(() -> { int affectedUserHandle = parent ? getProfileParentId(userHandle) : userHandle; AlarmManager am = mInjector.getAlarmManager(); + // Broadcast alarms sent by system are immutable PendingIntent pi = PendingIntent.getBroadcastAsUser(context, REQUEST_EXPIRE_PASSWORD, new Intent(ACTION_EXPIRED_PASSWORD_NOTIFICATION), - PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT, + PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT + | PendingIntent.FLAG_IMMUTABLE, UserHandle.of(affectedUserHandle)); am.cancel(pi); if (alarmTime != 0) { @@ -10693,8 +10695,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { Slog.wtf(LOG_TAG, "Failed to resolve intent for location settings"); } + // Simple notification clicks are immutable PendingIntent locationSettingsIntent = mInjector.pendingIntentGetActivityAsUser(mContext, 0, - intent, PendingIntent.FLAG_UPDATE_CURRENT, null, user); + intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE, null, + user); Notification notification = new Notification.Builder(mContext, SystemNotificationChannels.DEVICE_ADMIN) .setSmallIcon(R.drawable.ic_info_outline) @@ -13545,8 +13549,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { final PackageManagerInternal pm = mInjector.getPackageManagerInternal(); final Intent intent = new Intent(DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG); intent.setPackage(pm.getSystemUiServiceComponent().getPackageName()); - final PendingIntent pendingIntent = PendingIntent.getBroadcastAsUser(mContext, 0, intent, 0, - UserHandle.CURRENT); + // Simple notification clicks are immutable + final PendingIntent pendingIntent = PendingIntent.getBroadcastAsUser(mContext, 0, intent, + PendingIntent.FLAG_IMMUTABLE, UserHandle.CURRENT); Notification notification = new Notification.Builder(mContext, SystemNotificationChannels.DEVICE_ADMIN) .setSmallIcon(R.drawable.ic_info_outline) @@ -14937,9 +14942,11 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { final AlarmManager am = mInjector.getAlarmManager(); final Intent intent = new Intent(ACTION_PROFILE_OFF_DEADLINE); intent.setPackage(mContext.getPackageName()); + // Broadcast alarms sent by system are immutable final PendingIntent pi = mInjector.pendingIntentGetBroadcast( mContext, REQUEST_PROFILE_OFF_DEADLINE, intent, - PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT); + PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT + | PendingIntent.FLAG_IMMUTABLE); if (alarmTime == 0) { Slog.i(LOG_TAG, "Profile off deadline alarm is removed."); @@ -15000,8 +15007,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { intent.setPackage(mContext.getPackageName()); intent.putExtra(Intent.EXTRA_USER_HANDLE, profileUserId); + // Simple notification action button clicks are immutable final PendingIntent pendingIntent = mInjector.pendingIntentGetBroadcast(mContext, - 0 /* requestCode */, intent, PendingIntent.FLAG_UPDATE_CURRENT); + 0 /* requestCode */, intent, + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); final String buttonText = mContext.getString(R.string.personal_apps_suspended_turn_profile_on); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/RemoteBugreportManager.java b/services/devicepolicy/java/com/android/server/devicepolicy/RemoteBugreportManager.java index 46c9aab5bb97..543f3815454e 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/RemoteBugreportManager.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/RemoteBugreportManager.java @@ -137,8 +137,9 @@ public class RemoteBugreportManager { Slog.wtf(LOG_TAG, "Failed to resolve intent for remote bugreport dialog"); } + // Simple notification clicks are immutable final PendingIntent pendingDialogIntent = PendingIntent.getActivityAsUser(mContext, type, - dialogIntent, 0, null, UserHandle.CURRENT); + dialogIntent, PendingIntent.FLAG_IMMUTABLE, null, UserHandle.CURRENT); final Notification.Builder builder = new Notification.Builder(mContext, SystemNotificationChannels.DEVICE_ADMIN) @@ -158,12 +159,14 @@ public class RemoteBugreportManager { R.string.taking_remote_bugreport_notification_title)) .setProgress(0, 0, true); } else if (type == NOTIFICATION_BUGREPORT_FINISHED_NOT_ACCEPTED) { + // Simple notification action button clicks are immutable final PendingIntent pendingIntentAccept = PendingIntent.getBroadcast(mContext, NOTIFICATION_ID, new Intent(ACTION_BUGREPORT_SHARING_ACCEPTED), - PendingIntent.FLAG_CANCEL_CURRENT); + PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE); + // Simple notification action button clicks are immutable final PendingIntent pendingIntentDecline = PendingIntent.getBroadcast(mContext, NOTIFICATION_ID, new Intent(ACTION_BUGREPORT_SHARING_DECLINED), - PendingIntent.FLAG_CANCEL_CURRENT); + PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE); builder.addAction(new Notification.Action.Builder(null /* icon */, mContext.getString( R.string.decline_remote_bugreport_action), pendingIntentDecline).build()) .addAction(new Notification.Action.Builder(null /* icon */, mContext.getString( diff --git a/services/incremental/BinderIncrementalService.cpp b/services/incremental/BinderIncrementalService.cpp index 2f8825b064ce..a31aac96eb48 100644 --- a/services/incremental/BinderIncrementalService.cpp +++ b/services/incremental/BinderIncrementalService.cpp @@ -323,6 +323,22 @@ binder::Status BinderIncrementalService::unregisterLoadingProgressListener(int32 return ok(); } +binder::Status BinderIncrementalService::registerStorageHealthListener( + int32_t storageId, + const ::android::os::incremental::StorageHealthCheckParams& healthCheckParams, + const ::android::sp<IStorageHealthListener>& healthListener, bool* _aidl_return) { + *_aidl_return = mImpl.registerStorageHealthListener(storageId, + const_cast<StorageHealthCheckParams&&>( + healthCheckParams), + healthListener); + return ok(); +} + +binder::Status BinderIncrementalService::unregisterStorageHealthListener(int32_t storageId) { + mImpl.unregisterStorageHealthListener(storageId); + return ok(); +} + } // namespace android::os::incremental jlong Incremental_IncrementalService_Start(JNIEnv* env) { diff --git a/services/incremental/BinderIncrementalService.h b/services/incremental/BinderIncrementalService.h index 0a89166f4868..8afa0f7bb117 100644 --- a/services/incremental/BinderIncrementalService.h +++ b/services/incremental/BinderIncrementalService.h @@ -89,6 +89,11 @@ public: progressListener, bool* _aidl_return) final; binder::Status unregisterLoadingProgressListener(int32_t storageId, bool* _aidl_return) final; + binder::Status registerStorageHealthListener( + int32_t storageId, + const ::android::os::incremental::StorageHealthCheckParams& healthCheckParams, + const ::android::sp<IStorageHealthListener>& healthListener, bool* _aidl_return) final; + binder::Status unregisterStorageHealthListener(int32_t storageId) final; private: android::incremental::IncrementalService mImpl; diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp index 5f145f33f628..599ac9344e73 100644 --- a/services/incremental/IncrementalService.cpp +++ b/services/incremental/IncrementalService.cpp @@ -1801,6 +1801,31 @@ bool IncrementalService::unregisterLoadingProgressListener(StorageId storage) { return removeTimedJobs(*mProgressUpdateJobQueue, storage); } +bool IncrementalService::registerStorageHealthListener( + StorageId storage, StorageHealthCheckParams&& healthCheckParams, + const StorageHealthListener& healthListener) { + DataLoaderStubPtr dataLoaderStub; + { + std::unique_lock l(mLock); + const auto& ifs = getIfsLocked(storage); + if (!ifs) { + return false; + } + dataLoaderStub = ifs->dataLoaderStub; + if (!dataLoaderStub) { + return false; + } + } + dataLoaderStub->setHealthListener(std::move(healthCheckParams), &healthListener); + return true; +} + +void IncrementalService::unregisterStorageHealthListener(StorageId storage) { + StorageHealthCheckParams invalidCheckParams; + invalidCheckParams.blockedTimeoutMs = -1; + registerStorageHealthListener(storage, std::move(invalidCheckParams), {}); +} + bool IncrementalService::perfLoggingEnabled() { static const bool enabled = base::GetBoolProperty("incremental.perflogging", false); return enabled; @@ -2137,6 +2162,19 @@ binder::Status IncrementalService::DataLoaderStub::onStatusChanged(MountId mount binder::Status IncrementalService::DataLoaderStub::reportStreamHealth(MountId mountId, int newStatus) { + if (!isValid()) { + return binder::Status:: + fromServiceSpecificError(-EINVAL, + "reportStreamHealth came to invalid DataLoaderStub"); + } + if (id() != mountId) { + LOG(ERROR) << "Mount ID mismatch: expected " << id() << ", but got: " << mountId; + return binder::Status::fromServiceSpecificError(-EPERM, "Mount ID mismatch."); + } + { + std::lock_guard lock(mMutex); + mStreamStatus = newStatus; + } return binder::Status::ok(); } @@ -2153,6 +2191,33 @@ void IncrementalService::DataLoaderStub::onHealthStatus(StorageHealthListener he } } +static int adjustHealthStatus(int healthStatus, int streamStatus) { + if (healthStatus == IStorageHealthListener::HEALTH_STATUS_OK) { + // everything is good; no need to change status + return healthStatus; + } + int newHeathStatus = healthStatus; + switch (streamStatus) { + case IDataLoaderStatusListener::STREAM_STORAGE_ERROR: + // storage is limited and storage not healthy + newHeathStatus = IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_STORAGE; + break; + case IDataLoaderStatusListener::STREAM_INTEGRITY_ERROR: + // fall through + case IDataLoaderStatusListener::STREAM_SOURCE_ERROR: + // fall through + case IDataLoaderStatusListener::STREAM_TRANSPORT_ERROR: + if (healthStatus == IStorageHealthListener::HEALTH_STATUS_UNHEALTHY) { + newHeathStatus = IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_TRANSPORT; + } + // pending/blocked status due to transportation issues is not regarded as unhealthy + break; + default: + break; + } + return newHeathStatus; +} + void IncrementalService::DataLoaderStub::updateHealthStatus(bool baseline) { LOG(DEBUG) << id() << ": updateHealthStatus" << (baseline ? " (baseline)" : ""); @@ -2232,6 +2297,8 @@ void IncrementalService::DataLoaderStub::updateHealthStatus(bool baseline) { checkBackAfter = unhealthyMonitoring; healthStatusToReport = IStorageHealthListener::HEALTH_STATUS_UNHEALTHY; } + // Adjust health status based on stream status + healthStatusToReport = adjustHealthStatus(healthStatusToReport, mStreamStatus); LOG(DEBUG) << id() << ": updateHealthStatus in " << double(checkBackAfter.count()) / 1000.0 << "secs"; mService.addTimedJob(*mService.mTimedQueue, id(), checkBackAfter, @@ -2321,6 +2388,18 @@ void IncrementalService::DataLoaderStub::unregisterFromPendingReads() { mService.mLooper->wake(); } +void IncrementalService::DataLoaderStub::setHealthListener( + StorageHealthCheckParams&& healthCheckParams, const StorageHealthListener* healthListener) { + std::lock_guard lock(mMutex); + mHealthCheckParams = std::move(healthCheckParams); + if (healthListener == nullptr) { + // reset listener and params + mHealthListener = {}; + } else { + mHealthListener = *healthListener; + } +} + void IncrementalService::DataLoaderStub::onDump(int fd) { dprintf(fd, " dataLoader: {\n"); dprintf(fd, " currentStatus: %d\n", mCurrentStatus); diff --git a/services/incremental/IncrementalService.h b/services/incremental/IncrementalService.h index 504c02a57b86..4c4b8bd1ba50 100644 --- a/services/incremental/IncrementalService.h +++ b/services/incremental/IncrementalService.h @@ -140,7 +140,10 @@ public: bool registerLoadingProgressListener(StorageId storage, const StorageLoadingProgressListener& progressListener); bool unregisterLoadingProgressListener(StorageId storage); - + bool registerStorageHealthListener(StorageId storage, + StorageHealthCheckParams&& healthCheckParams, + const StorageHealthListener& healthListener); + void unregisterStorageHealthListener(StorageId storage); RawMetadata getMetadata(StorageId storage, std::string_view path) const; RawMetadata getMetadata(StorageId storage, FileId node) const; @@ -197,6 +200,8 @@ private: MountId id() const { return mId.load(std::memory_order_relaxed); } const content::pm::DataLoaderParamsParcel& params() const { return mParams; } + void setHealthListener(StorageHealthCheckParams&& healthCheckParams, + const StorageHealthListener* healthListener); private: binder::Status onStatusChanged(MountId mount, int newStatus) final; @@ -251,6 +256,7 @@ private: BootClockTsUs kernelTsUs; } mHealthBase = {TimePoint::max(), kMaxBootClockTsUs}; StorageHealthCheckParams mHealthCheckParams; + int mStreamStatus = content::pm::IDataLoaderStatusListener::STREAM_HEALTHY; }; using DataLoaderStubPtr = sp<DataLoaderStub>; diff --git a/services/incremental/test/IncrementalServiceTest.cpp b/services/incremental/test/IncrementalServiceTest.cpp index aec9fa1c3277..867312e0eb2f 100644 --- a/services/incremental/test/IncrementalServiceTest.cpp +++ b/services/incremental/test/IncrementalServiceTest.cpp @@ -177,6 +177,18 @@ public: } return binder::Status::ok(); } + binder::Status storageError(int32_t id) { + if (mListener) { + mListener->reportStreamHealth(id, IDataLoaderStatusListener::STREAM_STORAGE_ERROR); + } + return binder::Status::ok(); + } + binder::Status transportError(int32_t id) { + if (mListener) { + mListener->reportStreamHealth(id, IDataLoaderStatusListener::STREAM_INTEGRITY_ERROR); + } + return binder::Status::ok(); + } int32_t setStorageParams(bool enableReadLogs) { int32_t result = -1; EXPECT_NE(mServiceConnector.get(), nullptr); @@ -1221,4 +1233,83 @@ TEST_F(IncrementalServiceTest, testRegisterLoadingProgressListenerFailsToGetProg EXPECT_CALL(*listenerMock, onStorageLoadingProgressChanged(_, _)).Times(0); mIncrementalService->registerLoadingProgressListener(storageId, listener); } + +TEST_F(IncrementalServiceTest, testRegisterStorageHealthListenerSuccess) { + mIncFs->openMountSuccess(); + sp<NiceMock<MockStorageHealthListener>> listener{new NiceMock<MockStorageHealthListener>}; + sp<NiceMock<MockStorageHealthListener>> newListener{new NiceMock<MockStorageHealthListener>}; + NiceMock<MockStorageHealthListener>* newListenerMock = newListener.get(); + + TemporaryDir tempDir; + int storageId = mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), + IncrementalService::CreateOptions::CreateNew, + {}, StorageHealthCheckParams{}, listener); + ASSERT_GE(storageId, 0); + StorageHealthCheckParams newParams; + newParams.blockedTimeoutMs = 10000; + newParams.unhealthyTimeoutMs = 20000; + newParams.unhealthyMonitoringMs = 30000; + ASSERT_TRUE(mIncrementalService->registerStorageHealthListener(storageId, std::move(newParams), + newListener)); + + using MS = std::chrono::milliseconds; + using MCS = std::chrono::microseconds; + + const auto blockedTimeout = MS(newParams.blockedTimeoutMs); + const auto unhealthyTimeout = MS(newParams.unhealthyTimeoutMs); + + const uint64_t kFirstTimestampUs = 1000000000ll; + const uint64_t kBlockedTimestampUs = + kFirstTimestampUs - std::chrono::duration_cast<MCS>(blockedTimeout).count(); + const uint64_t kUnhealthyTimestampUs = + kFirstTimestampUs - std::chrono::duration_cast<MCS>(unhealthyTimeout).count(); + + // test that old listener was not called + EXPECT_CALL(*listener.get(), + onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING)) + .Times(0); + EXPECT_CALL(*newListenerMock, + onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING)) + .Times(1); + EXPECT_CALL(*newListenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_BLOCKED)) + .Times(1); + EXPECT_CALL(*newListenerMock, + onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_STORAGE)) + .Times(1); + EXPECT_CALL(*newListenerMock, + onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_TRANSPORT)) + .Times(1); + mIncFs->waitForPendingReadsSuccess(kFirstTimestampUs); + mLooper->mCallback(-1, -1, mLooper->mCallbackData); + + ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_READS_PENDING, newListener->mStatus); + ASSERT_EQ(storageId, newListener->mStorageId); + + auto timedCallback = mTimedQueue->mWhat; + mTimedQueue->clearJob(storageId); + + // test when health status is blocked with transport error + mDataLoader->transportError(storageId); + mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs); + timedCallback(); + ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_BLOCKED, newListener->mStatus); + timedCallback = mTimedQueue->mWhat; + mTimedQueue->clearJob(storageId); + + // test when health status is blocked with storage error + mDataLoader->storageError(storageId); + mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs); + timedCallback(); + ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_STORAGE, newListener->mStatus); + timedCallback = mTimedQueue->mWhat; + mTimedQueue->clearJob(storageId); + + // test when health status is unhealthy with transport error + mDataLoader->transportError(storageId); + mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs); + timedCallback(); + ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_TRANSPORT, newListener->mStatus); + mTimedQueue->clearJob(storageId); +} + } // namespace android::os::incremental diff --git a/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java b/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java index ddd1f7568224..d14ed5a15cf9 100644 --- a/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java +++ b/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java @@ -29,6 +29,8 @@ import android.os.Looper; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemProperties; +import android.os.UpdateEngine; +import android.os.UpdateEngineCallback; import android.util.Log; import com.android.server.IoThread; @@ -198,6 +200,7 @@ public final class ProfcollectForwardingService extends SystemService { // Event observers private void registerObservers() { registerAppLaunchObserver(); + registerOTAObserver(); } private final AppLaunchObserver mAppLaunchObserver = new AppLaunchObserver(); @@ -261,4 +264,33 @@ public final class ProfcollectForwardingService extends SystemService { // Ignored } } + + private void registerOTAObserver() { + UpdateEngine updateEngine = new UpdateEngine(); + updateEngine.bind(new UpdateEngineCallback() { + @Override + public void onStatusUpdate(int status, float percent) { + if (status == UpdateEngine.UpdateStatusConstants.UPDATED_NEED_REBOOT) { + packProfileReport(); + } + } + + @Override + public void onPayloadApplicationComplete(int errorCode) { + // Ignored + } + }); + } + + private void packProfileReport() { + if (mIProfcollect == null) { + return; + } + + try { + mIProfcollect.CreateProfileReport(); + } catch (RemoteException e) { + Log.e(LOG_TAG, e.getMessage()); + } + } } diff --git a/services/tests/PackageManagerComponentOverrideTests/src/com/android/server/pm/test/override/PackageManagerComponentLabelIconOverrideTest.kt b/services/tests/PackageManagerComponentOverrideTests/src/com/android/server/pm/test/override/PackageManagerComponentLabelIconOverrideTest.kt index 09552082e4af..27b07c76fb0d 100644 --- a/services/tests/PackageManagerComponentOverrideTests/src/com/android/server/pm/test/override/PackageManagerComponentLabelIconOverrideTest.kt +++ b/services/tests/PackageManagerComponentOverrideTests/src/com/android/server/pm/test/override/PackageManagerComponentLabelIconOverrideTest.kt @@ -45,6 +45,7 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.Parameterized +import org.mockito.Mockito import org.mockito.Mockito.any import org.mockito.Mockito.anyBoolean import org.mockito.Mockito.anyInt @@ -341,7 +342,8 @@ class PackageManagerComponentLabelIconOverrideTest { whenever(this.userManagerService) { mockUserManagerService } whenever(this.permissionManagerServiceInternal) { mockPermissionManagerService } whenever(this.settings) { mockSettings } - whenever(this.activityTaskManagerInternal) { mockActivityTaskManager } + whenever(this.getLocalService(ActivityTaskManagerInternal::class.java)) { + mockActivityTaskManager} whenever(this.appsFilter) { mockAppsFilter } whenever(this.context) { mockContext } } diff --git a/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java b/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java index 6f4ff35ba0df..04de6ca192ef 100644 --- a/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java @@ -153,7 +153,7 @@ public class UserControllerTest { doNothing().when(mInjector).startHomeActivity(anyInt(), anyString()); doReturn(false).when(mInjector).stackSupervisorSwitchUser(anyInt(), any()); doNothing().when(mInjector).stackSupervisorResumeFocusedStackTopActivity(); - doNothing().when(mInjector).systemServiceManagerCleanupUser(anyInt()); + doNothing().when(mInjector).systemServiceManagerOnUserStopped(anyInt()); doNothing().when(mInjector).activityManagerForceStopPackage(anyInt(), anyString()); doNothing().when(mInjector).activityManagerOnUserStopped(anyInt()); doNothing().when(mInjector).clearBroadcastQueueForUser(anyInt()); diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java new file mode 100644 index 000000000000..c7331e19e698 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2020 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.hdmi; + +import static com.android.server.hdmi.HdmiCecMessageValidator.ERROR_DESTINATION; +import static com.android.server.hdmi.HdmiCecMessageValidator.ERROR_PARAMETER_SHORT; +import static com.android.server.hdmi.HdmiCecMessageValidator.ERROR_SOURCE; +import static com.android.server.hdmi.HdmiCecMessageValidator.OK; + +import static com.google.common.truth.Truth.assertThat; + +import android.platform.test.annotations.Presubmit; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; + +import com.google.common.truth.IntegerSubject; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** Tests for {@link com.android.server.hdmi.HdmiCecMessageValidator} class. */ +@SmallTest +@Presubmit +@RunWith(JUnit4.class) +public class HdmiCecMessageValidatorTest { + + private HdmiCecMessageValidator mHdmiCecMessageValidator; + + @Before + public void setUp() throws Exception { + HdmiControlService mHdmiControlService = new HdmiControlService( + InstrumentationRegistry.getTargetContext()); + + mHdmiCecMessageValidator = new HdmiCecMessageValidator(mHdmiControlService); + } + + @Test + public void isValid_giveDevicePowerStatus() { + assertMessageValidity("04:8F").isEqualTo(OK); + + assertMessageValidity("0F:8F").isEqualTo(ERROR_DESTINATION); + assertMessageValidity("F4:8F").isEqualTo(ERROR_SOURCE); + } + + @Test + public void isValid_reportPowerStatus() { + assertMessageValidity("04:90:00").isEqualTo(OK); + + assertMessageValidity("0F:90:00").isEqualTo(ERROR_DESTINATION); + assertMessageValidity("F0:90").isEqualTo(ERROR_SOURCE); + assertMessageValidity("04:90").isEqualTo(ERROR_PARAMETER_SHORT); + } + + private IntegerSubject assertMessageValidity(String message) { + return assertThat(mHdmiCecMessageValidator.isValid(buildMessage(message))); + } + + /** + * Build a CEC message from a hex byte string with bytes separated by {@code :}. + * + * <p>This format is used by both cec-client and www.cec-o-matic.com + */ + private static HdmiCecMessage buildMessage(String message) { + String[] parts = message.split(":"); + int src = Integer.parseInt(parts[0].substring(0, 1), 16); + int dest = Integer.parseInt(parts[0].substring(1, 2), 16); + int opcode = Integer.parseInt(parts[1], 16); + byte[] params = new byte[parts.length - 2]; + for (int i = 0; i < params.length; i++) { + params[i] = (byte) Integer.parseInt(parts[i + 2], 16); + } + return new HdmiCecMessage(src, dest, opcode, params); + } +} diff --git a/services/tests/servicestests/src/com/android/server/pm/IncrementalStatesTest.java b/services/tests/servicestests/src/com/android/server/pm/IncrementalStatesTest.java index c4c2f68e8219..86758f18a407 100644 --- a/services/tests/servicestests/src/com/android/server/pm/IncrementalStatesTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/IncrementalStatesTest.java @@ -20,7 +20,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import android.content.pm.IDataLoaderStatusListener; import android.content.pm.PackageManager; import android.os.ConditionVariable; import android.os.incremental.IStorageHealthListener; @@ -113,71 +112,12 @@ public class IncrementalStatesTest { } /** - * Test that the package is still startable when Incremental Storage is at blocked status. + * Test that the package becomes unstartable when health status indicate storage issues. */ @Test public void testStartableTransition_IncrementalStorageBlocked() { mIncrementalStates.onStorageHealthStatusChanged( - IStorageHealthListener.HEALTH_STATUS_BLOCKED); - // Test that package is still startable - assertFalse(mUnstartableCalled.block(WAIT_TIMEOUT_MILLIS)); - assertTrue(mIncrementalStates.isStartable()); - } - - /** - * Test that the package is still startable when Data Loader has unknown transportation issues. - */ - @Test - public void testStartableTransition_DataLoaderTransportError() { - mIncrementalStates.onStreamStatusChanged( - IDataLoaderStatusListener.STREAM_TRANSPORT_ERROR); - // Test that package is still startable - assertFalse(mUnstartableCalled.block(WAIT_TIMEOUT_MILLIS)); - assertTrue(mIncrementalStates.isStartable()); - } - - /** - * Test that the package becomes unstartable when Data Loader has data integrity issues. - */ - @Test - public void testStartableTransition_DataLoaderIntegrityError() { - mIncrementalStates.onStreamStatusChanged( - IDataLoaderStatusListener.STREAM_INTEGRITY_ERROR); - // Test that package is now unstartable - assertTrue(mUnstartableCalled.block(WAIT_TIMEOUT_MILLIS)); - assertFalse(mIncrementalStates.isStartable()); - assertEquals(PackageManager.UNSTARTABLE_REASON_CONNECTION_ERROR, - mUnstartableReason.get()); - } - - /** - * Test that the package becomes unstartable when Data Loader has data source issues. - */ - @Test - public void testStartableTransition_DataLoaderSourceError() { - mIncrementalStates.onStreamStatusChanged( - IDataLoaderStatusListener.STREAM_SOURCE_ERROR); - // Test that package is now unstartable - assertTrue(mUnstartableCalled.block(WAIT_TIMEOUT_MILLIS)); - assertFalse(mIncrementalStates.isStartable()); - assertEquals(PackageManager.UNSTARTABLE_REASON_CONNECTION_ERROR, - mUnstartableReason.get()); - } - - /** - * Test that the package becomes unstartable when Data Loader hits limited storage while - * Incremental storage has a pending reads. - */ - @Test - public void testStartableTransition_DataLoaderStorageErrorWhenIncrementalStoragePending() - throws InterruptedException { - mIncrementalStates.onStreamStatusChanged( - IDataLoaderStatusListener.STREAM_STORAGE_ERROR); - // Test that package is still startable - assertFalse(mUnstartableCalled.block(WAIT_TIMEOUT_MILLIS)); - assertTrue(mIncrementalStates.isStartable()); - mIncrementalStates.onStorageHealthStatusChanged( - IStorageHealthListener.HEALTH_STATUS_READS_PENDING); + IStorageHealthListener.HEALTH_STATUS_UNHEALTHY_STORAGE); // Test that package is now unstartable assertTrue(mUnstartableCalled.block(WAIT_TIMEOUT_MILLIS)); assertFalse(mIncrementalStates.isStartable()); @@ -186,23 +126,16 @@ public class IncrementalStatesTest { } /** - * Test that the package becomes unstartable when Data Loader hits limited storage while - * Incremental storage is at blocked status. + * Test that the package becomes unstartable when health status indicates transport issues. */ @Test - public void testStartableTransition_DataLoaderStorageErrorWhenIncrementalStorageBlocked() - throws InterruptedException { - mIncrementalStates.onStreamStatusChanged( - IDataLoaderStatusListener.STREAM_STORAGE_ERROR); - // Test that package is still startable - assertFalse(mUnstartableCalled.block(WAIT_TIMEOUT_MILLIS)); - assertTrue(mIncrementalStates.isStartable()); + public void testStartableTransition_DataLoaderIntegrityError() { mIncrementalStates.onStorageHealthStatusChanged( - IStorageHealthListener.HEALTH_STATUS_BLOCKED); + IStorageHealthListener.HEALTH_STATUS_UNHEALTHY_TRANSPORT); // Test that package is now unstartable assertTrue(mUnstartableCalled.block(WAIT_TIMEOUT_MILLIS)); assertFalse(mIncrementalStates.isStartable()); - assertEquals(PackageManager.UNSTARTABLE_REASON_INSUFFICIENT_STORAGE, + assertEquals(PackageManager.UNSTARTABLE_REASON_CONNECTION_ERROR, mUnstartableReason.get()); } @@ -227,42 +160,18 @@ public class IncrementalStatesTest { } /** - * Test that the package becomes unstartable when Data Loader has data integrity issue, and it - * becomes startable again when Data Loader is healthy again. + * Test that the package becomes unstartable when health status indicates transportation issue, + * and it becomes startable again when health status is ok again. */ @Test public void testStartableTransition_DataLoaderUnhealthyBackToHealthy() throws InterruptedException { - mIncrementalStates.onStreamStatusChanged(IDataLoaderStatusListener.STREAM_INTEGRITY_ERROR); - // Test that package is unstartable - assertTrue(mUnstartableCalled.block(WAIT_TIMEOUT_MILLIS)); - assertFalse(mIncrementalStates.isStartable()); - - mIncrementalStates.onStreamStatusChanged(IDataLoaderStatusListener.STREAM_HEALTHY); - // Test that package is now startable - assertTrue(mStartableCalled.block(WAIT_TIMEOUT_MILLIS)); - assertTrue(mIncrementalStates.isStartable()); - } - - /** - * Test that the package becomes unstartable when both Incremental Storage and Data Loader - * are unhealthy, and it becomes startable again when both Incremental Storage and Data Loader - * are healthy again. - */ - @Test - public void testStartableTransition_DataLoaderAndIncrementalStorageUnhealthyBackToHealthy() - throws InterruptedException { mIncrementalStates.onStorageHealthStatusChanged( - IStorageHealthListener.HEALTH_STATUS_UNHEALTHY); - mIncrementalStates.onStreamStatusChanged(IDataLoaderStatusListener.STREAM_INTEGRITY_ERROR); + IStorageHealthListener.HEALTH_STATUS_UNHEALTHY_TRANSPORT); // Test that package is unstartable assertTrue(mUnstartableCalled.block(WAIT_TIMEOUT_MILLIS)); assertFalse(mIncrementalStates.isStartable()); - mIncrementalStates.onStreamStatusChanged(IDataLoaderStatusListener.STREAM_HEALTHY); - // Test that package is still unstartable - assertFalse(mStartableCalled.block(WAIT_TIMEOUT_MILLIS)); - assertFalse(mIncrementalStates.isStartable()); mIncrementalStates.onStorageHealthStatusChanged(IStorageHealthListener.HEALTH_STATUS_OK); // Test that package is now startable assertTrue(mStartableCalled.block(WAIT_TIMEOUT_MILLIS)); diff --git a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java index 75799562abfa..b190339b129b 100644 --- a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java @@ -220,7 +220,7 @@ public final class UserManagerTest { asHandle(currentUser)); try { assertThat(mUserManager.removeUserOrSetEphemeral(user1.id)).isEqualTo( - UserManagerService.REMOVE_RESULT_ERROR); + UserManager.REMOVE_RESULT_ERROR); } finally { mUserManager.setUserRestriction(UserManager.DISALLOW_REMOVE_USER, /* value= */ false, asHandle(currentUser)); @@ -234,7 +234,7 @@ public final class UserManagerTest { @Test public void testRemoveUserOrSetEphemeral_systemUserReturnsError() throws Exception { assertThat(mUserManager.removeUserOrSetEphemeral(UserHandle.USER_SYSTEM)).isEqualTo( - UserManagerService.REMOVE_RESULT_ERROR); + UserManager.REMOVE_RESULT_ERROR); assertThat(hasUser(UserHandle.USER_SYSTEM)).isTrue(); } @@ -244,7 +244,7 @@ public final class UserManagerTest { public void testRemoveUserOrSetEphemeral_invalidUserReturnsError() throws Exception { assertThat(hasUser(Integer.MAX_VALUE)).isFalse(); assertThat(mUserManager.removeUserOrSetEphemeral(Integer.MAX_VALUE)).isEqualTo( - UserManagerService.REMOVE_RESULT_ERROR); + UserManager.REMOVE_RESULT_ERROR); } @MediumTest @@ -256,7 +256,7 @@ public final class UserManagerTest { switchUser(user1.id, null, /* ignoreHandle= */ true); assertThat(mUserManager.removeUserOrSetEphemeral(user1.id)).isEqualTo( - UserManagerService.REMOVE_RESULT_SET_EPHEMERAL); + UserManager.REMOVE_RESULT_SET_EPHEMERAL); assertThat(hasUser(user1.id)).isTrue(); assertThat(getUser(user1.id).isEphemeral()).isTrue(); @@ -277,7 +277,7 @@ public final class UserManagerTest { final UserInfo user1 = createUser("User 1", /* flags= */ 0); synchronized (mUserRemoveLock) { assertThat(mUserManager.removeUserOrSetEphemeral(user1.id)).isEqualTo( - UserManagerService.REMOVE_RESULT_REMOVED); + UserManager.REMOVE_RESULT_REMOVED); waitForUserRemovalLocked(user1.id); } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java index caf8a720e26c..3dc258c51954 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java @@ -70,6 +70,8 @@ import android.content.pm.ActivityInfo; import android.os.Binder; import android.os.UserHandle; import android.platform.test.annotations.Presubmit; +import android.view.SurfaceControl; +import android.window.ITaskOrganizer; import androidx.test.filters.SmallTest; @@ -240,6 +242,24 @@ public class ActivityStackTests extends WindowTestsBase { @Test public void testRemoveOrganizedTask_UpdateStackReference() { + ITaskOrganizer listener = new ITaskOrganizer.Stub() { + @Override + public void onTaskAppeared( + ActivityManager.RunningTaskInfo taskInfo, SurfaceControl leash) { } + + @Override + public void onTaskVanished(ActivityManager.RunningTaskInfo container) { } + + @Override + public void onTaskInfoChanged(ActivityManager.RunningTaskInfo info) { + } + + @Override + public void onBackPressedOnTaskRoot(ActivityManager.RunningTaskInfo taskInfo) { + } + }; + mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(listener); + final Task rootHomeTask = mDefaultTaskDisplayArea.getRootHomeTask(); final ActivityRecord homeActivity = new ActivityBuilder(mAtm) .setStack(rootHomeTask) @@ -247,7 +267,7 @@ public class ActivityStackTests extends WindowTestsBase { .build(); final Task secondaryStack = (Task) WindowContainer.fromBinder( mAtm.mTaskOrganizerController.createRootTask(rootHomeTask.getDisplayId(), - WINDOWING_MODE_SPLIT_SCREEN_SECONDARY).token.asBinder()); + WINDOWING_MODE_SPLIT_SCREEN_SECONDARY).getTaskInfo().token.asBinder()); rootHomeTask.reparent(secondaryStack, POSITION_TOP); assertEquals(secondaryStack, rootHomeTask.getParent()); diff --git a/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java b/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java index ea1223312cb2..db1c12f525f3 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java +++ b/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java @@ -22,7 +22,7 @@ import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.util.MergedConfiguration; import android.view.DragEvent; -import android.view.IScrollCaptureController; +import android.view.IScrollCaptureCallbacks; import android.view.IWindow; import android.view.InsetsSourceControl; import android.view.InsetsState; @@ -107,7 +107,7 @@ public class TestIWindow extends IWindow.Stub { } @Override - public void requestScrollCapture(IScrollCaptureController controller) throws RemoteException { + public void requestScrollCapture(IScrollCaptureCallbacks callbacks) throws RemoteException { } @Override diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java index aac83974eb51..bd586a5f6c76 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java @@ -479,16 +479,33 @@ public class WindowOrganizerTests extends WindowTestsBase { @Test public void testCreateDeleteRootTasks() { + ITaskOrganizer listener = new ITaskOrganizer.Stub() { + @Override + public void onTaskAppeared(RunningTaskInfo taskInfo, SurfaceControl leash) { } + + @Override + public void onTaskVanished(RunningTaskInfo container) { } + + @Override + public void onTaskInfoChanged(RunningTaskInfo info) { + } + + @Override + public void onBackPressedOnTaskRoot(RunningTaskInfo taskInfo) { + } + }; + mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(listener); + RunningTaskInfo info1 = mWm.mAtmService.mTaskOrganizerController.createRootTask( Display.DEFAULT_DISPLAY, - WINDOWING_MODE_SPLIT_SCREEN_PRIMARY); + WINDOWING_MODE_SPLIT_SCREEN_PRIMARY).getTaskInfo(); assertEquals(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, info1.configuration.windowConfiguration.getWindowingMode()); assertEquals(ACTIVITY_TYPE_UNDEFINED, info1.topActivityType); RunningTaskInfo info2 = mWm.mAtmService.mTaskOrganizerController.createRootTask( Display.DEFAULT_DISPLAY, - WINDOWING_MODE_SPLIT_SCREEN_SECONDARY); + WINDOWING_MODE_SPLIT_SCREEN_SECONDARY).getTaskInfo(); assertEquals(WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, info2.configuration.windowConfiguration.getWindowingMode()); assertEquals(ACTIVITY_TYPE_UNDEFINED, info2.topActivityType); @@ -522,7 +539,7 @@ public class WindowOrganizerTests extends WindowTestsBase { }; mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(listener); RunningTaskInfo info1 = mWm.mAtmService.mTaskOrganizerController.createRootTask( - mDisplayContent.mDisplayId, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY); + mDisplayContent.mDisplayId, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY).getTaskInfo(); final Task stack = createTaskStackOnDisplay( WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, mDisplayContent); @@ -580,7 +597,7 @@ public class WindowOrganizerTests extends WindowTestsBase { }; mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(listener); RunningTaskInfo info1 = mWm.mAtmService.mTaskOrganizerController.createRootTask( - mDisplayContent.mDisplayId, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY); + mDisplayContent.mDisplayId, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY).getTaskInfo(); lastReportedTiles.clear(); called[0] = false; @@ -641,9 +658,9 @@ public class WindowOrganizerTests extends WindowTestsBase { }; mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(listener); RunningTaskInfo info1 = mWm.mAtmService.mTaskOrganizerController.createRootTask( - mDisplayContent.mDisplayId, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY); + mDisplayContent.mDisplayId, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY).getTaskInfo(); RunningTaskInfo info2 = mWm.mAtmService.mTaskOrganizerController.createRootTask( - mDisplayContent.mDisplayId, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY); + mDisplayContent.mDisplayId, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY).getTaskInfo(); final int initialRootTaskCount = mWm.mAtmService.mTaskOrganizerController.getRootTasks( mDisplayContent.mDisplayId, null /* activityTypes */).size(); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java index 6237be0f4b26..924b286a4f8e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java @@ -1006,10 +1006,10 @@ class WindowTestsBase extends SystemServiceTestsBase { mDisplayId = displayId; mService.mTaskOrganizerController.registerTaskOrganizer(this); WindowContainerToken primary = mService.mTaskOrganizerController.createRootTask( - displayId, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY).token; + displayId, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY).getTaskInfo().token; mPrimary = WindowContainer.fromBinder(primary.asBinder()).asTask(); WindowContainerToken secondary = mService.mTaskOrganizerController.createRootTask( - displayId, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY).token; + displayId, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY).getTaskInfo().token; mSecondary = WindowContainer.fromBinder(secondary.asBinder()).asTask(); } TestSplitOrganizer(ActivityTaskManagerService service) { diff --git a/services/usb/java/com/android/server/usb/MtpNotificationManager.java b/services/usb/java/com/android/server/usb/MtpNotificationManager.java index 39f2f296a305..8845f118f3a8 100644 --- a/services/usb/java/com/android/server/usb/MtpNotificationManager.java +++ b/services/usb/java/com/android/server/usb/MtpNotificationManager.java @@ -91,11 +91,12 @@ class MtpNotificationManager { intent.putExtra(UsbManager.EXTRA_DEVICE, device); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND); + // Simple notification clicks are immutable final PendingIntent openIntent = PendingIntent.getBroadcastAsUser( mContext, device.getDeviceId(), intent, - PendingIntent.FLAG_UPDATE_CURRENT, + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE, UserHandle.SYSTEM); builder.setContentIntent(openIntent); diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java index 2269e1d070b1..58859e095554 100644 --- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java @@ -1206,8 +1206,9 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser Intent intent = Intent.makeRestartActivityTask( new ComponentName("com.android.settings", "com.android.settings.Settings$UsbDetailsActivity")); + // Simple notification clicks are immutable pi = PendingIntent.getActivityAsUser(mContext, 0, - intent, 0, null, UserHandle.CURRENT); + intent, PendingIntent.FLAG_IMMUTABLE, null, UserHandle.CURRENT); channel = SystemNotificationChannels.USB; } else { final Intent intent = new Intent(); @@ -1217,7 +1218,9 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser "help_url_audio_accessory_not_supported"); if (mContext.getPackageManager().resolveActivity(intent, 0) != null) { - pi = PendingIntent.getActivity(mContext, 0, intent, 0); + // Simple notification clicks are immutable + pi = PendingIntent.getActivity(mContext, 0, intent, + PendingIntent.FLAG_IMMUTABLE); } else { pi = null; } diff --git a/services/usb/java/com/android/server/usb/UsbPortManager.java b/services/usb/java/com/android/server/usb/UsbPortManager.java index ec7d4bd0d8c0..ca18c57d6f4b 100644 --- a/services/usb/java/com/android/server/usb/UsbPortManager.java +++ b/services/usb/java/com/android/server/usb/UsbPortManager.java @@ -230,8 +230,9 @@ public class UsbPortManager { com.android.internal.R.string.config_usbContaminantActivity))); intent.putExtra(UsbManager.EXTRA_PORT, ParcelableUsbPort.of(currentPortInfo.mUsbPort)); + // Simple notification clicks are immutable PendingIntent pi = PendingIntent.getActivityAsUser(mContext, 0, - intent, 0, null, UserHandle.CURRENT); + intent, PendingIntent.FLAG_IMMUTABLE, null, UserHandle.CURRENT); Notification.Builder builder = new Notification.Builder(mContext, channel) .setOngoing(true) diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java index 9f16543c410e..a85eb53605d6 100755 --- a/telecomm/java/android/telecom/Call.java +++ b/telecomm/java/android/telecom/Call.java @@ -1683,7 +1683,6 @@ public final class Call { * @hide */ @SystemApi - @TestApi public void enterBackgroundAudioProcessing() { if (mState != STATE_ACTIVE && mState != STATE_RINGING) { throw new IllegalStateException("Call must be active or ringing"); @@ -1704,7 +1703,6 @@ public final class Call { * @hide */ @SystemApi - @TestApi public void exitBackgroundAudioProcessing(boolean shouldRing) { if (mState != STATE_AUDIO_PROCESSING) { throw new IllegalStateException("Call must in the audio processing state"); diff --git a/telecomm/java/android/telecom/CallScreeningService.java b/telecomm/java/android/telecom/CallScreeningService.java index 49f183151e27..7988b036ccd3 100644 --- a/telecomm/java/android/telecom/CallScreeningService.java +++ b/telecomm/java/android/telecom/CallScreeningService.java @@ -21,7 +21,6 @@ import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SdkConstant; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Service; import android.content.ComponentName; import android.content.Intent; @@ -323,7 +322,6 @@ public abstract class CallScreeningService extends Service { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.CAPTURE_AUDIO_OUTPUT) public @NonNull Builder setShouldScreenCallViaAudioProcessing( boolean shouldScreenCallViaAudioProcessing) { diff --git a/telecomm/java/android/telecom/Conference.java b/telecomm/java/android/telecom/Conference.java index 39c3ff9e8839..dc2fb948fdbe 100644 --- a/telecomm/java/android/telecom/Conference.java +++ b/telecomm/java/android/telecom/Conference.java @@ -24,7 +24,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.net.Uri; import android.os.Bundle; import android.os.SystemClock; @@ -137,7 +136,6 @@ public abstract class Conference extends Conferenceable { * @hide */ @SystemApi - @TestApi public final @NonNull String getTelecomCallId() { return mTelecomCallId; } @@ -609,7 +607,6 @@ public abstract class Conference extends Conferenceable { * @return The primary connection. * @hide */ - @TestApi @SystemApi public Connection getPrimaryConnection() { if (mUnmodifiableChildConnections == null || mUnmodifiableChildConnections.isEmpty()) { @@ -1012,7 +1009,6 @@ public abstract class Conference extends Conferenceable { * @hide */ @SystemApi - @TestApi @RequiresPermission(MODIFY_PHONE_STATE) public void setConferenceState(boolean isConference) { mIsMultiparty = isConference; @@ -1067,7 +1063,6 @@ public abstract class Conference extends Conferenceable { * @hide */ @SystemApi - @TestApi @RequiresPermission(MODIFY_PHONE_STATE) public final void setAddress(@NonNull Uri address, @TelecomManager.Presentation int presentation) { @@ -1155,7 +1150,6 @@ public abstract class Conference extends Conferenceable { * @hide */ @SystemApi - @TestApi public final void setCallerDisplayName(@NonNull String callerDisplayName, @TelecomManager.Presentation int presentation) { Log.d(this, "setCallerDisplayName %s", callerDisplayName); diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java index 00b711643fe6..bbf34df8fe84 100755..100644 --- a/telecomm/java/android/telecom/Connection.java +++ b/telecomm/java/android/telecom/Connection.java @@ -25,7 +25,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Notification; import android.bluetooth.BluetoothDevice; import android.compat.annotation.UnsupportedAppUsage; @@ -307,7 +306,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public static final int CAPABILITY_SPEED_UP_MT_AUDIO = 0x00040000; /** @@ -345,7 +343,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public static final int CAPABILITY_CONFERENCE_HAS_NO_CHILDREN = 0x00200000; /** @@ -417,7 +414,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public static final int PROPERTY_EMERGENCY_CALLBACK_MODE = 1<<0; /** @@ -428,7 +424,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public static final int PROPERTY_GENERIC_CONFERENCE = 1<<1; /** @@ -480,7 +475,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public static final int PROPERTY_IS_DOWNGRADED_CONFERENCE = 1<<6; /** @@ -524,7 +518,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public static final int PROPERTY_REMOTELY_HOSTED = 1 << 11; /** @@ -702,7 +695,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public static final String EXTRA_DISABLE_ADD_CALL = "android.telecom.extra.DISABLE_ADD_CALL"; @@ -2054,7 +2046,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public final @Nullable String getTelecomCallId() { return mTelecomCallId; } @@ -2171,7 +2162,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public final @IntRange(from = 0) long getConnectTimeMillis() { return mConnectTimeMillis; } @@ -2196,7 +2186,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public final @ElapsedRealtimeLong long getConnectionStartElapsedRealtimeMillis() { return mConnectElapsedTimeMillis; } @@ -2279,7 +2268,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public void setTelecomCallId(@NonNull String callId) { mTelecomCallId = callId; } @@ -2628,7 +2616,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi @RequiresPermission(MODIFY_PHONE_STATE) public final void setConnectTimeMillis(@IntRange(from = 0) long connectTimeMillis) { mConnectTimeMillis = connectTimeMillis; @@ -2651,7 +2638,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi @RequiresPermission(MODIFY_PHONE_STATE) public final void setConnectionStartElapsedRealtimeMillis( @ElapsedRealtimeLong long connectElapsedTimeMillis) { @@ -2722,7 +2708,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public final void resetConnectionTime() { for (Listener l : mListeners) { l.onConnectionTimeReset(this); @@ -3505,7 +3490,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public void setPhoneAccountHandle(@NonNull PhoneAccountHandle phoneAccountHandle) { if (mPhoneAccountHandle != phoneAccountHandle) { mPhoneAccountHandle = phoneAccountHandle; @@ -3524,7 +3508,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public @Nullable PhoneAccountHandle getPhoneAccountHandle() { return mPhoneAccountHandle; } @@ -3590,7 +3573,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public void setCallDirection(@Call.Details.CallDirection int callDirection) { mCallDirection = callDirection; } diff --git a/telecomm/java/android/telecom/ConnectionRequest.java b/telecomm/java/android/telecom/ConnectionRequest.java index 6d7ceca0a2cd..b73ef9b794e4 100644 --- a/telecomm/java/android/telecom/ConnectionRequest.java +++ b/telecomm/java/android/telecom/ConnectionRequest.java @@ -327,7 +327,6 @@ public final class ConnectionRequest implements Parcelable { * @hide */ @SystemApi - @TestApi public @Nullable String getTelecomCallId() { return mTelecomCallId; } diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java index 866e17148a1a..5024ae27ee49 100644 --- a/telecomm/java/android/telecom/PhoneAccount.java +++ b/telecomm/java/android/telecom/PhoneAccount.java @@ -21,7 +21,6 @@ import static android.Manifest.permission.MODIFY_PHONE_STATE; import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.Intent; import android.graphics.drawable.Icon; import android.net.Uri; @@ -635,7 +634,6 @@ public final class PhoneAccount implements Parcelable { * @hide */ @SystemApi - @TestApi @RequiresPermission(MODIFY_PHONE_STATE) public @NonNull Builder setGroupId(@NonNull String groupId) { if (groupId != null) { diff --git a/telecomm/java/android/telecom/PhoneAccountSuggestionService.java b/telecomm/java/android/telecom/PhoneAccountSuggestionService.java index ba3822cb9951..8a91b9e9ee81 100644 --- a/telecomm/java/android/telecom/PhoneAccountSuggestionService.java +++ b/telecomm/java/android/telecom/PhoneAccountSuggestionService.java @@ -19,7 +19,6 @@ package android.telecom; import android.annotation.NonNull; import android.annotation.SdkConstant; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Service; import android.content.Intent; import android.os.IBinder; @@ -57,7 +56,6 @@ import java.util.Map; * @hide */ @SystemApi -@TestApi public class PhoneAccountSuggestionService extends Service { /** * The {@link Intent} that must be declared in the {@code intent-filter} element of the diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index f1deec60aca7..82da4475c1b9 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -25,7 +25,6 @@ import android.annotation.SuppressAutoDoc; import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.content.ComponentName; import android.content.Context; @@ -693,7 +692,6 @@ public class TelecomManager { * * @hide */ - @TestApi @SystemApi public static final int TTY_MODE_OFF = 0; @@ -703,7 +701,6 @@ public class TelecomManager { * * @hide */ - @TestApi @SystemApi public static final int TTY_MODE_FULL = 1; @@ -714,7 +711,6 @@ public class TelecomManager { * * @hide */ - @TestApi @SystemApi public static final int TTY_MODE_HCO = 2; @@ -725,7 +721,6 @@ public class TelecomManager { * * @hide */ - @TestApi @SystemApi public static final int TTY_MODE_VCO = 3; @@ -736,7 +731,6 @@ public class TelecomManager { * TTY mode. * @hide */ - @TestApi @SystemApi public static final String ACTION_CURRENT_TTY_MODE_CHANGED = "android.telecom.action.CURRENT_TTY_MODE_CHANGED"; @@ -759,7 +753,6 @@ public class TelecomManager { * plugged into the device. * @hide */ - @TestApi @SystemApi public static final String EXTRA_CURRENT_TTY_MODE = "android.telecom.extra.CURRENT_TTY_MODE"; @@ -771,7 +764,6 @@ public class TelecomManager { * preferred TTY mode. * @hide */ - @TestApi @SystemApi public static final String ACTION_TTY_PREFERRED_MODE_CHANGED = "android.telecom.action.TTY_PREFERRED_MODE_CHANGED"; @@ -790,7 +782,6 @@ public class TelecomManager { * </ul> * @hide */ - @TestApi @SystemApi public static final String EXTRA_TTY_PREFERRED_MODE = "android.telecom.extra.TTY_PREFERRED_MODE"; @@ -1045,7 +1036,6 @@ public class TelecomManager { * @hide */ @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) - @TestApi @SystemApi public void setUserSelectedOutgoingPhoneAccount(@Nullable PhoneAccountHandle accountHandle) { try { @@ -1219,7 +1209,6 @@ public class TelecomManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(READ_PRIVILEGED_PHONE_STATE) public @NonNull List<PhoneAccountHandle> getCallCapablePhoneAccounts( boolean includeDisabledAccounts) { @@ -1453,7 +1442,6 @@ public class TelecomManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(READ_PRIVILEGED_PHONE_STATE) public @Nullable String getDefaultDialerPackage(@NonNull UserHandle userHandle) { try { @@ -1677,7 +1665,6 @@ public class TelecomManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(anyOf = { READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE @@ -1835,7 +1822,6 @@ public class TelecomManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(READ_PRIVILEGED_PHONE_STATE) public @TtyMode int getCurrentTtyMode() { try { @@ -2249,7 +2235,6 @@ public class TelecomManager { * @hide */ @SystemApi - @TestApi @NonNull public Intent createLaunchEmergencyDialerIntent(@Nullable String number) { ITelecomService service = getTelecomService(); @@ -2402,7 +2387,6 @@ public class TelecomManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean isInEmergencyCall() { try { diff --git a/telephony/java/android/telephony/AccessNetworkConstants.java b/telephony/java/android/telephony/AccessNetworkConstants.java index 39a754389254..d01297147fdb 100644 --- a/telephony/java/android/telephony/AccessNetworkConstants.java +++ b/telephony/java/android/telephony/AccessNetworkConstants.java @@ -18,7 +18,6 @@ package android.telephony; import android.annotation.IntDef; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.hardware.radio.V1_1.GeranBands; import android.hardware.radio.V1_5.AccessNetwork; import android.hardware.radio.V1_5.EutranBands; @@ -49,7 +48,6 @@ public final class AccessNetworkConstants { * @hide */ @SystemApi - @TestApi public static final int TRANSPORT_TYPE_INVALID = -1; /** @@ -438,7 +436,6 @@ public final class AccessNetworkConstants { * @hide */ @SystemApi - @TestApi public static final int FREQUENCY_RANGE_GROUP_UNKNOWN = 0; /** @@ -447,7 +444,6 @@ public final class AccessNetworkConstants { * @hide */ @SystemApi - @TestApi public static final int FREQUENCY_RANGE_GROUP_1 = 1; /** @@ -456,7 +452,6 @@ public final class AccessNetworkConstants { * @hide */ @SystemApi - @TestApi public static final int FREQUENCY_RANGE_GROUP_2 = 2; /** @@ -481,7 +476,6 @@ public final class AccessNetworkConstants { * @hide */ @SystemApi - @TestApi public static @FrequencyRangeGroup int getFrequencyRangeGroup(@NgranBand int band) { switch (band) { case BAND_1: diff --git a/telephony/java/android/telephony/BarringInfo.java b/telephony/java/android/telephony/BarringInfo.java index 92423a2f2218..e9698adc0356 100644 --- a/telephony/java/android/telephony/BarringInfo.java +++ b/telephony/java/android/telephony/BarringInfo.java @@ -252,7 +252,6 @@ public final class BarringInfo implements Parcelable { private SparseArray<BarringServiceInfo> mBarringServiceInfos; /** @hide */ - @TestApi @SystemApi public BarringInfo() { mBarringServiceInfos = new SparseArray<>(); diff --git a/telephony/java/android/telephony/CallQuality.java b/telephony/java/android/telephony/CallQuality.java index 1effeb774484..fa70c33965ed 100644 --- a/telephony/java/android/telephony/CallQuality.java +++ b/telephony/java/android/telephony/CallQuality.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -41,7 +40,6 @@ import java.util.Objects; * @hide */ @SystemApi -@TestApi public final class CallQuality implements Parcelable { // Constants representing the call quality level (see #CallQuality); diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 8261b53a2c9f..3d33b95d34d2 100755..100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -23,7 +23,6 @@ import android.annotation.RequiresPermission; import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.content.ComponentName; import android.content.Context; @@ -4603,7 +4602,6 @@ public class CarrierConfigManager { */ @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) @SystemApi - @TestApi public void overrideConfig(int subscriptionId, @Nullable PersistableBundle overrideValues) { overrideConfig(subscriptionId, overrideValues, false); } diff --git a/telephony/java/android/telephony/DataSpecificRegistrationInfo.java b/telephony/java/android/telephony/DataSpecificRegistrationInfo.java index e91d6fc9d801..597fe8f85cfa 100644 --- a/telephony/java/android/telephony/DataSpecificRegistrationInfo.java +++ b/telephony/java/android/telephony/DataSpecificRegistrationInfo.java @@ -19,7 +19,6 @@ package android.telephony; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -31,7 +30,6 @@ import java.util.Objects; * @hide */ @SystemApi -@TestApi public final class DataSpecificRegistrationInfo implements Parcelable { /** * @hide diff --git a/telephony/java/android/telephony/LteVopsSupportInfo.java b/telephony/java/android/telephony/LteVopsSupportInfo.java index 7994c1b05977..83e41bf3df3b 100644 --- a/telephony/java/android/telephony/LteVopsSupportInfo.java +++ b/telephony/java/android/telephony/LteVopsSupportInfo.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -33,7 +32,6 @@ import java.util.Objects; * @hide */ @SystemApi -@TestApi public final class LteVopsSupportInfo implements Parcelable { /**@hide*/ diff --git a/telephony/java/android/telephony/ModemActivityInfo.java b/telephony/java/android/telephony/ModemActivityInfo.java index 881d85c73b5d..e164c4bc2491 100644 --- a/telephony/java/android/telephony/ModemActivityInfo.java +++ b/telephony/java/android/telephony/ModemActivityInfo.java @@ -37,7 +37,6 @@ import java.util.Objects; * @hide */ @SystemApi -@TestApi public final class ModemActivityInfo implements Parcelable { private static final int TX_POWER_LEVELS = 5; diff --git a/telephony/java/android/telephony/NetworkRegistrationInfo.java b/telephony/java/android/telephony/NetworkRegistrationInfo.java index aee1e84ca356..92238420fd32 100644 --- a/telephony/java/android/telephony/NetworkRegistrationInfo.java +++ b/telephony/java/android/telephony/NetworkRegistrationInfo.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; import android.telephony.AccessNetworkConstants.TransportType; @@ -71,37 +70,37 @@ public final class NetworkRegistrationInfo implements Parcelable { * Not registered. The device is not currently searching a new operator to register. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING = 0; /** * Registered on home network. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int REGISTRATION_STATE_HOME = 1; /** * Not registered. The device is currently searching a new operator to register. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int REGISTRATION_STATE_NOT_REGISTERED_SEARCHING = 2; /** * Registration denied. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int REGISTRATION_STATE_DENIED = 3; /** * Registration state is unknown. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int REGISTRATION_STATE_UNKNOWN = 4; /** * Registered on roaming network. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int REGISTRATION_STATE_ROAMING = 5; /** @hide */ @@ -386,7 +385,7 @@ public final class NetworkRegistrationInfo implements Parcelable { * * @hide */ - @SystemApi @TestApi + @SystemApi public @RegistrationState int getRegistrationState() { return mRegistrationState; } @@ -451,7 +450,7 @@ public final class NetworkRegistrationInfo implements Parcelable { * @return the current network roaming type. * @hide */ - @SystemApi @TestApi + @SystemApi public @ServiceState.RoamingType int getRoamingType() { return mRoamingType; } @@ -460,7 +459,7 @@ public final class NetworkRegistrationInfo implements Parcelable { * @return Whether emergency is enabled. * @hide */ - @SystemApi @TestApi + @SystemApi public boolean isEmergencyEnabled() { return mEmergencyOnly; } /** @@ -498,7 +497,7 @@ public final class NetworkRegistrationInfo implements Parcelable { * 10.5.3.6 for UMTS, 3GPP TS 24.301 9.9.3.9 for LTE, and 3GPP2 A.S0001 6.2.2.44 for CDMA * @hide */ - @SystemApi @TestApi + @SystemApi public int getRejectCause() { return mRejectCause; } @@ -545,7 +544,7 @@ public final class NetworkRegistrationInfo implements Parcelable { * @hide */ @Nullable - @SystemApi @TestApi + @SystemApi public DataSpecificRegistrationInfo getDataSpecificInfo() { return mDataSpecificInfo; } @@ -680,7 +679,7 @@ public final class NetworkRegistrationInfo implements Parcelable { * @hide */ @Override - @SystemApi @TestApi + @SystemApi public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mDomain); dest.writeInt(mTransportType); @@ -772,7 +771,7 @@ public final class NetworkRegistrationInfo implements Parcelable { * </code></pre> * @hide */ - @SystemApi @TestApi + @SystemApi public static final class Builder { @Domain private int mDomain; @@ -877,7 +876,7 @@ public final class NetworkRegistrationInfo implements Parcelable { * @return The same instance of the builder. * @hide */ - @SystemApi @TestApi + @SystemApi public @NonNull Builder setEmergencyOnly(boolean emergencyOnly) { mEmergencyOnly = emergencyOnly; return this; @@ -891,7 +890,7 @@ public final class NetworkRegistrationInfo implements Parcelable { * @return The same instance of the builder. * @hide */ - @SystemApi @TestApi + @SystemApi public @NonNull Builder setAvailableServices( @NonNull @ServiceType List<Integer> availableServices) { mAvailableServices = availableServices; @@ -906,7 +905,7 @@ public final class NetworkRegistrationInfo implements Parcelable { * @return The same instance of the builder. * @hide */ - @SystemApi @TestApi + @SystemApi public @NonNull Builder setCellIdentity(@Nullable CellIdentity cellIdentity) { mCellIdentity = cellIdentity; return this; @@ -929,7 +928,7 @@ public final class NetworkRegistrationInfo implements Parcelable { * @return the NetworkRegistrationInfo object. * @hide */ - @SystemApi @TestApi + @SystemApi public @NonNull NetworkRegistrationInfo build() { return new NetworkRegistrationInfo(mDomain, mTransportType, mRegistrationState, mAccessNetworkTechnology, mRejectCause, mEmergencyOnly, mAvailableServices, diff --git a/telephony/java/android/telephony/PhoneNumberUtils.java b/telephony/java/android/telephony/PhoneNumberUtils.java index ec9940836afe..58e368bcc444 100644 --- a/telephony/java/android/telephony/PhoneNumberUtils.java +++ b/telephony/java/android/telephony/PhoneNumberUtils.java @@ -2239,7 +2239,6 @@ public class PhoneNumberUtils { * @hide */ @SystemApi - @TestApi public static boolean isVoiceMailNumber(@NonNull Context context, int subId, @Nullable String number) { String vmNumber, mdn; @@ -2728,7 +2727,6 @@ public class PhoneNumberUtils { * @return true if number contains @ */ @SystemApi - @TestApi public static boolean isUriNumber(@Nullable String number) { // Note we allow either "@" or "%40" to indicate a URI, in case // the passed-in string is URI-escaped. (Neither "@" nor "%40" @@ -2747,7 +2745,6 @@ public class PhoneNumberUtils { * @hide */ @SystemApi - @TestApi public static @NonNull String getUsernameFromUriNumber(@NonNull String number) { // The delimiter between username and domain name can be // either "@" or "%40" (the URI-escaped equivalent.) diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index a71a965b1bdb..2e51ef16baf1 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -32,7 +32,6 @@ import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SuppressAutoDoc; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.app.PendingIntent; import android.app.PropertyInvalidatedCache; import android.compat.annotation.UnsupportedAppUsage; @@ -279,7 +278,6 @@ public class SubscriptionManager { */ @NonNull @SystemApi - @TestApi public static final Uri WFC_ENABLED_CONTENT_URI = Uri.withAppendedPath(CONTENT_URI, "wfc"); /** @@ -299,7 +297,6 @@ public class SubscriptionManager { */ @NonNull @SystemApi - @TestApi public static final Uri ADVANCED_CALLING_ENABLED_CONTENT_URI = Uri.withAppendedPath( CONTENT_URI, "advanced_calling"); @@ -318,7 +315,6 @@ public class SubscriptionManager { */ @NonNull @SystemApi - @TestApi public static final Uri WFC_MODE_CONTENT_URI = Uri.withAppendedPath(CONTENT_URI, "wfc_mode"); /** @@ -336,7 +332,6 @@ public class SubscriptionManager { */ @NonNull @SystemApi - @TestApi public static final Uri WFC_ROAMING_MODE_CONTENT_URI = Uri.withAppendedPath( CONTENT_URI, "wfc_roaming_mode"); @@ -356,7 +351,6 @@ public class SubscriptionManager { */ @NonNull @SystemApi - @TestApi public static final Uri VT_ENABLED_CONTENT_URI = Uri.withAppendedPath( CONTENT_URI, "vt_enabled"); @@ -375,7 +369,6 @@ public class SubscriptionManager { */ @NonNull @SystemApi - @TestApi public static final Uri WFC_ROAMING_ENABLED_CONTENT_URI = Uri.withAppendedPath( CONTENT_URI, "wfc_roaming_enabled"); @@ -1966,7 +1959,6 @@ public class SubscriptionManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultVoiceSubscriptionId(int subscriptionId) { if (VDBG) logd("setDefaultVoiceSubId sub id = " + subscriptionId); diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index a202644dfafe..9b4d31a51d53 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -8357,13 +8357,13 @@ public class TelephonyManager { /** * Values used to return status for hasCarrierPrivileges call. */ - /** @hide */ @SystemApi @TestApi + /** @hide */ @SystemApi public static final int CARRIER_PRIVILEGE_STATUS_HAS_ACCESS = 1; - /** @hide */ @SystemApi @TestApi + /** @hide */ @SystemApi public static final int CARRIER_PRIVILEGE_STATUS_NO_ACCESS = 0; - /** @hide */ @SystemApi @TestApi + /** @hide */ @SystemApi public static final int CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED = -1; - /** @hide */ @SystemApi @TestApi + /** @hide */ @SystemApi public static final int CARRIER_PRIVILEGE_STATUS_ERROR_LOADING_RULES = -2; /** @@ -8565,7 +8565,6 @@ public class TelephonyManager { /** @hide */ @SystemApi - @TestApi @SuppressLint("Doclava125") public int checkCarrierPrivilegesForPackage(String pkgName) { try { @@ -8598,7 +8597,6 @@ public class TelephonyManager { /** @hide */ @SystemApi - @TestApi public List<String> getCarrierPackageNamesForIntent(Intent intent) { return getCarrierPackageNamesForIntentAndPhone(intent, getPhoneId()); } @@ -10100,7 +10098,6 @@ public class TelephonyManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.INTERACT_ACROSS_USERS) public @Nullable ComponentName getAndUpdateDefaultRespondViaMessageApplication() { return SmsApplication.getDefaultRespondViaMessageApplication(mContext, true); @@ -10113,7 +10110,6 @@ public class TelephonyManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.INTERACT_ACROSS_USERS) public @Nullable ComponentName getDefaultRespondViaMessageApplication() { return SmsApplication.getDefaultRespondViaMessageApplication(mContext, false); @@ -11861,7 +11857,6 @@ public class TelephonyManager { * * @hide */ - @TestApi @SystemApi public static final int INVALID_EMERGENCY_NUMBER_DB_VERSION = -1; @@ -11901,7 +11896,6 @@ public class TelephonyManager { */ @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) @SystemApi - @TestApi public void updateOtaEmergencyNumberDbFilePath( @NonNull ParcelFileDescriptor otaParcelFileDescriptor) { try { @@ -11927,7 +11921,6 @@ public class TelephonyManager { */ @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) @SystemApi - @TestApi public void resetOtaEmergencyNumberDbFilePath() { try { ITelephony telephony = getITelephony(); @@ -12149,7 +12142,6 @@ public class TelephonyManager { * * @hide */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getEmergencyNumberDbVersion() { @@ -12877,7 +12869,6 @@ public class TelephonyManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSystemSelectionChannels(@NonNull List<RadioAccessSpecifier> specifiers, @NonNull @CallbackExecutor Executor executor, @@ -12895,7 +12886,6 @@ public class TelephonyManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSystemSelectionChannels(@NonNull List<RadioAccessSpecifier> specifiers) { Objects.requireNonNull(specifiers, "Specifiers must not be null."); @@ -13307,7 +13297,6 @@ public class TelephonyManager { * @hide */ @SystemApi - @TestApi public static final int MOBILE_DATA_POLICY_DATA_ON_NON_DEFAULT_DURING_VOICE_CALL = 1; /** @@ -13322,7 +13311,6 @@ public class TelephonyManager { * @hide */ @SystemApi - @TestApi public static final int MOBILE_DATA_POLICY_MMS_ALWAYS_ALLOWED = 2; /** @@ -13346,7 +13334,6 @@ public class TelephonyManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setMobileDataPolicyEnabledStatus(@MobileDataPolicy int policy, boolean enabled) { try { @@ -13370,7 +13357,6 @@ public class TelephonyManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isMobileDataPolicyEnabled(@MobileDataPolicy int policy) { try { diff --git a/telephony/java/android/telephony/ims/ImsCallForwardInfo.java b/telephony/java/android/telephony/ims/ImsCallForwardInfo.java index d53a2e6591a2..3f9c8d26ca91 100644 --- a/telephony/java/android/telephony/ims/ImsCallForwardInfo.java +++ b/telephony/java/android/telephony/ims/ImsCallForwardInfo.java @@ -19,7 +19,6 @@ package android.telephony.ims; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; @@ -33,7 +32,6 @@ import java.lang.annotation.RetentionPolicy; * @hide */ @SystemApi -@TestApi public final class ImsCallForwardInfo implements Parcelable { /** diff --git a/telephony/java/android/telephony/ims/ImsCallProfile.java b/telephony/java/android/telephony/ims/ImsCallProfile.java index f31fcf4050ea..47a0ab61f970 100644 --- a/telephony/java/android/telephony/ims/ImsCallProfile.java +++ b/telephony/java/android/telephony/ims/ImsCallProfile.java @@ -48,7 +48,6 @@ import java.util.List; * @hide */ @SystemApi -@TestApi public final class ImsCallProfile implements Parcelable { private static final String TAG = "ImsCallProfile"; diff --git a/telephony/java/android/telephony/ims/ImsCallSessionListener.java b/telephony/java/android/telephony/ims/ImsCallSessionListener.java index d21a05103241..2fdd195bbb26 100644 --- a/telephony/java/android/telephony/ims/ImsCallSessionListener.java +++ b/telephony/java/android/telephony/ims/ImsCallSessionListener.java @@ -19,7 +19,6 @@ package android.telephony.ims; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.RemoteException; import android.telephony.Annotation; import android.telephony.CallQuality; @@ -40,7 +39,6 @@ import com.android.ims.internal.IImsCallSession; // TODO: APIs in here do not conform to API guidelines yet. This can be changed if // ImsCallSessionListenerConverter is also changed. @SystemApi -@TestApi public class ImsCallSessionListener { private final IImsCallSessionListener mListener; diff --git a/telephony/java/android/telephony/ims/ImsConferenceState.java b/telephony/java/android/telephony/ims/ImsConferenceState.java index 9bf2f44395c4..1fa5f52968e5 100644 --- a/telephony/java/android/telephony/ims/ImsConferenceState.java +++ b/telephony/java/android/telephony/ims/ImsConferenceState.java @@ -18,7 +18,6 @@ package android.telephony.ims; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; @@ -38,7 +37,6 @@ import java.util.Set; * @hide */ @SystemApi -@TestApi public final class ImsConferenceState implements Parcelable { private static final String TAG = "ImsConferenceState"; /** diff --git a/telephony/java/android/telephony/ims/ImsException.java b/telephony/java/android/telephony/ims/ImsException.java index 1c3d58d98b4a..50fb828ea217 100644 --- a/telephony/java/android/telephony/ims/ImsException.java +++ b/telephony/java/android/telephony/ims/ImsException.java @@ -19,7 +19,6 @@ package android.telephony.ims; import android.annotation.IntDef; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.pm.PackageManager; import android.telephony.SubscriptionManager; import android.text.TextUtils; @@ -83,7 +82,6 @@ public final class ImsException extends Exception { * @hide */ @SystemApi - @TestApi public ImsException(@Nullable String message) { super(getMessage(message, CODE_ERROR_UNSPECIFIED)); } @@ -94,7 +92,6 @@ public final class ImsException extends Exception { * @hide */ @SystemApi - @TestApi public ImsException(@Nullable String message, @ImsErrorCode int code) { super(getMessage(message, code)); mCode = code; @@ -108,7 +105,6 @@ public final class ImsException extends Exception { * @hide */ @SystemApi - @TestApi public ImsException(@Nullable String message, @ImsErrorCode int code, @Nullable Throwable cause) { super(getMessage(message, code), cause); diff --git a/telephony/java/android/telephony/ims/ImsExternalCallState.java b/telephony/java/android/telephony/ims/ImsExternalCallState.java index 7d73165d4540..fdf636c323b6 100644 --- a/telephony/java/android/telephony/ims/ImsExternalCallState.java +++ b/telephony/java/android/telephony/ims/ImsExternalCallState.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; @@ -35,7 +34,6 @@ import java.lang.annotation.RetentionPolicy; * @hide */ @SystemApi -@TestApi public final class ImsExternalCallState implements Parcelable { private static final String TAG = "ImsExternalCallState"; diff --git a/telephony/java/android/telephony/ims/ImsMmTelManager.java b/telephony/java/android/telephony/ims/ImsMmTelManager.java index 3a0e49e204cb..76c1fafe05fb 100644 --- a/telephony/java/android/telephony/ims/ImsMmTelManager.java +++ b/telephony/java/android/telephony/ims/ImsMmTelManager.java @@ -25,7 +25,6 @@ import android.annotation.RequiresPermission; import android.annotation.SuppressAutoDoc; import android.annotation.SuppressLint; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Binder; import android.os.RemoteException; import android.os.ServiceSpecificException; @@ -97,7 +96,7 @@ public class ImsMmTelManager implements RegistrationManager { */ // Do not add to this class, add to RegistrationManager.RegistrationCallback instead. @Deprecated - @SystemApi @TestApi + @SystemApi public static class RegistrationCallback extends RegistrationManager.RegistrationCallback { /** @@ -231,7 +230,6 @@ public class ImsMmTelManager implements RegistrationManager { * @hide */ @SystemApi - @TestApi @Deprecated @SuppressAutoDoc // No support for device / profile owner or carrier privileges (b/72967236). @RequiresPermission(anyOf = { @@ -280,7 +278,7 @@ public class ImsMmTelManager implements RegistrationManager { * @hide */ @Deprecated - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerImsRegistrationCallback(@NonNull @CallbackExecutor Executor executor, @NonNull RegistrationCallback c) throws ImsException { @@ -366,7 +364,7 @@ public class ImsMmTelManager implements RegistrationManager { * @hide */ @Deprecated - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterImsRegistrationCallback(@NonNull RegistrationCallback c) { if (c == null) { @@ -422,7 +420,7 @@ public class ImsMmTelManager implements RegistrationManager { * @hide */ @Override - @SystemApi @TestApi + @SystemApi @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void getRegistrationState(@NonNull @CallbackExecutor Executor executor, @NonNull @ImsRegistrationState Consumer<Integer> stateCallback) { @@ -681,7 +679,7 @@ public class ImsMmTelManager implements RegistrationManager { * @hide */ @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) - @SystemApi @TestApi + @SystemApi public void setAdvancedCallingSettingEnabled(boolean isEnabled) { ITelephony iTelephony = getITelephony(); if (iTelephony == null) { @@ -725,7 +723,7 @@ public class ImsMmTelManager implements RegistrationManager { * @hide */ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) - @SystemApi @TestApi + @SystemApi public boolean isCapable(@MmTelFeature.MmTelCapabilities.MmTelCapability int capability, @ImsRegistrationImplBase.ImsRegistrationTech int imsRegTech) { ITelephony iTelephony = getITelephony(); @@ -758,7 +756,7 @@ public class ImsMmTelManager implements RegistrationManager { * otherwise. * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isAvailable(@MmTelFeature.MmTelCapabilities.MmTelCapability int capability, @ImsRegistrationImplBase.ImsRegistrationTech int imsRegTech) { @@ -790,7 +788,7 @@ public class ImsMmTelManager implements RegistrationManager { * available. * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void isSupported(@MmTelFeature.MmTelCapabilities.MmTelCapability int capability, @AccessNetworkConstants.TransportType int transportType, @@ -879,7 +877,7 @@ public class ImsMmTelManager implements RegistrationManager { * @see #isVtSettingEnabled() * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public void setVtSettingEnabled(boolean isEnabled) { ITelephony iTelephony = getITelephony(); @@ -954,7 +952,7 @@ public class ImsMmTelManager implements RegistrationManager { * @see #isVoWiFiSettingEnabled() * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiSettingEnabled(boolean isEnabled) { ITelephony iTelephony = getITelephony(); @@ -1032,7 +1030,7 @@ public class ImsMmTelManager implements RegistrationManager { * @see #isVoWiFiRoamingSettingEnabled() * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiRoamingSettingEnabled(boolean isEnabled) { ITelephony iTelephony = getITelephony(); @@ -1069,7 +1067,7 @@ public class ImsMmTelManager implements RegistrationManager { * @see #setVoWiFiSettingEnabled(boolean) * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiNonPersistent(boolean isCapable, int mode) { ITelephony iTelephony = getITelephony(); @@ -1152,7 +1150,7 @@ public class ImsMmTelManager implements RegistrationManager { * @see #getVoWiFiModeSetting() * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiModeSetting(@WiFiCallingMode int mode) { ITelephony iTelephony = getITelephony(); @@ -1188,7 +1186,7 @@ public class ImsMmTelManager implements RegistrationManager { * @see #setVoWiFiRoamingSettingEnabled(boolean) * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public @WiFiCallingMode int getVoWiFiRoamingModeSetting() { ITelephony iTelephony = getITelephony(); @@ -1224,7 +1222,7 @@ public class ImsMmTelManager implements RegistrationManager { * @see #getVoWiFiRoamingModeSetting() * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiRoamingModeSetting(@WiFiCallingMode int mode) { ITelephony iTelephony = getITelephony(); @@ -1258,7 +1256,7 @@ public class ImsMmTelManager implements RegistrationManager { * @param isEnabled if true RTT should be enabled during calls made on this subscription. * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public void setRttCapabilitySetting(boolean isEnabled) { ITelephony iTelephony = getITelephony(); @@ -1338,7 +1336,7 @@ public class ImsMmTelManager implements RegistrationManager { * the IMS service is not available. * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void getFeatureState(@NonNull @CallbackExecutor Executor executor, @NonNull @ImsFeature.ImsState Consumer<Integer> callback) throws ImsException { diff --git a/telephony/java/android/telephony/ims/ImsService.java b/telephony/java/android/telephony/ims/ImsService.java index 90a6de7b66a3..c806d5c8ed3a 100644 --- a/telephony/java/android/telephony/ims/ImsService.java +++ b/telephony/java/android/telephony/ims/ImsService.java @@ -19,7 +19,6 @@ package android.telephony.ims; import android.annotation.LongDef; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Service; import android.content.Intent; import android.os.IBinder; @@ -101,7 +100,6 @@ import java.util.Map; * @hide */ @SystemApi -@TestApi public class ImsService extends Service { private static final String LOG_TAG = "ImsService"; @@ -558,4 +556,4 @@ public class ImsService extends Service { result.append("}"); return result.toString(); } -}
\ No newline at end of file +} diff --git a/telephony/java/android/telephony/ims/ImsSsData.java b/telephony/java/android/telephony/ims/ImsSsData.java index 70bf0c57366d..fb8e5d37875b 100644 --- a/telephony/java/android/telephony/ims/ImsSsData.java +++ b/telephony/java/android/telephony/ims/ImsSsData.java @@ -19,7 +19,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -37,7 +36,6 @@ import java.util.List; * {@hide} */ @SystemApi -@TestApi public final class ImsSsData implements Parcelable { private static final String TAG = ImsSsData.class.getCanonicalName(); diff --git a/telephony/java/android/telephony/ims/ImsSsInfo.java b/telephony/java/android/telephony/ims/ImsSsInfo.java index 9cce95fc67f8..27b56b8c5b47 100644 --- a/telephony/java/android/telephony/ims/ImsSsInfo.java +++ b/telephony/java/android/telephony/ims/ImsSsInfo.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; @@ -38,7 +37,6 @@ import java.lang.annotation.RetentionPolicy; * @hide */ @SystemApi -@TestApi public final class ImsSsInfo implements Parcelable { /**@hide*/ diff --git a/telephony/java/android/telephony/ims/ImsStreamMediaProfile.java b/telephony/java/android/telephony/ims/ImsStreamMediaProfile.java index b70fd649ab79..131cb1a505fb 100644 --- a/telephony/java/android/telephony/ims/ImsStreamMediaProfile.java +++ b/telephony/java/android/telephony/ims/ImsStreamMediaProfile.java @@ -18,7 +18,6 @@ package android.telephony.ims; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; @@ -30,7 +29,6 @@ import android.os.Parcelable; * @hide */ @SystemApi -@TestApi public final class ImsStreamMediaProfile implements Parcelable { private static final String TAG = "ImsStreamMediaProfile"; diff --git a/telephony/java/android/telephony/ims/ImsSuppServiceNotification.java b/telephony/java/android/telephony/ims/ImsSuppServiceNotification.java index f67f68e2e425..16303685d0a3 100644 --- a/telephony/java/android/telephony/ims/ImsSuppServiceNotification.java +++ b/telephony/java/android/telephony/ims/ImsSuppServiceNotification.java @@ -19,7 +19,6 @@ package android.telephony.ims; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -32,7 +31,6 @@ import java.util.Arrays; * @hide */ @SystemApi -@TestApi public final class ImsSuppServiceNotification implements Parcelable { private static final String TAG = "ImsSuppServiceNotification"; diff --git a/telephony/java/android/telephony/ims/ImsUtListener.java b/telephony/java/android/telephony/ims/ImsUtListener.java index 460a032ce7e0..baa0576cdf13 100644 --- a/telephony/java/android/telephony/ims/ImsUtListener.java +++ b/telephony/java/android/telephony/ims/ImsUtListener.java @@ -18,7 +18,6 @@ package android.telephony.ims; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Bundle; import android.os.RemoteException; import android.telephony.ims.stub.ImsUtImplBase; @@ -34,7 +33,6 @@ import com.android.ims.internal.IImsUtListener; // DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you // will break other implementations of ImsUt maintained by other ImsServices. @SystemApi -@TestApi public class ImsUtListener { /** diff --git a/telephony/java/android/telephony/ims/ImsVideoCallProvider.java b/telephony/java/android/telephony/ims/ImsVideoCallProvider.java index 569c6d5a4e4d..2fca4096f447 100644 --- a/telephony/java/android/telephony/ims/ImsVideoCallProvider.java +++ b/telephony/java/android/telephony/ims/ImsVideoCallProvider.java @@ -17,14 +17,12 @@ package android.telephony.ims; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.net.Uri; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.RemoteException; -import android.telecom.Connection; import android.telecom.VideoProfile; import android.telecom.VideoProfile.CameraCapabilities; import android.view.Surface; @@ -37,7 +35,6 @@ import com.android.internal.os.SomeArgs; * @hide */ @SystemApi -@TestApi public abstract class ImsVideoCallProvider { private static final int MSG_SET_CALLBACK = 1; private static final int MSG_SET_CAMERA = 2; diff --git a/telephony/java/android/telephony/ims/ProvisioningManager.java b/telephony/java/android/telephony/ims/ProvisioningManager.java index 3affdf64aae7..24ae979bb08d 100644 --- a/telephony/java/android/telephony/ims/ProvisioningManager.java +++ b/telephony/java/android/telephony/ims/ProvisioningManager.java @@ -23,7 +23,6 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.StringDef; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.annotation.WorkerThread; import android.os.Binder; import android.os.RemoteException; @@ -59,7 +58,6 @@ import java.util.concurrent.Executor; * @hide */ @SystemApi -@TestApi public class ProvisioningManager { /**@hide*/ diff --git a/telephony/java/android/telephony/ims/RcsUceAdapter.java b/telephony/java/android/telephony/ims/RcsUceAdapter.java index 4606f7d625aa..c2ddcea3dbd3 100644 --- a/telephony/java/android/telephony/ims/RcsUceAdapter.java +++ b/telephony/java/android/telephony/ims/RcsUceAdapter.java @@ -22,7 +22,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.Context; import android.net.Uri; import android.os.Binder; @@ -519,7 +518,6 @@ public class RcsUceAdapter { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public void setUceSettingEnabled(boolean isEnabled) throws ImsException { IImsRcsController imsRcsController = getIImsRcsController(); diff --git a/telephony/java/android/telephony/ims/feature/CapabilityChangeRequest.java b/telephony/java/android/telephony/ims/feature/CapabilityChangeRequest.java index 1918bcb00733..87a5094a95f3 100644 --- a/telephony/java/android/telephony/ims/feature/CapabilityChangeRequest.java +++ b/telephony/java/android/telephony/ims/feature/CapabilityChangeRequest.java @@ -18,7 +18,6 @@ package android.telephony.ims.feature; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; import android.telephony.ims.stub.ImsRegistrationImplBase; @@ -34,7 +33,6 @@ import java.util.Set; * {@hide} */ @SystemApi -@TestApi public final class CapabilityChangeRequest implements Parcelable { /** diff --git a/telephony/java/android/telephony/ims/feature/ImsFeature.java b/telephony/java/android/telephony/ims/feature/ImsFeature.java index e5779b315c93..b0a7b62c88ab 100644 --- a/telephony/java/android/telephony/ims/feature/ImsFeature.java +++ b/telephony/java/android/telephony/ims/feature/ImsFeature.java @@ -44,7 +44,6 @@ import java.util.Map; * @hide */ @SystemApi -@TestApi public abstract class ImsFeature { private static final String LOG_TAG = "ImsFeature"; @@ -62,19 +61,19 @@ public abstract class ImsFeature { * CSFB for emergency calling. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int FEATURE_EMERGENCY_MMTEL = 0; /** * This feature supports the MMTEL feature. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int FEATURE_MMTEL = 1; /** * This feature supports the RCS feature. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int FEATURE_RCS = 2; /** * Total number of features defined @@ -124,7 +123,7 @@ public abstract class ImsFeature { * during this time will result in an {@link IllegalStateException}. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int STATE_UNAVAILABLE = 0; /** * This {@link ImsFeature} state is initializing and should not be communicated with. This will @@ -132,14 +131,14 @@ public abstract class ImsFeature { * during this time will result in an {@link IllegalStateException}. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int STATE_INITIALIZING = 1; /** * This {@link ImsFeature} is ready for communication. Do not attempt to call framework methods * until {@see #onFeatureReady()} is called. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int STATE_READY = 2; /** @@ -169,13 +168,13 @@ public abstract class ImsFeature { * The capability was unable to be changed. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int CAPABILITY_ERROR_GENERIC = -1; /** * The capability was able to be changed. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int CAPABILITY_SUCCESS = 0; /** @@ -349,7 +348,7 @@ public abstract class ImsFeature { * subscription IDs associated with this slot. * @hide */ - @SystemApi @TestApi + @SystemApi public final int getSlotIndex() { return mSlotId; } @@ -359,7 +358,7 @@ public abstract class ImsFeature { * or {@link #STATE_UNAVAILABLE} if it has not been updated yet. * @hide */ - @SystemApi @TestApi + @SystemApi public @ImsState int getFeatureState() { synchronized (mLock) { return mState; @@ -373,7 +372,7 @@ public abstract class ImsFeature { * {@link #STATE_INITIALIZING}, or {@link #STATE_READY}. * @hide */ - @SystemApi @TestApi + @SystemApi public final void setFeatureState(@ImsState int state) { synchronized (mLock) { if (mState != state) { diff --git a/telephony/java/android/telephony/ims/feature/MmTelFeature.java b/telephony/java/android/telephony/ims/feature/MmTelFeature.java index d8a10ebb7bde..508d1a79d27e 100644 --- a/telephony/java/android/telephony/ims/feature/MmTelFeature.java +++ b/telephony/java/android/telephony/ims/feature/MmTelFeature.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Bundle; import android.os.Message; import android.os.RemoteException; @@ -60,7 +59,7 @@ public class MmTelFeature extends ImsFeature { /** * @hide */ - @SystemApi @TestApi + @SystemApi public MmTelFeature() { } @@ -228,7 +227,7 @@ public class MmTelFeature extends ImsFeature { * @see #removeCapabilities(int) * @hide */ - @SystemApi @TestApi + @SystemApi public MmTelCapabilities() { super(); } @@ -237,7 +236,7 @@ public class MmTelFeature extends ImsFeature { * @hide */ @Deprecated - @SystemApi @TestApi + @SystemApi public MmTelCapabilities(Capabilities c) { mCapabilities = c.mCapabilities; } @@ -248,7 +247,7 @@ public class MmTelFeature extends ImsFeature { * bitfield. * @hide */ - @SystemApi @TestApi + @SystemApi public MmTelCapabilities(@MmTelCapability int capabilities) { super(capabilities); } @@ -288,7 +287,7 @@ public class MmTelFeature extends ImsFeature { * @hide */ @Override - @SystemApi @TestApi + @SystemApi public final void addCapabilities(@MmTelCapability int capabilities) { super.addCapabilities(capabilities); } @@ -297,7 +296,7 @@ public class MmTelFeature extends ImsFeature { * @hide */ @Override - @SystemApi @TestApi + @SystemApi public final void removeCapabilities(@MmTelCapability int capability) { super.removeCapabilities(capability); } @@ -375,14 +374,14 @@ public class MmTelFeature extends ImsFeature { * outgoing call as IMS. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int PROCESS_CALL_IMS = 0; /** * To be returned by {@link #shouldProcessCall(String[])} when the telephony framework should * not process the outgoing call as IMS and should instead use circuit switch. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int PROCESS_CALL_CSFB = 1; /** @hide */ @@ -400,7 +399,7 @@ public class MmTelFeature extends ImsFeature { * This is an optional boolean flag. * @hide */ - @SystemApi @TestApi + @SystemApi public static final String EXTRA_IS_USSD = "android.telephony.ims.feature.extra.IS_USSD"; /** @@ -413,7 +412,7 @@ public class MmTelFeature extends ImsFeature { * This is an optional boolean flag. * @hide */ - @SystemApi @TestApi + @SystemApi public static final String EXTRA_IS_UNKNOWN_CALL = "android.telephony.ims.feature.extra.IS_UNKNOWN_CALL"; @@ -453,7 +452,7 @@ public class MmTelFeature extends ImsFeature { * @hide */ @Override - @SystemApi @TestApi + @SystemApi public @NonNull final MmTelCapabilities queryCapabilityStatus() { return new MmTelCapabilities(super.queryCapabilityStatus()); } @@ -468,7 +467,7 @@ public class MmTelFeature extends ImsFeature { * {@link #changeEnabledCapabilities}) should also show the status as disabled. * @hide */ - @SystemApi @TestApi + @SystemApi public final void notifyCapabilitiesStatusChanged(@NonNull MmTelCapabilities c) { if (c == null) { throw new IllegalArgumentException("MmTelCapabilities must be non-null!"); @@ -483,7 +482,7 @@ public class MmTelFeature extends ImsFeature { * {@link #EXTRA_IS_UNKNOWN_CALL} and {@link #EXTRA_IS_USSD} above. * @hide */ - @SystemApi @TestApi + @SystemApi public final void notifyIncomingCall(@NonNull ImsCallSessionImplBase c, @NonNull Bundle extras) { if (c == null || extras == null) { @@ -509,7 +508,7 @@ public class MmTelFeature extends ImsFeature { * @param reason The {@link ImsReasonInfo} call rejection reason. * @hide */ - @SystemApi @TestApi + @SystemApi public final void notifyRejectedCall(@NonNull ImsCallProfile callProfile, @NonNull ImsReasonInfo reason) { if (callProfile == null || reason == null) { @@ -548,7 +547,7 @@ public class MmTelFeature extends ImsFeature { * @link count the new Voice Message count. * @hide */ - @SystemApi @TestApi + @SystemApi public final void notifyVoiceMessageCountUpdate(int count) { IImsMmTelListener listener = getListener(); if (listener == null) { @@ -571,7 +570,7 @@ public class MmTelFeature extends ImsFeature { * @hide */ @Override - @SystemApi @TestApi + @SystemApi public boolean queryCapabilityConfiguration(@MmTelCapabilities.MmTelCapability int capability, @ImsRegistrationImplBase.ImsRegistrationTech int radioTech) { // Base implementation - Override to provide functionality @@ -592,7 +591,7 @@ public class MmTelFeature extends ImsFeature { * * @hide */ @Override - @SystemApi @TestApi + @SystemApi public void changeEnabledCapabilities(@NonNull CapabilityChangeRequest request, @NonNull CapabilityCallbackProxy c) { // Base implementation, no-op @@ -617,7 +616,7 @@ public class MmTelFeature extends ImsFeature { * @return a {@link ImsCallProfile} object * @hide */ - @SystemApi @TestApi + @SystemApi public @Nullable ImsCallProfile createCallProfile(int callSessionType, int callType) { // Base Implementation - Should be overridden return null; @@ -640,7 +639,7 @@ public class MmTelFeature extends ImsFeature { * @param profile a call profile to make the call * @hide */ - @SystemApi @TestApi + @SystemApi public @Nullable ImsCallSessionImplBase createCallSession(@NonNull ImsCallProfile profile) { // Base Implementation - Should be overridden return null; @@ -659,7 +658,7 @@ public class MmTelFeature extends ImsFeature { * call will be placed over IMS or via CSFB. * @hide */ - @SystemApi @TestApi + @SystemApi public @ProcessCallResult int shouldProcessCall(@NonNull String[] numbers) { return PROCESS_CALL_IMS; } @@ -694,7 +693,7 @@ public class MmTelFeature extends ImsFeature { * configuration. * @hide */ - @SystemApi @TestApi + @SystemApi public @NonNull ImsUtImplBase getUt() { // Base Implementation - Should be overridden return new ImsUtImplBase(); @@ -705,7 +704,7 @@ public class MmTelFeature extends ImsFeature { * calls that support it. * @hide */ - @SystemApi @TestApi + @SystemApi public @NonNull ImsEcbmImplBase getEcbm() { // Base Implementation - Should be overridden return new ImsEcbmImplBase(); @@ -716,7 +715,7 @@ public class MmTelFeature extends ImsFeature { * package processing for multi-endpoint. * @hide */ - @SystemApi @TestApi + @SystemApi public @NonNull ImsMultiEndpointImplBase getMultiEndpoint() { // Base Implementation - Should be overridden return new ImsMultiEndpointImplBase(); @@ -744,7 +743,7 @@ public class MmTelFeature extends ImsFeature { * } * @hide */ - @SystemApi @TestApi + @SystemApi public void setUiTtyMode(int mode, @Nullable Message onCompleteMessage) { // Base Implementation - Should be overridden } @@ -780,7 +779,7 @@ public class MmTelFeature extends ImsFeature { * Provider. * @hide */ - @SystemApi @TestApi + @SystemApi public @NonNull ImsSmsImplBase getSmsImplementation() { return new ImsSmsImplBase(); } @@ -794,7 +793,7 @@ public class MmTelFeature extends ImsFeature { * @hide */ @Override - @SystemApi @TestApi + @SystemApi public void onFeatureRemoved() { // Base Implementation - Should be overridden } @@ -804,7 +803,7 @@ public class MmTelFeature extends ImsFeature { * @hide */ @Override - @SystemApi @TestApi + @SystemApi public void onFeatureReady() { // Base Implementation - Should be overridden } diff --git a/telephony/java/android/telephony/ims/feature/RcsFeature.java b/telephony/java/android/telephony/ims/feature/RcsFeature.java index 98b0bcf6075b..b8ae146784d4 100644 --- a/telephony/java/android/telephony/ims/feature/RcsFeature.java +++ b/telephony/java/android/telephony/ims/feature/RcsFeature.java @@ -20,7 +20,6 @@ import android.annotation.CallbackExecutor; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.net.Uri; import android.os.RemoteException; import android.telephony.ims.RcsContactUceCapability; @@ -50,7 +49,6 @@ import java.util.function.Supplier; * @hide */ @SystemApi -@TestApi public class RcsFeature extends ImsFeature { private static final String LOG_TAG = "RcsFeature"; diff --git a/telephony/java/android/telephony/ims/stub/ImsCallSessionImplBase.java b/telephony/java/android/telephony/ims/stub/ImsCallSessionImplBase.java index 8f738d216cbe..1cebdd582b58 100644 --- a/telephony/java/android/telephony/ims/stub/ImsCallSessionImplBase.java +++ b/telephony/java/android/telephony/ims/stub/ImsCallSessionImplBase.java @@ -18,7 +18,6 @@ package android.telephony.ims.stub; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Message; import android.os.RemoteException; import android.telephony.ims.ImsCallProfile; @@ -39,7 +38,6 @@ import com.android.ims.internal.IImsVideoCallProvider; * @hide */ @SystemApi -@TestApi // DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you // will break other implementations of ImsCallSession maintained by other ImsServices. public class ImsCallSessionImplBase implements AutoCloseable { diff --git a/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java b/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java index 4ef44d3ec9ef..e0290a5dc2af 100644 --- a/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java +++ b/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java @@ -19,7 +19,6 @@ package android.telephony.ims.stub; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.Context; import android.os.PersistableBundle; import android.os.RemoteException; @@ -51,7 +50,6 @@ import java.util.HashMap; * @hide */ @SystemApi -@TestApi public class ImsConfigImplBase { private static final String TAG = "ImsConfigImplBase"; diff --git a/telephony/java/android/telephony/ims/stub/ImsEcbmImplBase.java b/telephony/java/android/telephony/ims/stub/ImsEcbmImplBase.java index 4a3a2eaf4225..06c35eaec6dd 100644 --- a/telephony/java/android/telephony/ims/stub/ImsEcbmImplBase.java +++ b/telephony/java/android/telephony/ims/stub/ImsEcbmImplBase.java @@ -17,7 +17,6 @@ package android.telephony.ims.stub; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.RemoteException; import android.util.Log; @@ -34,7 +33,6 @@ import com.android.ims.internal.IImsEcbmListener; * @hide */ @SystemApi -@TestApi public class ImsEcbmImplBase { private static final String TAG = "ImsEcbmImplBase"; diff --git a/telephony/java/android/telephony/ims/stub/ImsFeatureConfiguration.java b/telephony/java/android/telephony/ims/stub/ImsFeatureConfiguration.java index 4e7307e2fa0c..cd9ebbf38e35 100644 --- a/telephony/java/android/telephony/ims/stub/ImsFeatureConfiguration.java +++ b/telephony/java/android/telephony/ims/stub/ImsFeatureConfiguration.java @@ -19,7 +19,6 @@ package android.telephony.ims.stub; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; import android.telephony.ims.feature.ImsFeature; @@ -36,7 +35,6 @@ import java.util.Set; * @hide */ @SystemApi -@TestApi public final class ImsFeatureConfiguration implements Parcelable { public static final class FeatureSlotPair { diff --git a/telephony/java/android/telephony/ims/stub/ImsMultiEndpointImplBase.java b/telephony/java/android/telephony/ims/stub/ImsMultiEndpointImplBase.java index 0ae5bba5d722..d002903a11b6 100644 --- a/telephony/java/android/telephony/ims/stub/ImsMultiEndpointImplBase.java +++ b/telephony/java/android/telephony/ims/stub/ImsMultiEndpointImplBase.java @@ -17,7 +17,6 @@ package android.telephony.ims.stub; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.RemoteException; import android.telephony.ims.ImsExternalCallState; import android.util.Log; @@ -38,7 +37,6 @@ import java.util.List; * @hide */ @SystemApi -@TestApi public class ImsMultiEndpointImplBase { private static final String TAG = "MultiEndpointImplBase"; diff --git a/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java b/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java index 2cdf70e6cf4c..12abdd1d7e11 100644 --- a/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java +++ b/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java @@ -18,7 +18,6 @@ package android.telephony.ims.stub; import android.annotation.IntDef; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.net.Uri; import android.os.RemoteException; import android.telephony.ims.ImsReasonInfo; @@ -40,7 +39,6 @@ import java.lang.annotation.RetentionPolicy; * @hide */ @SystemApi -@TestApi public class ImsRegistrationImplBase { private static final String LOG_TAG = "ImsRegistrationImplBase"; diff --git a/telephony/java/android/telephony/ims/stub/ImsSmsImplBase.java b/telephony/java/android/telephony/ims/stub/ImsSmsImplBase.java index a9a33c0e1507..2783e299236b 100644 --- a/telephony/java/android/telephony/ims/stub/ImsSmsImplBase.java +++ b/telephony/java/android/telephony/ims/stub/ImsSmsImplBase.java @@ -19,7 +19,6 @@ package android.telephony.ims.stub; import android.annotation.IntDef; import android.annotation.IntRange; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.RemoteException; import android.telephony.SmsManager; import android.telephony.SmsMessage; @@ -38,7 +37,6 @@ import java.lang.annotation.RetentionPolicy; * @hide */ @SystemApi -@TestApi public class ImsSmsImplBase { private static final String LOG_TAG = "SmsImplBase"; diff --git a/telephony/java/android/telephony/ims/stub/ImsUtImplBase.java b/telephony/java/android/telephony/ims/stub/ImsUtImplBase.java index 8564f7affd6d..f5219d5b49e8 100644 --- a/telephony/java/android/telephony/ims/stub/ImsUtImplBase.java +++ b/telephony/java/android/telephony/ims/stub/ImsUtImplBase.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Bundle; import android.os.RemoteException; import android.telephony.ims.ImsUtListener; @@ -40,7 +39,6 @@ import java.lang.annotation.RetentionPolicy; // DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you // will break other implementations of ImsUt maintained by other ImsServices. @SystemApi -@TestApi public class ImsUtImplBase { /** * Bar all incoming calls. (See 3GPP TS 24.611) diff --git a/telephony/java/android/telephony/mbms/DownloadRequest.java b/telephony/java/android/telephony/mbms/DownloadRequest.java index ac258cd40d65..eb59f87a6c02 100644 --- a/telephony/java/android/telephony/mbms/DownloadRequest.java +++ b/telephony/java/android/telephony/mbms/DownloadRequest.java @@ -19,7 +19,6 @@ package android.telephony.mbms; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.Intent; import android.net.Uri; import android.os.Parcel; @@ -186,7 +185,6 @@ public final class DownloadRequest implements Parcelable { * @hide */ @SystemApi - @TestApi public Builder setServiceId(String serviceId) { fileServiceId = serviceId; return this; diff --git a/telephony/java/android/telephony/mbms/FileInfo.java b/telephony/java/android/telephony/mbms/FileInfo.java index ada2872874f5..e52b2ce0c505 100644 --- a/telephony/java/android/telephony/mbms/FileInfo.java +++ b/telephony/java/android/telephony/mbms/FileInfo.java @@ -17,7 +17,6 @@ package android.telephony.mbms; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; @@ -50,7 +49,6 @@ public final class FileInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public FileInfo(Uri uri, String mimeType) { this.uri = uri; this.mimeType = mimeType; diff --git a/telephony/java/android/telephony/mbms/FileServiceInfo.java b/telephony/java/android/telephony/mbms/FileServiceInfo.java index 8c79ab63b131..8777e7f59e3f 100644 --- a/telephony/java/android/telephony/mbms/FileServiceInfo.java +++ b/telephony/java/android/telephony/mbms/FileServiceInfo.java @@ -17,7 +17,6 @@ package android.telephony.mbms; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -36,7 +35,6 @@ public final class FileServiceInfo extends ServiceInfo implements Parcelable { /** @hide */ @SystemApi - @TestApi public FileServiceInfo(Map<Locale, String> newNames, String newClassName, List<Locale> newLocales, String newServiceId, Date start, Date end, List<FileInfo> newFiles) { diff --git a/telephony/java/android/telephony/mbms/StreamingServiceInfo.java b/telephony/java/android/telephony/mbms/StreamingServiceInfo.java index 8ad1d8940ca7..316e86568213 100644 --- a/telephony/java/android/telephony/mbms/StreamingServiceInfo.java +++ b/telephony/java/android/telephony/mbms/StreamingServiceInfo.java @@ -17,7 +17,6 @@ package android.telephony.mbms; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -42,7 +41,6 @@ public final class StreamingServiceInfo extends ServiceInfo implements Parcelabl * @hide */ @SystemApi - @TestApi public StreamingServiceInfo(Map<Locale, String> names, String className, List<Locale> locales, String serviceId, Date start, Date end) { super(names, className, locales, serviceId, start, end); diff --git a/telephony/java/android/telephony/mbms/UriPathPair.java b/telephony/java/android/telephony/mbms/UriPathPair.java index f53d7e0287f3..9258919919b7 100644 --- a/telephony/java/android/telephony/mbms/UriPathPair.java +++ b/telephony/java/android/telephony/mbms/UriPathPair.java @@ -17,7 +17,6 @@ package android.telephony.mbms; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.ContentResolver; import android.net.Uri; import android.os.Parcel; @@ -30,7 +29,6 @@ import android.telephony.mbms.vendor.VendorUtils; * @hide */ @SystemApi -@TestApi public final class UriPathPair implements Parcelable { private final Uri mFilePathUri; private final Uri mContentUri; diff --git a/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java b/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java index 3053ea03bebe..ffc1d2efe2ae 100644 --- a/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java +++ b/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java @@ -18,7 +18,6 @@ package android.telephony.mbms.vendor; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.Intent; import android.os.Binder; import android.os.IBinder; @@ -45,7 +44,6 @@ import java.util.Map; * @hide */ @SystemApi -@TestApi public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub { private final Map<IBinder, DownloadStatusListener> mDownloadStatusListenerBinderMap = new HashMap<>(); @@ -576,7 +574,6 @@ public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub { // Following two methods exist to workaround b/124210145 /** @hide */ @SystemApi - @TestApi @Override public android.os.IBinder asBinder() { return super.asBinder(); @@ -584,7 +581,6 @@ public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub { /** @hide */ @SystemApi - @TestApi @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws RemoteException { diff --git a/telephony/java/android/telephony/mbms/vendor/MbmsGroupCallServiceBase.java b/telephony/java/android/telephony/mbms/vendor/MbmsGroupCallServiceBase.java index 1335b52673d2..e5b18bb5d644 100644 --- a/telephony/java/android/telephony/mbms/vendor/MbmsGroupCallServiceBase.java +++ b/telephony/java/android/telephony/mbms/vendor/MbmsGroupCallServiceBase.java @@ -18,7 +18,6 @@ package android.telephony.mbms.vendor; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Service; import android.content.Intent; import android.os.Binder; @@ -41,7 +40,6 @@ import java.util.List; * @hide */ @SystemApi -@TestApi public class MbmsGroupCallServiceBase extends Service { private final IBinder mInterface = new Stub() { @Override diff --git a/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java b/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java index cced44759527..e169b16ca958 100644 --- a/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java +++ b/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java @@ -18,7 +18,6 @@ package android.telephony.mbms.vendor; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.Intent; import android.net.Uri; import android.os.Binder; @@ -39,7 +38,6 @@ import java.util.List; * @hide */ @SystemApi -@TestApi public class MbmsStreamingServiceBase extends IMbmsStreamingService.Stub { /** * Initialize streaming service for this app and subId, registering the listener. @@ -299,7 +297,6 @@ public class MbmsStreamingServiceBase extends IMbmsStreamingService.Stub { // Following two methods exist to workaround b/124210145 /** @hide */ @SystemApi - @TestApi @Override public android.os.IBinder asBinder() { return super.asBinder(); @@ -307,7 +304,6 @@ public class MbmsStreamingServiceBase extends IMbmsStreamingService.Stub { /** @hide */ @SystemApi - @TestApi @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws RemoteException { diff --git a/telephony/java/android/telephony/mbms/vendor/VendorUtils.java b/telephony/java/android/telephony/mbms/vendor/VendorUtils.java index f1cac8cf8286..a43f12244168 100644 --- a/telephony/java/android/telephony/mbms/vendor/VendorUtils.java +++ b/telephony/java/android/telephony/mbms/vendor/VendorUtils.java @@ -17,7 +17,6 @@ package android.telephony.mbms.vendor; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -35,7 +34,6 @@ import java.util.List; * @hide */ @SystemApi -@TestApi public class VendorUtils { /** diff --git a/test-mock/api/test-current.txt b/test-mock/api/test-current.txt index 32ca250b6c74..79d746a57cc5 100644 --- a/test-mock/api/test-current.txt +++ b/test-mock/api/test-current.txt @@ -6,21 +6,12 @@ package android.test.mock { } @Deprecated public class MockPackageManager extends android.content.pm.PackageManager { - method public void addOnPermissionsChangeListener(android.content.pm.PackageManager.OnPermissionsChangedListener); - method public boolean arePermissionsIndividuallyControlled(); - method public String getDefaultBrowserPackageNameAsUser(int); method public int getInstallReason(String, android.os.UserHandle); method public java.util.List<android.content.pm.ApplicationInfo> getInstalledApplicationsAsUser(int, int); - method public java.util.List<android.content.pm.PackageInfo> getInstalledPackagesAsUser(int, int); method public String[] getNamesForUids(int[]); method public String getPermissionControllerPackageName(); - method public int getPermissionFlags(String, String, android.os.UserHandle); method @NonNull public String getServicesSystemSharedLibraryPackageName(); method @NonNull public String getSharedSystemSharedLibraryPackageName(); - method public void grantRuntimePermission(String, String, android.os.UserHandle); - method public void removeOnPermissionsChangeListener(android.content.pm.PackageManager.OnPermissionsChangedListener); - method public void revokeRuntimePermission(String, String, android.os.UserHandle); - method public void updatePermissionFlags(String, String, int, int, android.os.UserHandle); } } diff --git a/tests/net/java/com/android/server/connectivity/DnsManagerTest.java b/tests/net/java/com/android/server/connectivity/DnsManagerTest.java index 32bfa7059b0b..f5b85ca06f92 100644 --- a/tests/net/java/com/android/server/connectivity/DnsManagerTest.java +++ b/tests/net/java/com/android/server/connectivity/DnsManagerTest.java @@ -98,7 +98,6 @@ public class DnsManagerTest { @Mock Context mCtx; @Mock IDnsResolver mMockDnsResolver; - @Mock MockableSystemProperties mSystemProperties; private void assertResolverOptionsEquals( @NonNull ResolverOptionsParcel actual, @@ -137,7 +136,7 @@ public class DnsManagerTest { mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider()); when(mCtx.getContentResolver()).thenReturn(mContentResolver); - mDnsManager = new DnsManager(mCtx, mMockDnsResolver, mSystemProperties); + mDnsManager = new DnsManager(mCtx, mMockDnsResolver); // Clear the private DNS settings Settings.Global.putString(mContentResolver, PRIVATE_DNS_DEFAULT_MODE, ""); diff --git a/wifi/api/current.txt b/wifi/api/current.txt index d6e89223ba95..f0cf75c8bf72 100644 --- a/wifi/api/current.txt +++ b/wifi/api/current.txt @@ -563,6 +563,7 @@ package android.net.wifi.aware { method public int getMaxServiceNameLength(); method public int getMaxServiceSpecificInfoLength(); method public int getSupportedCipherSuites(); + method public boolean isInstantCommunicationModeSupported(); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.aware.Characteristics> CREATOR; field public static final int WIFI_AWARE_CIPHER_SUITE_NCS_SK_128 = 1; // 0x1 @@ -661,6 +662,7 @@ package android.net.wifi.aware { method public android.net.wifi.aware.Characteristics getCharacteristics(); method public boolean isAvailable(); method public boolean isDeviceAttached(); + method public boolean isInstantCommunicationModeEnabled(); field public static final String ACTION_WIFI_AWARE_STATE_CHANGED = "android.net.wifi.aware.action.WIFI_AWARE_STATE_CHANGED"; field public static final int WIFI_AWARE_DATA_PATH_ROLE_INITIATOR = 0; // 0x0 field public static final int WIFI_AWARE_DATA_PATH_ROLE_RESPONDER = 1; // 0x1 diff --git a/wifi/api/system-current.txt b/wifi/api/system-current.txt index 98cb849084d4..754a8dc408a4 100644 --- a/wifi/api/system-current.txt +++ b/wifi/api/system-current.txt @@ -800,6 +800,10 @@ package android.net.wifi.aware { method @Deprecated public android.net.NetworkSpecifier createNetworkSpecifierPmk(@NonNull android.net.wifi.aware.PeerHandle, @NonNull byte[]); } + public class WifiAwareManager { + method public void enableInstantCommunicationMode(boolean); + } + public class WifiAwareSession implements java.lang.AutoCloseable { method public android.net.NetworkSpecifier createNetworkSpecifierPmk(int, @NonNull byte[], @NonNull byte[]); } diff --git a/wifi/java/android/net/wifi/aware/Characteristics.java b/wifi/java/android/net/wifi/aware/Characteristics.java index d5fd48e9e7b3..116786516b3b 100644 --- a/wifi/java/android/net/wifi/aware/Characteristics.java +++ b/wifi/java/android/net/wifi/aware/Characteristics.java @@ -17,6 +17,7 @@ package android.net.wifi.aware; import android.annotation.IntDef; +import android.net.wifi.util.SdkLevelUtil; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; @@ -37,6 +38,9 @@ public final class Characteristics implements Parcelable { public static final String KEY_MAX_MATCH_FILTER_LENGTH = "key_max_match_filter_length"; /** @hide */ public static final String KEY_SUPPORTED_CIPHER_SUITES = "key_supported_cipher_suites"; + /** @hide */ + public static final String KEY_IS_INSTANT_COMMUNICATION_MODE_SUPPORTED = + "key_is_instant_communication_mode_supported"; private Bundle mCharacteristics = new Bundle(); @@ -83,6 +87,17 @@ public final class Characteristics implements Parcelable { return mCharacteristics.getInt(KEY_MAX_MATCH_FILTER_LENGTH); } + /** + * Check if instant communication mode is supported by device. + * @return True if supported, false otherwise. + */ + public boolean isInstantCommunicationModeSupported() { + if (!SdkLevelUtil.isAtLeastS()) { + throw new UnsupportedOperationException(); + } + return mCharacteristics.getBoolean(KEY_IS_INSTANT_COMMUNICATION_MODE_SUPPORTED); + } + /** @hide */ @IntDef(flag = true, prefix = { "WIFI_AWARE_CIPHER_SUITE_" }, value = { WIFI_AWARE_CIPHER_SUITE_NCS_SK_128, diff --git a/wifi/java/android/net/wifi/aware/IWifiAwareManager.aidl b/wifi/java/android/net/wifi/aware/IWifiAwareManager.aidl index f5b1edce1d69..cd2ca692137d 100644 --- a/wifi/java/android/net/wifi/aware/IWifiAwareManager.aidl +++ b/wifi/java/android/net/wifi/aware/IWifiAwareManager.aidl @@ -37,6 +37,8 @@ interface IWifiAwareManager boolean isUsageEnabled(); Characteristics getCharacteristics(); boolean isDeviceAttached(); + void enableInstantCommunicationMode(in String callingPackage, boolean enable); + boolean isInstantCommunicationModeEnabled(); // client API void connect(in IBinder binder, in String callingPackage, in String callingFeatureId, diff --git a/wifi/java/android/net/wifi/aware/WifiAwareManager.java b/wifi/java/android/net/wifi/aware/WifiAwareManager.java index 03f5f401fc40..bb146e37d48c 100644 --- a/wifi/java/android/net/wifi/aware/WifiAwareManager.java +++ b/wifi/java/android/net/wifi/aware/WifiAwareManager.java @@ -22,12 +22,14 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; +import android.annotation.SystemApi; import android.annotation.SystemService; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkRequest; import android.net.NetworkSpecifier; import android.net.wifi.util.HexEncoding; +import android.net.wifi.util.SdkLevelUtil; import android.os.Binder; import android.os.Build; import android.os.Bundle; @@ -208,6 +210,9 @@ public class WifiAwareManager { * or not (false). */ public boolean isDeviceAttached() { + if (!SdkLevelUtil.isAtLeastS()) { + throw new UnsupportedOperationException(); + } try { return mService.isDeviceAttached(); } catch (RemoteException e) { @@ -216,6 +221,42 @@ public class WifiAwareManager { } /** + * Enable the Wifi Aware Instant communication mode. If the device doesn't support this feature + * calling this API will result no action. + * @see Characteristics#isInstantCommunicationModeSupported() + * @param enable true for enable, false otherwise. + * @hide + */ + @SystemApi + public void enableInstantCommunicationMode(boolean enable) { + if (!SdkLevelUtil.isAtLeastS()) { + throw new UnsupportedOperationException(); + } + try { + mService.enableInstantCommunicationMode(mContext.getOpPackageName(), enable); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Return the current status of the Wifi Aware instant communication mode. + * If the device doesn't support this feature, return will always be false. + * @see Characteristics#isInstantCommunicationModeSupported() + * @return true if it is enabled, false otherwise. + */ + public boolean isInstantCommunicationModeEnabled() { + if (!SdkLevelUtil.isAtLeastS()) { + throw new UnsupportedOperationException(); + } + try { + return mService.isInstantCommunicationModeEnabled(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** * Returns the characteristics of the Wi-Fi Aware interface: a set of parameters which specify * limitations on configurations, e.g. the maximum service name length. * diff --git a/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java b/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java index d163fb0e6adf..2cf7f2c1b8cf 100644 --- a/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java +++ b/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java @@ -22,6 +22,7 @@ import static android.net.wifi.aware.WifiAwareNetworkSpecifier.NETWORK_SPECIFIER import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.junit.Assume.assumeTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; @@ -38,6 +39,7 @@ import android.content.pm.PackageManager; import android.net.MacAddress; import android.net.wifi.RttManager; import android.net.wifi.util.HexEncoding; +import android.net.wifi.util.SdkLevelUtil; import android.os.Build; import android.os.Handler; import android.os.IBinder; @@ -156,6 +158,19 @@ public class WifiAwareManagerTest { verify(mockAwareService).isDeviceAttached(); } + /** + * Validate pass-through of isInstantCommunicationModeEnabled() and + * enableInstantCommunicationMode() API + */ + @Test + public void testEnableInstantCommunicationMode() throws Exception { + assumeTrue(SdkLevelUtil.isAtLeastS()); + mDut.isInstantCommunicationModeEnabled(); + verify(mockAwareService).isInstantCommunicationModeEnabled(); + mDut.enableInstantCommunicationMode(true); + verify(mockAwareService).enableInstantCommunicationMode(anyString(), eq(true)); + } + /* * WifiAwareEventCallbackProxy Tests */ |