diff options
829 files changed, 7805 insertions, 3859 deletions
diff --git a/Android.bp b/Android.bp index b4d5e58b570b..54b6619db25e 100644 --- a/Android.bp +++ b/Android.bp @@ -477,6 +477,7 @@ java_defaults { "media/java/android/media/IMediaRouterClient.aidl", "media/java/android/media/IMediaRouterService.aidl", "media/java/android/media/IMediaSession2.aidl", + "media/java/android/media/IMediaSession2Service.aidl", "media/java/android/media/IMediaScannerListener.aidl", "media/java/android/media/IMediaScannerService.aidl", "media/java/android/media/IPlaybackConfigDispatcher.aidl", @@ -888,7 +889,12 @@ aidl_interface { "core/java/android/net/IIpMemoryStore.aidl", "core/java/android/net/INetworkStackConnector.aidl", "core/java/android/net/INetworkStackStatusCallback.aidl", + "core/java/android/net/IpPrefixParcelable.aidl", + "core/java/android/net/LinkAddressParcelable.aidl", + "core/java/android/net/LinkPropertiesParcelable.aidl", "core/java/android/net/PrivateDnsConfigParcel.aidl", + "core/java/android/net/ProxyInfoParcelable.aidl", + "core/java/android/net/RouteInfoParcelable.aidl", "core/java/android/net/dhcp/DhcpServingParamsParcel.aidl", "core/java/android/net/dhcp/IDhcpServer.aidl", "core/java/android/net/dhcp/IDhcpServerCallbacks.aidl", diff --git a/api/current.txt b/api/current.txt index bc2396741b72..7e7f03780691 100644 --- a/api/current.txt +++ b/api/current.txt @@ -6784,9 +6784,11 @@ package android.app.admin { method public void wipeData(int); method public void wipeData(int, java.lang.CharSequence); field public static final java.lang.String ACTION_ADD_DEVICE_ADMIN = "android.app.action.ADD_DEVICE_ADMIN"; + field public static final java.lang.String ACTION_ADMIN_POLICY_COMPLIANCE = "android.app.action.ADMIN_POLICY_COMPLIANCE"; field public static final java.lang.String ACTION_APPLICATION_DELEGATION_SCOPES_CHANGED = "android.app.action.APPLICATION_DELEGATION_SCOPES_CHANGED"; field public static final java.lang.String ACTION_DEVICE_ADMIN_SERVICE = "android.app.action.DEVICE_ADMIN_SERVICE"; field public static final java.lang.String ACTION_DEVICE_OWNER_CHANGED = "android.app.action.DEVICE_OWNER_CHANGED"; + field public static final java.lang.String ACTION_GET_PROVISIONING_MODE = "android.app.action.GET_PROVISIONING_MODE"; field public static final java.lang.String ACTION_MANAGED_PROFILE_PROVISIONED = "android.app.action.MANAGED_PROFILE_PROVISIONED"; field public static final java.lang.String ACTION_PROFILE_OWNER_CHANGED = "android.app.action.PROFILE_OWNER_CHANGED"; field public static final java.lang.String ACTION_PROVISIONING_SUCCESSFUL = "android.app.action.PROVISIONING_SUCCESSFUL"; @@ -6829,12 +6831,15 @@ package android.app.admin { field public static final java.lang.String EXTRA_PROVISIONING_DISCLAIMER_CONTENT = "android.app.extra.PROVISIONING_DISCLAIMER_CONTENT"; field public static final java.lang.String EXTRA_PROVISIONING_DISCLAIMER_HEADER = "android.app.extra.PROVISIONING_DISCLAIMER_HEADER"; field public static final deprecated java.lang.String EXTRA_PROVISIONING_EMAIL_ADDRESS = "android.app.extra.PROVISIONING_EMAIL_ADDRESS"; + field public static final java.lang.String EXTRA_PROVISIONING_IMEI = "android.app.extra.PROVISIONING_IMEI"; field public static final java.lang.String EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION = "android.app.extra.PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION"; field public static final java.lang.String EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED = "android.app.extra.PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED"; field public static final java.lang.String EXTRA_PROVISIONING_LOCALE = "android.app.extra.PROVISIONING_LOCALE"; field public static final java.lang.String EXTRA_PROVISIONING_LOCAL_TIME = "android.app.extra.PROVISIONING_LOCAL_TIME"; field public static final java.lang.String EXTRA_PROVISIONING_LOGO_URI = "android.app.extra.PROVISIONING_LOGO_URI"; field public static final java.lang.String EXTRA_PROVISIONING_MAIN_COLOR = "android.app.extra.PROVISIONING_MAIN_COLOR"; + field public static final java.lang.String EXTRA_PROVISIONING_MODE = "android.app.extra.PROVISIONING_MODE"; + field public static final java.lang.String EXTRA_PROVISIONING_SERIAL_NUMBER = "android.app.extra.PROVISIONING_SERIAL_NUMBER"; field public static final java.lang.String EXTRA_PROVISIONING_SKIP_ENCRYPTION = "android.app.extra.PROVISIONING_SKIP_ENCRYPTION"; field public static final java.lang.String EXTRA_PROVISIONING_SKIP_USER_CONSENT = "android.app.extra.PROVISIONING_SKIP_USER_CONSENT"; field public static final java.lang.String EXTRA_PROVISIONING_TIME_ZONE = "android.app.extra.PROVISIONING_TIME_ZONE"; @@ -6911,6 +6916,9 @@ package android.app.admin { field public static final int PRIVATE_DNS_SET_ERROR_FAILURE_SETTING = 2; // 0x2 field public static final int PRIVATE_DNS_SET_ERROR_HOST_NOT_SERVING = 1; // 0x1 field public static final int PRIVATE_DNS_SET_SUCCESS = 0; // 0x0 + field public static final int PROVISIONING_MODE_FULLY_MANAGED_DEVICE = 1; // 0x1 + field public static final int PROVISIONING_MODE_MANAGED_PROFILE = 2; // 0x2 + field public static final int PROVISIONING_MODE_MANAGED_PROFILE_ON_FULLY_MANAGED_DEVICE = 3; // 0x3 field public static final int RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT = 2; // 0x2 field public static final int RESET_PASSWORD_REQUIRE_ENTRY = 1; // 0x1 field public static final int SKIP_SETUP_WIZARD = 1; // 0x1 @@ -7682,6 +7690,7 @@ package android.app.usage { field public static final int ACTIVITY_RESUMED = 1; // 0x1 field public static final int ACTIVITY_STOPPED = 23; // 0x17 field public static final int CONFIGURATION_CHANGE = 5; // 0x5 + field public static final int DEVICE_SHUTDOWN = 26; // 0x1a field public static final int FOREGROUND_SERVICE_START = 19; // 0x13 field public static final int FOREGROUND_SERVICE_STOP = 20; // 0x14 field public static final int KEYGUARD_HIDDEN = 18; // 0x12 @@ -12281,6 +12290,7 @@ package android.content.res { method public void parseBundleExtra(java.lang.String, android.util.AttributeSet, android.os.Bundle) throws org.xmlpull.v1.XmlPullParserException; method public void parseBundleExtras(android.content.res.XmlResourceParser, android.os.Bundle) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; method public deprecated void updateConfiguration(android.content.res.Configuration, android.util.DisplayMetrics); + field public static final int ID_NULL = 0; // 0x0 } public static class Resources.NotFoundException extends java.lang.RuntimeException { @@ -12324,6 +12334,7 @@ package android.content.res { method public java.lang.String getPositionDescription(); method public int getResourceId(int, int); method public android.content.res.Resources getResources(); + method public int getSourceStyleResourceId(int, int); method public java.lang.String getString(int); method public java.lang.CharSequence getText(int); method public java.lang.CharSequence[] getTextArray(int); @@ -24136,6 +24147,7 @@ package android.media { method public int dequeueOutputBuffer(android.media.MediaCodec.BufferInfo, long); method protected void finalize(); method public void flush(); + method public java.lang.String getCanonicalName(); method public android.media.MediaCodecInfo getCodecInfo(); method public java.nio.ByteBuffer getInputBuffer(int); method public deprecated java.nio.ByteBuffer[] getInputBuffers(); @@ -24262,10 +24274,15 @@ package android.media { } public final class MediaCodecInfo { + method public java.lang.String getCanonicalName(); method public android.media.MediaCodecInfo.CodecCapabilities getCapabilitiesForType(java.lang.String); method public java.lang.String getName(); method public java.lang.String[] getSupportedTypes(); + method public boolean isAlias(); method public boolean isEncoder(); + method public boolean isHardwareAccelerated(); + method public boolean isSoftwareOnly(); + method public boolean isVendor(); } public static final class MediaCodecInfo.AudioCapabilities { @@ -24341,7 +24358,10 @@ package android.media { field public static final deprecated int COLOR_QCOM_FormatYUV420SemiPlanar = 2141391872; // 0x7fa30c00 field public static final deprecated int COLOR_TI_FormatYUV420PackedSemiPlanar = 2130706688; // 0x7f000100 field public static final java.lang.String FEATURE_AdaptivePlayback = "adaptive-playback"; + field public static final java.lang.String FEATURE_DynamicTimestamp = "dynamic-timestamp"; + field public static final java.lang.String FEATURE_FrameParsing = "frame-parsing"; field public static final java.lang.String FEATURE_IntraRefresh = "intra-refresh"; + field public static final java.lang.String FEATURE_MultipleFrames = "multiple-frames"; field public static final java.lang.String FEATURE_PartialFrame = "partial-frame"; field public static final java.lang.String FEATURE_SecurePlayback = "secure-playback"; field public static final java.lang.String FEATURE_TunneledPlayback = "tunneled-playback"; @@ -24363,6 +24383,33 @@ package android.media { field public static final int AACObjectSSR = 3; // 0x3 field public static final int AACObjectScalable = 6; // 0x6 field public static final int AACObjectXHE = 42; // 0x2a + field public static final int AV1Level2 = 1; // 0x1 + field public static final int AV1Level21 = 2; // 0x2 + field public static final int AV1Level22 = 4; // 0x4 + field public static final int AV1Level23 = 8; // 0x8 + field public static final int AV1Level3 = 16; // 0x10 + field public static final int AV1Level31 = 32; // 0x20 + field public static final int AV1Level32 = 64; // 0x40 + field public static final int AV1Level33 = 128; // 0x80 + field public static final int AV1Level4 = 256; // 0x100 + field public static final int AV1Level41 = 512; // 0x200 + field public static final int AV1Level42 = 1024; // 0x400 + field public static final int AV1Level43 = 2048; // 0x800 + field public static final int AV1Level5 = 4096; // 0x1000 + field public static final int AV1Level51 = 8192; // 0x2000 + field public static final int AV1Level52 = 16384; // 0x4000 + field public static final int AV1Level53 = 32768; // 0x8000 + field public static final int AV1Level6 = 65536; // 0x10000 + field public static final int AV1Level61 = 131072; // 0x20000 + field public static final int AV1Level62 = 262144; // 0x40000 + field public static final int AV1Level63 = 524288; // 0x80000 + field public static final int AV1Level7 = 1048576; // 0x100000 + field public static final int AV1Level71 = 2097152; // 0x200000 + field public static final int AV1Level72 = 4194304; // 0x400000 + field public static final int AV1Level73 = 8388608; // 0x800000 + field public static final int AV1Profile0 = 1; // 0x1 + field public static final int AV1Profile1 = 2; // 0x2 + field public static final int AV1Profile2 = 4; // 0x4 field public static final int AVCLevel1 = 1; // 0x1 field public static final int AVCLevel11 = 4; // 0x4 field public static final int AVCLevel12 = 8; // 0x8 @@ -24380,6 +24427,9 @@ package android.media { field public static final int AVCLevel5 = 16384; // 0x4000 field public static final int AVCLevel51 = 32768; // 0x8000 field public static final int AVCLevel52 = 65536; // 0x10000 + field public static final int AVCLevel6 = 131072; // 0x20000 + field public static final int AVCLevel61 = 262144; // 0x40000 + field public static final int AVCLevel62 = 524288; // 0x80000 field public static final int AVCProfileBaseline = 1; // 0x1 field public static final int AVCProfileConstrainedBaseline = 65536; // 0x10000 field public static final int AVCProfileConstrainedHigh = 524288; // 0x80000 @@ -24542,12 +24592,53 @@ package android.media { method public android.util.Range<java.lang.Double> getSupportedFrameRatesFor(int, int); method public android.util.Range<java.lang.Integer> getSupportedHeights(); method public android.util.Range<java.lang.Integer> getSupportedHeightsFor(int); + method public java.util.List<android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint> getSupportedPerformancePoints(); method public android.util.Range<java.lang.Integer> getSupportedWidths(); method public android.util.Range<java.lang.Integer> getSupportedWidthsFor(int); method public int getWidthAlignment(); method public boolean isSizeSupported(int, int); } + public static final class MediaCodecInfo.VideoCapabilities.PerformancePoint { + method public boolean covers(android.media.MediaFormat); + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_100; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_120; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_200; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_24; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_240; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_25; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_30; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_50; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_60; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_100; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_120; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_200; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_24; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_240; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_25; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_30; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_50; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_60; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint SD_24; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint SD_25; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint SD_30; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint SD_48; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint SD_50; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint SD_60; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_100; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_120; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_200; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_24; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_240; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_25; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_30; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_50; + field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_60; + field public final int frameRate; + field public final int height; + field public final int width; + } + public final class MediaCodecList { ctor public MediaCodecList(int); method public java.lang.String findDecoderForFormat(android.media.MediaFormat); @@ -25000,6 +25091,7 @@ package android.media { field public static final java.lang.String MIMETYPE_TEXT_CEA_708 = "text/cea-708"; field public static final java.lang.String MIMETYPE_TEXT_SUBRIP = "application/x-subrip"; field public static final java.lang.String MIMETYPE_TEXT_VTT = "text/vtt"; + field public static final java.lang.String MIMETYPE_VIDEO_AV1 = "video/av01"; field public static final java.lang.String MIMETYPE_VIDEO_AVC = "video/avc"; field public static final java.lang.String MIMETYPE_VIDEO_DOLBY_VISION = "video/dolby-vision"; field public static final java.lang.String MIMETYPE_VIDEO_H263 = "video/3gpp"; @@ -25705,6 +25797,7 @@ package android.media { field public static final int VOICE_CALL = 4; // 0x4 field public static final int VOICE_COMMUNICATION = 7; // 0x7 field public static final int VOICE_DOWNLINK = 3; // 0x3 + field public static final int VOICE_PERFORMANCE = 10; // 0xa field public static final int VOICE_RECOGNITION = 6; // 0x6 field public static final int VOICE_UPLINK = 2; // 0x2 } @@ -41736,6 +41829,7 @@ package android.service.voice { field public static final int SHOW_SOURCE_ACTIVITY = 16; // 0x10 field public static final int SHOW_SOURCE_APPLICATION = 8; // 0x8 field public static final int SHOW_SOURCE_ASSIST_GESTURE = 4; // 0x4 + field public static final int SHOW_SOURCE_AUTOMOTIVE_SYSTEM_UI = 128; // 0x80 field public static final int SHOW_SOURCE_NOTIFICATION = 64; // 0x40 field public static final int SHOW_SOURCE_PUSH_TO_TALK = 32; // 0x20 field public static final int SHOW_WITH_ASSIST = 1; // 0x1 @@ -48252,6 +48346,7 @@ package android.util { field public int data; field public int density; field public int resourceId; + field public int sourceStyleResourceId; field public java.lang.CharSequence string; field public int type; } @@ -53013,19 +53108,8 @@ package android.view.inspector { ctor public InspectionCompanion.UninitializedPropertyMapException(); } - public final class IntEnumMapping { - method public java.lang.String nameOf(int); - } - - public static final class IntEnumMapping.Builder { - ctor public IntEnumMapping.Builder(); - method public android.view.inspector.IntEnumMapping.Builder addValue(java.lang.String, int); - method public android.view.inspector.IntEnumMapping build(); - method public void clear(); - } - public final class IntFlagMapping { - method public java.lang.String[] namesOf(int); + method public java.util.Set<java.lang.String> get(int); } public static final class IntFlagMapping.Builder { @@ -53033,7 +53117,6 @@ package android.view.inspector { method public android.view.inspector.IntFlagMapping.Builder addFlag(java.lang.String, int); method public android.view.inspector.IntFlagMapping.Builder addFlag(java.lang.String, int, int); method public android.view.inspector.IntFlagMapping build(); - method public void clear(); } public abstract interface PropertyMapper { @@ -53045,7 +53128,7 @@ package android.view.inspector { method public abstract int mapFloat(java.lang.String, int); method public abstract int mapGravity(java.lang.String, int); method public abstract int mapInt(java.lang.String, int); - method public abstract int mapIntEnum(java.lang.String, int, android.view.inspector.IntEnumMapping); + method public abstract int mapIntEnum(java.lang.String, int, android.util.SparseArray<java.lang.String>); method public abstract int mapIntFlag(java.lang.String, int, android.view.inspector.IntFlagMapping); method public abstract int mapLong(java.lang.String, int); method public abstract int mapObject(java.lang.String, int); @@ -54252,6 +54335,8 @@ package android.webkit { method public static java.lang.ClassLoader getWebViewClassLoader(); method public android.webkit.WebViewClient getWebViewClient(); method public android.os.Looper getWebViewLooper(); + method public android.webkit.WebViewRenderer getWebViewRenderer(); + method public android.webkit.WebViewRendererClient getWebViewRendererClient(); method public void goBack(); method public void goBackOrForward(int); method public void goForward(); @@ -54301,6 +54386,8 @@ package android.webkit { method public void setWebChromeClient(android.webkit.WebChromeClient); method public static void setWebContentsDebuggingEnabled(boolean); method public void setWebViewClient(android.webkit.WebViewClient); + method public void setWebViewRendererClient(java.util.concurrent.Executor, android.webkit.WebViewRendererClient); + method public void setWebViewRendererClient(android.webkit.WebViewRendererClient); method public deprecated boolean shouldDelayChildPressedState(); method public deprecated boolean showFindDialog(java.lang.String, boolean); method public static void startSafeBrowsing(android.content.Context, android.webkit.ValueCallback<java.lang.Boolean>); @@ -54416,6 +54503,16 @@ package android.webkit { method public android.webkit.WebView getWebView(); } + public abstract class WebViewRenderer { + method public abstract boolean terminate(); + } + + public abstract class WebViewRendererClient { + ctor public WebViewRendererClient(); + method public abstract void onRendererResponsive(android.webkit.WebView, android.webkit.WebViewRenderer); + method public abstract void onRendererUnresponsive(android.webkit.WebView, android.webkit.WebViewRenderer); + } + } package android.widget { diff --git a/api/system-current.txt b/api/system-current.txt index 83d1da7619fc..ed53fcf89963 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -128,6 +128,7 @@ package android { field public static final java.lang.String QUERY_TIME_ZONE_RULES = "android.permission.QUERY_TIME_ZONE_RULES"; field public static final java.lang.String READ_CELL_BROADCASTS = "android.permission.READ_CELL_BROADCASTS"; field public static final java.lang.String READ_CONTENT_RATING_SYSTEMS = "android.permission.READ_CONTENT_RATING_SYSTEMS"; + field public static final java.lang.String READ_DEVICE_CONFIG = "android.permission.READ_DEVICE_CONFIG"; field public static final java.lang.String READ_DREAM_STATE = "android.permission.READ_DREAM_STATE"; field public static final java.lang.String READ_INSTALL_SESSIONS = "android.permission.READ_INSTALL_SESSIONS"; field public static final java.lang.String READ_NETWORK_USAGE_HISTORY = "android.permission.READ_NETWORK_USAGE_HISTORY"; @@ -184,6 +185,7 @@ package android { field public static final java.lang.String UPDATE_TIME_ZONE_RULES = "android.permission.UPDATE_TIME_ZONE_RULES"; field public static final java.lang.String USER_ACTIVITY = "android.permission.USER_ACTIVITY"; field public static final java.lang.String USE_RESERVED_DISK = "android.permission.USE_RESERVED_DISK"; + field public static final java.lang.String WRITE_DEVICE_CONFIG = "android.permission.WRITE_DEVICE_CONFIG"; field public static final java.lang.String WRITE_DREAM_STATE = "android.permission.WRITE_DREAM_STATE"; field public static final java.lang.String WRITE_EMBEDDED_SUBSCRIPTIONS = "android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS"; field public static final java.lang.String WRITE_MEDIA_STORAGE = "android.permission.WRITE_MEDIA_STORAGE"; @@ -195,6 +197,7 @@ package android { } public static final class R.array { + field public static final int config_defaultRoleHolders = 17235974; // 0x1070006 field public static final int config_keySystemUuidMapping = 17235973; // 0x1070005 } @@ -1559,6 +1562,7 @@ package android.content.pm { 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_CONFIGURATOR = 524288; // 0x80000 field public static final int PROTECTION_FLAG_DOCUMENTER = 262144; // 0x40000 field public static final int PROTECTION_FLAG_OEM = 16384; // 0x4000 field public static final int PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER = 65536; // 0x10000 @@ -3301,6 +3305,7 @@ package android.media { } public final class MediaRecorder.AudioSource { + field public static final int ECHO_REFERENCE = 1997; // 0x7cd field public static final int HOTWORD = 1999; // 0x7cf field public static final int RADIO_TUNER = 1998; // 0x7ce } @@ -8499,6 +8504,8 @@ package android.webkit { method public abstract int getVisibleTitleHeight(); method public abstract android.webkit.WebChromeClient getWebChromeClient(); method public abstract android.webkit.WebViewClient getWebViewClient(); + method public abstract android.webkit.WebViewRenderer getWebViewRenderer(); + method public abstract android.webkit.WebViewRendererClient getWebViewRendererClient(); method public abstract android.view.View getZoomControls(); method public abstract void goBack(); method public abstract void goBackOrForward(int); @@ -8548,6 +8555,7 @@ package android.webkit { method public abstract void setVerticalScrollbarOverlay(boolean); method public abstract void setWebChromeClient(android.webkit.WebChromeClient); method public abstract void setWebViewClient(android.webkit.WebViewClient); + method public abstract void setWebViewRendererClient(java.util.concurrent.Executor, android.webkit.WebViewRendererClient); method public abstract boolean showFindDialog(java.lang.String, boolean); method public abstract void stopLoading(); method public abstract boolean zoomBy(float); diff --git a/api/test-current.txt b/api/test-current.txt index 6ddb341191cb..5fcbb5e375e7 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -420,6 +420,7 @@ package android.content.pm { } public class PermissionInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable { + 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_OEM = 16384; // 0x4000 field public static final int PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER = 65536; // 0x10000 @@ -579,6 +580,8 @@ package android.hardware.display { public final class BrightnessConfiguration implements android.os.Parcelable { method public int describeContents(); + method public android.hardware.display.BrightnessCorrection getCorrectionByCategory(int); + method public android.hardware.display.BrightnessCorrection getCorrectionByPackageName(java.lang.String); method public android.util.Pair<float[], float[]> getCurve(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.hardware.display.BrightnessConfiguration> CREATOR; @@ -586,10 +589,22 @@ package android.hardware.display { public static class BrightnessConfiguration.Builder { ctor public BrightnessConfiguration.Builder(float[], float[]); + method public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByCategory(int, android.hardware.display.BrightnessCorrection); + method public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByPackageName(java.lang.String, android.hardware.display.BrightnessCorrection); method public android.hardware.display.BrightnessConfiguration build(); + method public int getMaxCorrectionsByCategory(); + method public int getMaxCorrectionsByPackageName(); method public android.hardware.display.BrightnessConfiguration.Builder setDescription(java.lang.String); } + public final class BrightnessCorrection implements android.os.Parcelable { + method public float apply(float); + method public static android.hardware.display.BrightnessCorrection createScaleAndTranslateLog(float, float); + method public int describeContents(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.hardware.display.BrightnessCorrection> CREATOR; + } + public final class DisplayManager { method public java.util.List<android.hardware.display.AmbientBrightnessDayStats> getAmbientBrightnessStats(); method public android.hardware.display.BrightnessConfiguration getBrightnessConfiguration(); diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 453a0c033a18..7e2df275515e 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -26,6 +26,7 @@ import "frameworks/base/core/proto/android/app/settings_enums.proto"; import "frameworks/base/core/proto/android/app/job/enums.proto"; import "frameworks/base/core/proto/android/bluetooth/enums.proto"; import "frameworks/base/core/proto/android/bluetooth/hci/enums.proto"; +import "frameworks/base/core/proto/android/bluetooth/hfp/enums.proto"; import "frameworks/base/core/proto/android/net/networkcapabilities.proto"; import "frameworks/base/core/proto/android/os/enums.proto"; import "frameworks/base/core/proto/android/server/connectivity/data_stall_event.proto"; @@ -185,6 +186,8 @@ message Atom { SignedConfigReported signed_config_reported = 123; GnssNiEventReported gnss_ni_event_reported = 124; BluetoothLinkLayerConnectionEvent bluetooth_link_layer_connection_event = 125; + BluetoothAclConnectionStateChanged bluetooth_acl_connection_state_changed = 126; + BluetoothScoConnectionStateChanged bluetooth_sco_connection_state_changed = 127; } // Pulled events will start at field 10000. @@ -1300,10 +1303,12 @@ message BluetoothEnabledStateChanged { } /** - * Logs when a Bluetooth device connects and disconnects. + * Logs when profiles on a Bluetooth device connects and disconnects. * * Logged from: - * packages/apps/Bluetooth/src/com/android/bluetooth/btservice/AdapterProperties.java + * packages/apps/Bluetooth/src/com/android/bluetooth/btservice/RemoteDevices.java + * + * Next Tag: 5 */ message BluetoothConnectionStateChanged { // The state of the connection. @@ -1312,10 +1317,65 @@ message BluetoothConnectionStateChanged { // An identifier that can be used to match connect and disconnect events. // Currently is last two bytes of a hash of a device level ID and // the mac address of the bluetooth device that is connected. - optional int32 obfuscated_id = 2; + // Deprecated: use obfuscated_id instead, this one is always 0 for Q+ + optional int32 OBSOLETE_obfuscated_id = 2 [deprecated = true]; // The profile that is connected. Eg. GATT, A2DP, HEADSET. // From android.bluetooth.BluetoothAdapter.java + // Default: 0 when not used optional int32 bt_profile = 3; + // An identifier that can be used to match events for this device. + // Currently, this is a salted hash of the MAC address of this Bluetooth device. + // Salt: Randomly generated 256 bit value + // Hash algorithm: HMAC-SHA256 + // Size: 32 byte + // Default: null or empty if the device identifier is not known + optional bytes obfuscated_id = 4 [(android.os.statsd.log_mode) = MODE_BYTES]; +} + +/** + * Logs when a Bluetooth device connects and disconnects over ACL + * + * Logged from: + * packages/apps/Bluetooth/src/com/android/bluetooth/btservice/AdapterProperties.java + * + * Next Tag: 3 + */ +message BluetoothAclConnectionStateChanged { + // An identifier that can be used to match events for this device. + // Currently, this is a salted hash of the MAC address of this Bluetooth device. + // Salt: Randomly generated 256 bit value + // Hash algorithm: HMAC-SHA256 + // Size: 32 byte + // Default: null or empty if the device identifier is not known + optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES]; + // The state of the connection. + // Eg: CONNECTING, CONNECTED, DISCONNECTING, DISCONNECTED. + optional android.bluetooth.ConnectionStateEnum state = 2; +} + +/** + * Logs when a Bluetooth device connects and disconnects over SCO + * + * Logged from: + * packages/apps/Bluetooth/src/com/android/bluetooth/hfp/HeadsetStateMachine.java + * packages/apps/Bluetooth/src/com/android/bluetooth/hfp/HeadsetClientStateMachine.java + * + * Next Tag: 4 + */ +message BluetoothScoConnectionStateChanged { + // An identifier that can be used to match events for this device. + // Currently, this is a salted hash of the MAC address of this Bluetooth device. + // Salt: Randomly generated 256 bit value + // Hash algorithm: HMAC-SHA256 + // Size: 32 byte + // Default: null or empty if the device identifier is not known + optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES]; + // The state of the connection. + // Eg: CONNECTING, CONNECTED, DISCONNECTING, DISCONNECTED. + optional android.bluetooth.ConnectionStateEnum state = 2; + // Codec used for this SCO connection + // Default: UNKNOWN + optional android.bluetooth.hfp.ScoCodec codec = 3; } // Logs when there is an event affecting Bluetooth device's link layer connection. diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index d42326020323..e0b8d78ebabc 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -3705,11 +3705,16 @@ public class ActivityManager { * Returns whether switching to provided user was successful. * * @param user the user to switch to. + * + * @throws IllegalArgumentException if the user is null. * @hide */ @SystemApi @RequiresPermission(android.Manifest.permission.MANAGE_USERS) - public boolean switchUser(UserHandle user) { + public boolean switchUser(@NonNull UserHandle user) { + if (user == null) { + throw new IllegalArgumentException("UserHandle cannot be null."); + } return switchUser(user.getIdentifier()); } diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index 1f01e2698fb5..5cac0489e8df 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -320,4 +320,10 @@ public abstract class ActivityManagerInternal { /** Remove pending backup for the given userId. */ public abstract void clearPendingBackup(int userId); + + /** + * When power button is very long pressed, call this interface to do some pre-shutdown work + * like persisting database etc. + */ + public abstract void prepareForPossibleShutdown(); } diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 9247486dff40..6d7c547f7cf1 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -2168,6 +2168,74 @@ public class DevicePolicyManager { public @interface SetPrivateDnsModeResultConstants {} /** + * Activity action: Starts the administrator to get the mode for the provisioning. + * This intent may contain the following extras: + * <ul> + * <li>{@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}</li> + * <li>{@link #EXTRA_PROVISIONING_IMEI}</li> + * <li>{@link #EXTRA_PROVISIONING_SERIAL_NUMBER}</li> + * </ul> + * + * <p>The target activity should return one of the following values in + * {@link #EXTRA_PROVISIONING_MODE} as result: + * <ul> + * <li>{@link #PROVISIONING_MODE_FULLY_MANAGED_DEVICE}</li> + * <li>{@link #PROVISIONING_MODE_MANAGED_PROFILE}</li> + * <li>{@link #PROVISIONING_MODE_MANAGED_PROFILE_ON_FULLY_MANAGED_DEVICE}</li> + * </ul> + * + * <p>The target activity may also return the account that needs to be migrated from primary + * user to managed profile in case of a profile owner provisioning in + * {@link #EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE} as result. + */ + public static final String ACTION_GET_PROVISIONING_MODE = + "android.app.action.GET_PROVISIONING_MODE"; + + /** + * A string extra holding the IMEI (International Mobile Equipment Identity) of the device. + */ + public static final String EXTRA_PROVISIONING_IMEI = "android.app.extra.PROVISIONING_IMEI"; + + /** + * A string extra holding the serial number of the device. + */ + public static final String EXTRA_PROVISIONING_SERIAL_NUMBER = + "android.app.extra.PROVISIONING_SERIAL_NUMBER"; + + /** + * An intent extra holding the provisioning mode returned by the administrator. + * The value for this extra should be one of the following: + * <ul> + * <li>{@link #PROVISIONING_MODE_FULLY_MANAGED_DEVICE}</li> + * <li>{@link #PROVISIONING_MODE_MANAGED_PROFILE}</li> + * <li>{@link #PROVISIONING_MODE_MANAGED_PROFILE_ON_FULLY_MANAGED_DEVICE}</li> + * </ul> + */ + public static final String EXTRA_PROVISIONING_MODE = + "android.app.extra.PROVISIONING_MODE"; + + /** + * The provisioning mode for fully managed device. + */ + public static final int PROVISIONING_MODE_FULLY_MANAGED_DEVICE = 1; + + /** + * The provisioning mode for managed profile. + */ + public static final int PROVISIONING_MODE_MANAGED_PROFILE = 2; + + /** + * The provisioning mode for managed profile on a fully managed device. + */ + public static final int PROVISIONING_MODE_MANAGED_PROFILE_ON_FULLY_MANAGED_DEVICE = 3; + + /** + * Activity action: Starts the administrator to show policy compliance for the provisioning. + */ + public static final String ACTION_ADMIN_POLICY_COMPLIANCE = + "android.app.action.ADMIN_POLICY_COMPLIANCE"; + + /** * Return true if the given administrator component is currently active (enabled) in the system. * * @param admin The administrator component to check for. diff --git a/core/java/android/app/usage/EventList.java b/core/java/android/app/usage/EventList.java index a79ad2fc8607..aaae57e526a0 100644 --- a/core/java/android/app/usage/EventList.java +++ b/core/java/android/app/usage/EventList.java @@ -103,21 +103,4 @@ public class EventList { } return result; } - - /** - * Remove events of certain type on or after a timestamp. - * @param type The type of event to remove. - * @param timeStamp the timeStamp on or after which to remove the event. - */ - public void removeOnOrAfter(int type, long timeStamp) { - for (int i = mEvents.size() - 1; i >= 0; i--) { - UsageEvents.Event event = mEvents.get(i); - if (event.mTimeStamp < timeStamp) { - break; - } - if (event.mEventType == type) { - mEvents.remove(i); - } - } - } } diff --git a/core/java/android/app/usage/UsageEvents.java b/core/java/android/app/usage/UsageEvents.java index d7a53281bc56..2c5fe046faad 100644 --- a/core/java/android/app/usage/UsageEvents.java +++ b/core/java/android/app/usage/UsageEvents.java @@ -245,10 +245,18 @@ public final class UsageEvents implements Parcelable { public static final int FLUSH_TO_DISK = 25; /** + * An event type denoting that the device underwent a shutdown process. + * A DEVICE_SHUTDOWN event should be treated as if all started activities and foreground + * services are now stopped and no explicit {@link #ACTIVITY_STOPPED} and + * {@link #FOREGROUND_SERVICE_STOP} events will be generated for them. + */ + public static final int DEVICE_SHUTDOWN = 26; + + /** * Keep in sync with the greatest event type value. * @hide */ - public static final int MAX_EVENT_TYPE = 25; + public static final int MAX_EVENT_TYPE = 26; /** @hide */ public static final int FLAG_IS_PACKAGE_INSTANT_APP = 1 << 0; diff --git a/core/java/android/app/usage/UsageStats.java b/core/java/android/app/usage/UsageStats.java index 308180badbb8..94a2a3eaae7f 100644 --- a/core/java/android/app/usage/UsageStats.java +++ b/core/java/android/app/usage/UsageStats.java @@ -21,6 +21,7 @@ import static android.app.usage.UsageEvents.Event.ACTIVITY_PAUSED; import static android.app.usage.UsageEvents.Event.ACTIVITY_RESUMED; import static android.app.usage.UsageEvents.Event.ACTIVITY_STOPPED; import static android.app.usage.UsageEvents.Event.CONTINUING_FOREGROUND_SERVICE; +import static android.app.usage.UsageEvents.Event.DEVICE_SHUTDOWN; import static android.app.usage.UsageEvents.Event.END_OF_DAY; import static android.app.usage.UsageEvents.Event.FLUSH_TO_DISK; import static android.app.usage.UsageEvents.Event.FOREGROUND_SERVICE_START; @@ -119,12 +120,9 @@ public final class UsageStats implements Parcelable { public int mLastEvent; /** - * If an activity is visible(onStart(), onPause() states) or in foreground (onResume() state), - * it has one entry in this map. When an activity becomes invisible (onStop() or onDestroy()), - * it is removed from this map. * Key is instanceId of the activity (ActivityRecode appToken hashCode).. - * Value is this activity's last event, one of ACTIVITY_RESUMED or - * ACTIVITY_PAUSED. + * Value is this activity's last event, one of ACTIVITY_RESUMED, ACTIVITY_PAUSED or + * ACTIVITY_STOPPED. * {@hide} */ public SparseIntArray mActivities = new SparseIntArray(); @@ -560,6 +558,7 @@ public final class UsageStats implements Parcelable { mLastTimeForegroundServiceUsed = timeStamp; mForegroundServices.put(className, eventType); break; + case DEVICE_SHUTDOWN: case FLUSH_TO_DISK: // update usage of all active activities/services. if (hasForegroundActivity()) { diff --git a/core/java/android/app/usage/UsageStatsManagerInternal.java b/core/java/android/app/usage/UsageStatsManagerInternal.java index 2edad350e18e..cc3ab0025864 100644 --- a/core/java/android/app/usage/UsageStatsManagerInternal.java +++ b/core/java/android/app/usage/UsageStatsManagerInternal.java @@ -98,6 +98,12 @@ public abstract class UsageStatsManagerInternal { public abstract void prepareShutdown(); /** + * When the device power button is long pressed for 3.5 seconds, prepareForPossibleShutdown() + * is called. + */ + public abstract void prepareForPossibleShutdown(); + + /** * Returns true if the app has not been used for a certain amount of time. How much time? * Could be hours, could be days, who knows? * diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index 83563d0fd9f6..359adbdb6e24 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -55,6 +55,7 @@ public abstract class PackageManagerInternal { public static final int PACKAGE_PERMISSION_CONTROLLER = 6; public static final int PACKAGE_WELLBEING = 7; public static final int PACKAGE_DOCUMENTER = 8; + public static final int PACKAGE_CONFIGURATOR = 9; @IntDef(value = { PACKAGE_SYSTEM, PACKAGE_SETUP_WIZARD, @@ -65,6 +66,7 @@ public abstract class PackageManagerInternal { PACKAGE_PERMISSION_CONTROLLER, PACKAGE_WELLBEING, PACKAGE_DOCUMENTER, + PACKAGE_CONFIGURATOR, }) @Retention(RetentionPolicy.SOURCE) public @interface KnownPackage {} @@ -137,6 +139,12 @@ public abstract class PackageManagerInternal { public abstract void setLocationPackagesProvider(PackagesProvider provider); /** + * Set the location extra packages provider. + * @param provider The packages provider. + */ + public abstract void setLocationExtraPackagesProvider(PackagesProvider provider); + + /** * Sets the voice interaction packages provider. * @param provider The packages provider. */ diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 1ac0ab6c9e59..dbf3574aebee 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -3777,9 +3777,11 @@ public class PackageParser { ai.flags |= ApplicationInfo.FLAG_MULTIARCH; } + final boolean extractNativeLibsDefault = + owner.applicationInfo.targetSdkVersion < Build.VERSION_CODES.Q; if (sa.getBoolean( com.android.internal.R.styleable.AndroidManifestApplication_extractNativeLibs, - true)) { + extractNativeLibsDefault)) { ai.flags |= ApplicationInfo.FLAG_EXTRACT_NATIVE_LIBS; } diff --git a/core/java/android/content/pm/PermissionInfo.java b/core/java/android/content/pm/PermissionInfo.java index a3395ac9fd13..5d2cf0a7d101 100644 --- a/core/java/android/content/pm/PermissionInfo.java +++ b/core/java/android/content/pm/PermissionInfo.java @@ -203,6 +203,16 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { @TestApi public static final int PROTECTION_FLAG_DOCUMENTER = 0x40000; + /** + * Additional flag for {@link #protectionLevel}, corresponding to the + * {@code configurator} value of {@link android.R.attr#protectionLevel}. + * + * @hide + */ + @SystemApi + @TestApi + public static final int PROTECTION_FLAG_CONFIGURATOR = 0x80000; + /** @hide */ @IntDef(flag = true, prefix = { "PROTECTION_FLAG_" }, value = { @@ -222,6 +232,7 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER, PROTECTION_FLAG_WELLBEING, PROTECTION_FLAG_DOCUMENTER, + PROTECTION_FLAG_CONFIGURATOR, }) @Retention(RetentionPolicy.SOURCE) public @interface ProtectionFlags {} @@ -417,6 +428,9 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { if ((level & PermissionInfo.PROTECTION_FLAG_DOCUMENTER) != 0) { protLevel += "|documenter"; } + if ((level & PROTECTION_FLAG_CONFIGURATOR) != 0) { + protLevel += "|configurator"; + } return protLevel; } diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java index c4b315ec90c8..dcd6e2ed94c7 100644 --- a/core/java/android/content/res/Resources.java +++ b/core/java/android/content/res/Resources.java @@ -98,6 +98,12 @@ import java.util.ArrayList; * href="{@docRoot}guide/topics/resources/index.html">Application Resources</a>.</p> */ public class Resources { + /** + * The {@code null} resource ID. This denotes an invalid resource ID that is returned by the + * system when a resource is not found or the value is set to {@code @null} in XML. + */ + public static final @AnyRes int ID_NULL = 0; + static final String TAG = "Resources"; private static final Object sSync = new Object(); diff --git a/core/java/android/content/res/TypedArray.java b/core/java/android/content/res/TypedArray.java index 508626bdd869..d53834c657cc 100644 --- a/core/java/android/content/res/TypedArray.java +++ b/core/java/android/content/res/TypedArray.java @@ -19,6 +19,7 @@ package android.content.res; import android.annotation.AnyRes; import android.annotation.ColorInt; import android.annotation.Nullable; +import android.annotation.StyleRes; import android.annotation.StyleableRes; import android.annotation.UnsupportedAppUsage; import android.content.pm.ActivityInfo; @@ -63,13 +64,15 @@ public class TypedArray { } // STYLE_ prefixed constants are offsets within the typed data array. - static final int STYLE_NUM_ENTRIES = 6; + // Keep this in sync with libs/androidfw/include/androidfw/AttributeResolution.h + static final int STYLE_NUM_ENTRIES = 7; static final int STYLE_TYPE = 0; static final int STYLE_DATA = 1; static final int STYLE_ASSET_COOKIE = 2; static final int STYLE_RESOURCE_ID = 3; static final int STYLE_CHANGING_CONFIGURATIONS = 4; static final int STYLE_DENSITY = 5; + static final int SYTLE_SOURCE_STYLE_RESOURCE_ID = 6; @UnsupportedAppUsage private final Resources mResources; @@ -1098,6 +1101,31 @@ public class TypedArray { } /** + * Returns the resource ID of the style against which the specified attribute was resolved, + * otherwise returns defValue. + * + * @param index Index of attribute whose source style to retrieve. + * @param defValue Value to return if the attribute is not defined or + * not a resource. + * + * @return Attribute source style resource ID or defValue if it was not resolved in any style. + * @throws RuntimeException if the TypedArray has already been recycled. + */ + @StyleRes + public int getSourceStyleResourceId(@StyleableRes int index, @StyleRes int defValue) { + if (mRecycled) { + throw new RuntimeException("Cannot make calls to a recycled instance!"); + } + + index *= STYLE_NUM_ENTRIES; + final int resid = mData[index + SYTLE_SOURCE_STYLE_RESOURCE_ID]; + if (resid != 0) { + return resid; + } + return defValue; + } + + /** * Determines whether there is an attribute at <var>index</var>. * <p> * <strong>Note:</strong> If the attribute was set to {@code @empty} or @@ -1309,6 +1337,7 @@ public class TypedArray { data[index + STYLE_CHANGING_CONFIGURATIONS]); outValue.density = data[index + STYLE_DENSITY]; outValue.string = (type == TypedValue.TYPE_STRING) ? loadStringValueAt(index) : null; + outValue.sourceStyleResourceId = data[index + SYTLE_SOURCE_STYLE_RESOURCE_ID]; return true; } diff --git a/core/java/android/hardware/display/BrightnessConfiguration.java b/core/java/android/hardware/display/BrightnessConfiguration.java index be054297c769..8c74ddc7698c 100644 --- a/core/java/android/hardware/display/BrightnessConfiguration.java +++ b/core/java/android/hardware/display/BrightnessConfiguration.java @@ -91,9 +91,7 @@ public final class BrightnessConfiguration implements Parcelable { * * @return The matching brightness correction, or null. * - * @hide */ - @SystemApi @Nullable public BrightnessCorrection getCorrectionByPackageName(String packageName) { return mCorrectionsByPackageName.get(packageName); @@ -106,10 +104,7 @@ public final class BrightnessConfiguration implements Parcelable { * The app category. * * @return The matching brightness correction, or null. - * - * @hide */ - @SystemApi @Nullable public BrightnessCorrection getCorrectionByCategory(int category) { return mCorrectionsByCategory.get(category); @@ -416,9 +411,7 @@ public final class BrightnessConfiguration implements Parcelable { * * @return The maximum number of corrections by package name allowed. * - * @hide */ - @SystemApi public int getMaxCorrectionsByPackageName() { return MAX_CORRECTIONS_BY_PACKAGE_NAME; } @@ -428,9 +421,7 @@ public final class BrightnessConfiguration implements Parcelable { * * @return The maximum number of corrections by category allowed. * - * @hide */ - @SystemApi public int getMaxCorrectionsByCategory() { return MAX_CORRECTIONS_BY_CATEGORY; } @@ -451,9 +442,7 @@ public final class BrightnessConfiguration implements Parcelable { * Maximum number of corrections by package name exceeded (see * {@link #getMaxCorrectionsByPackageName}). * - * @hide */ - @SystemApi public Builder addCorrectionByPackageName(String packageName, BrightnessCorrection correction) { if (mCorrectionsByPackageName.size() >= getMaxCorrectionsByPackageName()) { @@ -479,9 +468,7 @@ public final class BrightnessConfiguration implements Parcelable { * Maximum number of corrections by category exceeded (see * {@link #getMaxCorrectionsByCategory}). * - * @hide */ - @SystemApi public Builder addCorrectionByCategory(@ApplicationInfo.Category int category, BrightnessCorrection correction) { if (mCorrectionsByCategory.size() >= getMaxCorrectionsByCategory()) { @@ -504,8 +491,6 @@ public final class BrightnessConfiguration implements Parcelable { /** * Builds the {@link BrightnessConfiguration}. - * - * A brightness curve <b>must</b> be set before calling this. */ public BrightnessConfiguration build() { if (mCurveLux == null || mCurveNits == null) { diff --git a/core/java/android/hardware/display/BrightnessCorrection.java b/core/java/android/hardware/display/BrightnessCorrection.java index c4e0e3b723cd..6a073ffaaa5b 100644 --- a/core/java/android/hardware/display/BrightnessCorrection.java +++ b/core/java/android/hardware/display/BrightnessCorrection.java @@ -18,6 +18,7 @@ package android.hardware.display; import android.annotation.NonNull; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; import android.util.MathUtils; @@ -41,6 +42,7 @@ import java.io.IOException; * @hide */ @SystemApi +@TestApi public final class BrightnessCorrection implements Parcelable { private static final int SCALE_AND_TRANSLATE_LOG = 1; @@ -98,6 +100,24 @@ public final class BrightnessCorrection implements Parcelable { return mImplementation.toString(); } + + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } + if (!(o instanceof BrightnessCorrection)) { + return false; + } + BrightnessCorrection other = (BrightnessCorrection) o; + return other.mImplementation.equals(mImplementation); + } + + @Override + public int hashCode() { + return mImplementation.hashCode(); + } + public static final Creator<BrightnessCorrection> CREATOR = new Creator<BrightnessCorrection>() { public BrightnessCorrection createFromParcel(Parcel in) { @@ -215,6 +235,26 @@ public final class BrightnessCorrection implements Parcelable { } @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } + if (!(o instanceof ScaleAndTranslateLog)) { + return false; + } + ScaleAndTranslateLog other = (ScaleAndTranslateLog) o; + return other.mScale == mScale && other.mTranslate == mTranslate; + } + + @Override + public int hashCode() { + int result = 1; + result = result * 31 + Float.hashCode(mScale); + result = result * 31 + Float.hashCode(mTranslate); + return result; + } + + @Override public void writeToParcel(Parcel dest) { dest.writeInt(SCALE_AND_TRANSLATE_LOG); dest.writeFloat(mScale); diff --git a/core/java/android/hardware/hdmi/HdmiControlManager.java b/core/java/android/hardware/hdmi/HdmiControlManager.java index a7734f544607..a98b31ad6a5e 100644 --- a/core/java/android/hardware/hdmi/HdmiControlManager.java +++ b/core/java/android/hardware/hdmi/HdmiControlManager.java @@ -55,6 +55,10 @@ public final class HdmiControlManager { @Nullable private final IHdmiControlService mService; + private static final int INVALID_PHYSICAL_ADDRESS = 0xFFFF; + + private int mPhysicalAddress = INVALID_PHYSICAL_ADDRESS; + /** * Broadcast Action: Display OSD message. * <p>Send when the service has a message to display on screen for events @@ -505,14 +509,41 @@ public final class HdmiControlManager { * @hide */ public int getPhysicalAddress() { + if (mPhysicalAddress != INVALID_PHYSICAL_ADDRESS) { + return mPhysicalAddress; + } try { - return mService.getPhysicalAddress(); + mPhysicalAddress = mService.getPhysicalAddress(); + return mPhysicalAddress; } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** + * Check if the target device is connected to the current device. The + * API also returns true if the current device is the target. + * + * @param targetDevice {@link HdmiDeviceInfo} of the target device. + * @return true if {@code device} is directly or indirectly connected to the + * + * TODO(b/110094868): unhide for Q + * @hide + */ + public boolean isTargetDeviceConnected(HdmiDeviceInfo targetDevice) { + mPhysicalAddress = getPhysicalAddress(); + if (mPhysicalAddress == INVALID_PHYSICAL_ADDRESS) { + return false; + } + int targetPhysicalAddress = targetDevice.getPhysicalAddress(); + if (targetPhysicalAddress == INVALID_PHYSICAL_ADDRESS) { + return false; + } + return HdmiUtils.getLocalPortFromPhysicalAddress(targetPhysicalAddress, mPhysicalAddress) + != HdmiUtils.TARGET_NOT_UNDER_LOCAL_DEVICE; + } + + /** * Listener used to get hotplug event from HDMI port. */ public interface HotplugEventListener { diff --git a/core/java/android/hardware/hdmi/HdmiUtils.java b/core/java/android/hardware/hdmi/HdmiUtils.java new file mode 100644 index 000000000000..308173816f13 --- /dev/null +++ b/core/java/android/hardware/hdmi/HdmiUtils.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2014 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.hardware.hdmi; + +/** + * Various utilities to handle HDMI CEC messages. + * + * TODO(b/110094868): unhide for Q + * @hide + */ +public class HdmiUtils { + + /** + * Return value of {@link #getLocalPortFromPhysicalAddress(int, int)} + */ + static final int TARGET_NOT_UNDER_LOCAL_DEVICE = -1; + static final int TARGET_SAME_PHYSICAL_ADDRESS = 0; + + private HdmiUtils() { /* cannot be instantiated */ } + + /** + * Method to parse target physical address to the port number on the current device. + * + * <p>This check assumes target address is valid. + * + * @param targetPhysicalAddress is the physical address of the target device + * @param myPhysicalAddress is the physical address of the current device + * @return + * If the target device is under the current device, return the port number of current device + * that the target device is connected to. This also applies to the devices that are indirectly + * connected to the current device. + * + * <p>If the target device has the same physical address as the current device, return + * {@link #TARGET_SAME_PHYSICAL_ADDRESS}. + * + * <p>If the target device is not under the current device, return + * {@link #TARGET_NOT_UNDER_LOCAL_DEVICE}. + */ + public static int getLocalPortFromPhysicalAddress( + int targetPhysicalAddress, int myPhysicalAddress) { + if (myPhysicalAddress == targetPhysicalAddress) { + return TARGET_SAME_PHYSICAL_ADDRESS; + } + + int mask = 0xF000; + int finalMask = 0xF000; + int maskedAddress = myPhysicalAddress; + + while (maskedAddress != 0) { + maskedAddress = myPhysicalAddress & mask; + finalMask |= mask; + mask >>= 4; + } + + int portAddress = targetPhysicalAddress & finalMask; + if ((portAddress & (finalMask << 4)) != myPhysicalAddress) { + return TARGET_NOT_UNDER_LOCAL_DEVICE; + } + + mask <<= 4; + int port = portAddress & mask; + while ((port >> 4) != 0) { + port >>= 4; + } + return port; + } +} diff --git a/core/java/android/net/IpPrefixParcelable.aidl b/core/java/android/net/IpPrefixParcelable.aidl new file mode 100644 index 000000000000..93a8d41936cc --- /dev/null +++ b/core/java/android/net/IpPrefixParcelable.aidl @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2019 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.net; + +parcelable IpPrefixParcelable { + String address; + int prefixLength; +}
\ No newline at end of file diff --git a/core/java/android/net/LinkAddressParcelable.aidl b/core/java/android/net/LinkAddressParcelable.aidl new file mode 100644 index 000000000000..af8e79b21f69 --- /dev/null +++ b/core/java/android/net/LinkAddressParcelable.aidl @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2019 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.net; + +parcelable LinkAddressParcelable { + String address; + int prefixLength; + int flags; + int scope; +}
\ No newline at end of file diff --git a/core/java/android/net/LinkPropertiesParcelable.aidl b/core/java/android/net/LinkPropertiesParcelable.aidl new file mode 100644 index 000000000000..b153dc70e1b8 --- /dev/null +++ b/core/java/android/net/LinkPropertiesParcelable.aidl @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2019 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.net; + +import android.net.IpPrefixParcelable; +import android.net.LinkAddressParcelable; +import android.net.ProxyInfoParcelable; +import android.net.RouteInfoParcelable; + +parcelable LinkPropertiesParcelable { + String ifaceName; + LinkAddressParcelable[] linkAddresses; + String[] dnses; + String[] pcscfs; + String[] validatedPrivateDnses; + boolean usePrivateDns; + String privateDnsServerName; + String domains; + RouteInfoParcelable[] routes; + ProxyInfoParcelable httpProxy; + int mtu; + String tcpBufferSizes; + IpPrefixParcelable nat64Prefix; + LinkPropertiesParcelable[] stackedLinks; +}
\ No newline at end of file diff --git a/core/java/android/net/ProxyInfoParcelable.aidl b/core/java/android/net/ProxyInfoParcelable.aidl new file mode 100644 index 000000000000..59fd8467b820 --- /dev/null +++ b/core/java/android/net/ProxyInfoParcelable.aidl @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2019 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.net; + +parcelable ProxyInfoParcelable { + String host; + int port; + String[] exclusionList; + String pacFileUrl; +} diff --git a/core/java/android/net/RouteInfoParcelable.aidl b/core/java/android/net/RouteInfoParcelable.aidl new file mode 100644 index 000000000000..15bcdcfc2000 --- /dev/null +++ b/core/java/android/net/RouteInfoParcelable.aidl @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2019 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.net; + +import android.net.IpPrefixParcelable; + +parcelable RouteInfoParcelable { + IpPrefixParcelable destination; + String gatewayAddr; + String ifaceName; + int type; +} diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java index b0b8f493e98a..f51ba9a41a2b 100644 --- a/core/java/android/os/GraphicsEnvironment.java +++ b/core/java/android/os/GraphicsEnvironment.java @@ -306,9 +306,18 @@ public class GraphicsEnvironment { String packageName, String paths, String devOptIn) { - // Check for temporary rules if debuggable or root - if (!isDebuggable(context) && !(getCanLoadSystemLibraries() == 1)) { - Log.v(TAG, "Skipping loading temporary rules file"); + /** + * We only want to load a temp rules file for: + * - apps that are marked 'debuggable' in their manifest + * - devices that are running a userdebug build (ro.debuggable) or can inject libraries for + * debugging (PR_SET_DUMPABLE). + */ + boolean appIsDebuggable = isDebuggable(context); + boolean deviceIsDebuggable = getCanLoadSystemLibraries() == 1; + if (!(appIsDebuggable || deviceIsDebuggable)) { + Log.v(TAG, "Skipping loading temporary rules file: " + + "appIsDebuggable = " + appIsDebuggable + ", " + + "adbRootEnabled = " + deviceIsDebuggable); return false; } @@ -480,21 +489,36 @@ public class GraphicsEnvironment { return; } - if (getGlobalSettingsString(coreSettings, Settings.Global.GUP_DEV_OPT_OUT_APPS) - .contains(ai.packageName)) { + // GUP_DEV_ALL_APPS + // 0: Default (Invalid values fallback to default as well) + // 1: All apps use Game Update Package + // 2: All apps use system graphics driver + int gupDevAllApps = coreSettings.getInt(Settings.Global.GUP_DEV_ALL_APPS, 0); + if (gupDevAllApps == 2) { if (DEBUG) { - Log.w(TAG, ai.packageName + " opts out from GUP."); + Log.w(TAG, "GUP is turned off on this device"); } return; } - if (!getGlobalSettingsString(coreSettings, Settings.Global.GUP_DEV_OPT_IN_APPS) - .contains(ai.packageName) - && !onWhitelist(context, driverPackageName, ai.packageName)) { - if (DEBUG) { - Log.w(TAG, ai.packageName + " is not on the whitelist."); + if (gupDevAllApps != 1) { + // GUP_DEV_OPT_OUT_APPS has higher priority than GUP_DEV_OPT_IN_APPS + if (getGlobalSettingsString(coreSettings, Settings.Global.GUP_DEV_OPT_OUT_APPS) + .contains(ai.packageName)) { + if (DEBUG) { + Log.w(TAG, ai.packageName + " opts out from GUP."); + } + return; + } + + if (!getGlobalSettingsString(coreSettings, Settings.Global.GUP_DEV_OPT_IN_APPS) + .contains(ai.packageName) + && !onWhitelist(context, driverPackageName, ai.packageName)) { + if (DEBUG) { + Log.w(TAG, ai.packageName + " is not on the whitelist."); + } + return; } - return; } ApplicationInfo driverInfo; diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java index c79589577366..44cb2212cd0c 100644 --- a/core/java/android/provider/DeviceConfig.java +++ b/core/java/android/provider/DeviceConfig.java @@ -16,9 +16,13 @@ package android.provider; +import static android.Manifest.permission.READ_DEVICE_CONFIG; +import static android.Manifest.permission.WRITE_DEVICE_CONFIG; + import android.annotation.CallbackExecutor; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.app.ActivityThread; import android.content.ContentResolver; @@ -78,6 +82,7 @@ public final class DeviceConfig { * @hide */ @SystemApi + @RequiresPermission(READ_DEVICE_CONFIG) public static String getProperty(String namespace, String name) { ContentResolver contentResolver = ActivityThread.currentApplication().getContentResolver(); String compositeName = createCompositeName(namespace, name); @@ -105,6 +110,7 @@ public final class DeviceConfig { * @hide */ @SystemApi + @RequiresPermission(WRITE_DEVICE_CONFIG) public static boolean setProperty( String namespace, String name, String value, boolean makeDefault) { ContentResolver contentResolver = ActivityThread.currentApplication().getContentResolver(); @@ -125,6 +131,7 @@ public final class DeviceConfig { * @hide */ @SystemApi + @RequiresPermission(WRITE_DEVICE_CONFIG) public static void resetToDefaults(@ResetMode int resetMode, @Nullable String namespace) { ContentResolver contentResolver = ActivityThread.currentApplication().getContentResolver(); Settings.Config.resetToDefaults(contentResolver, resetMode, namespace); @@ -146,10 +153,12 @@ public final class DeviceConfig { * @hide */ @SystemApi + @RequiresPermission(READ_DEVICE_CONFIG) public static void addOnPropertyChangedListener( @NonNull String namespace, @NonNull @CallbackExecutor Executor executor, @NonNull OnPropertyChangedListener onPropertyChangedListener) { + // TODO enforce READ_DEVICE_CONFIG permission synchronized (sLock) { Pair<String, Executor> oldNamespace = sListeners.get(onPropertyChangedListener); if (oldNamespace == null) { diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 39c4266e4cf8..b39d871c8637 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -7391,6 +7391,14 @@ public final class Settings { private static final Validator DOZE_DOUBLE_TAP_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR; /** + * Whether the device should respond to the SLPI tap gesture. + * @hide + */ + public static final String DOZE_TAP_SCREEN_GESTURE = "doze_tap_gesture"; + + private static final Validator DOZE_TAP_SCREEN_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR; + + /** * Gesture that wakes up the lock screen. * @hide */ @@ -7724,6 +7732,23 @@ public final class Settings { public static final String TV_INPUT_CUSTOM_LABELS = "tv_input_custom_labels"; /** + * Whether TV app uses non-system inputs. + * + * <p> + * The value is boolean (1 or 0), where 1 means non-system TV inputs are allowed, + * and 0 means non-system TV inputs are not allowed. + * + * <p> + * Devices such as sound bars may have changed the system property allow_third_party_inputs + * to false so the TV Application only uses HDMI and other built in inputs. This setting + * allows user to override the default and have the TV Application use third party TV inputs + * available on play store. + * + * @hide + */ + public static final String TV_APP_USES_NON_SYSTEM_INPUTS = "tv_app_uses_non_system_inputs"; + + /** * Whether automatic routing of system audio to USB audio peripheral is disabled. * The value is boolean (1 or 0), where 1 means automatic routing is disabled, * and 0 means automatic routing is enabled. @@ -8461,6 +8486,7 @@ public final class Settings { DOZE_ALWAYS_ON, DOZE_PICK_UP_GESTURE, DOZE_DOUBLE_TAP_GESTURE, + DOZE_TAP_SCREEN_GESTURE, DOZE_WAKE_LOCK_SCREEN_GESTURE, DOZE_WAKE_SCREEN_GESTURE, NFC_PAYMENT_DEFAULT_COMPONENT, @@ -8617,6 +8643,7 @@ public final class Settings { VALIDATORS.put(DOZE_ALWAYS_ON, DOZE_ALWAYS_ON_VALIDATOR); VALIDATORS.put(DOZE_PICK_UP_GESTURE, DOZE_PICK_UP_GESTURE_VALIDATOR); VALIDATORS.put(DOZE_DOUBLE_TAP_GESTURE, DOZE_DOUBLE_TAP_GESTURE_VALIDATOR); + VALIDATORS.put(DOZE_TAP_SCREEN_GESTURE, DOZE_TAP_SCREEN_GESTURE_VALIDATOR); VALIDATORS.put(DOZE_WAKE_LOCK_SCREEN_GESTURE, DOZE_WAKE_LOCK_SCREEN_GESTURE_VALIDATOR); VALIDATORS.put(DOZE_WAKE_SCREEN_GESTURE, DOZE_WAKE_SCREEN_GESTURE_VALIDATOR); VALIDATORS.put(NFC_PAYMENT_DEFAULT_COMPONENT, NFC_PAYMENT_DEFAULT_COMPONENT_VALIDATOR); @@ -11606,6 +11633,7 @@ public final class Settings { * battery_level_collection_delay_ms (long) * max_history_files (int) * max_history_buffer_kb (int) + * battery_charged_delay_ms (int) * </pre> * * <p> @@ -11991,22 +12019,33 @@ public final class Settings { "angle_gl_driver_selection_values"; /** - * List of Apps selected to use Game Update Packages. + * Game Update Package global preference for all Apps. + * 0 = Default + * 1 = All Apps use Game Update Package + * 2 = All Apps use system graphics driver + * @hide + */ + public static final String GUP_DEV_ALL_APPS = "gup_dev_all_apps"; + + /** + * List of Apps selected to use Game Update Package. + * i.e. <pkg1>,<pkg2>,...,<pkgN> * @hide */ public static final String GUP_DEV_OPT_IN_APPS = "gup_dev_opt_in_apps"; /** - * List of Apps selected not to use Game Update Packages. + * List of Apps selected not to use Game Update Package. + * i.e. <pkg1>,<pkg2>,...,<pkgN> * @hide */ public static final String GUP_DEV_OPT_OUT_APPS = "gup_dev_opt_out_apps"; /** - * Apps on the black list that are forbidden to useGame Update Package. + * Apps on the blacklist that are forbidden to use Game Update Package. * @hide */ - public static final String GUP_BLACK_LIST = "gup_black_list"; + public static final String GUP_BLACKLIST = "gup_blacklist"; /** * Ordered GPU debug layer list for Vulkan @@ -14087,7 +14126,7 @@ public final class Settings { * * @hide */ - // TODO(b/117663715): require a new read permission + @RequiresPermission(Manifest.permission.READ_DEVICE_CONFIG) static String getString(ContentResolver resolver, String name) { return sNameValueCache.getStringForUser(resolver, name, resolver.getUserId()); } @@ -14110,8 +14149,7 @@ public final class Settings { * * @hide */ - // TODO(b/117663715): require a new write permission restricted to a single source - @RequiresPermission(Manifest.permission.WRITE_SECURE_SETTINGS) + @RequiresPermission(Manifest.permission.WRITE_DEVICE_CONFIG) static boolean putString(@NonNull ContentResolver resolver, @NonNull String name, @Nullable String value, boolean makeDefault) { return sNameValueCache.putStringForUser(resolver, name, value, null, makeDefault, @@ -14133,7 +14171,7 @@ public final class Settings { * @hide */ // TODO(b/117663715): require a new write permission restricted to a single source - @RequiresPermission(Manifest.permission.WRITE_SECURE_SETTINGS) + @RequiresPermission(Manifest.permission.WRITE_DEVICE_CONFIG) static void resetToDefaults(@NonNull ContentResolver resolver, @ResetMode int resetMode, @Nullable String prefix) { try { diff --git a/core/java/android/service/voice/VoiceInteractionSession.java b/core/java/android/service/voice/VoiceInteractionSession.java index 163e3d5fab56..6f274477431f 100644 --- a/core/java/android/service/voice/VoiceInteractionSession.java +++ b/core/java/android/service/voice/VoiceInteractionSession.java @@ -121,6 +121,12 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall */ public static final int SHOW_SOURCE_NOTIFICATION = 1 << 6; + /** + * Flag for use with {@link #onShow}: indicates that the voice interaction service was invoked + * from an Android automotive system Ui. + */ + public static final int SHOW_SOURCE_AUTOMOTIVE_SYSTEM_UI = 1 << 7; + final Context mContext; final HandlerCaller mHandlerCaller; diff --git a/core/java/android/util/TypedValue.java b/core/java/android/util/TypedValue.java index ea4464daf1e2..99106bedb314 100644 --- a/core/java/android/util/TypedValue.java +++ b/core/java/android/util/TypedValue.java @@ -216,6 +216,12 @@ public class TypedValue { * */ public int density; + /** + * If the Value came from a style resource, this holds the corresponding style resource id + * against which the attribute was resolved. + */ + public int sourceStyleResourceId; + /* ------------------------------------------------------------ */ /** Return the data for this value as a float. Only use for values diff --git a/core/java/android/view/LayoutInflater.java b/core/java/android/view/LayoutInflater.java index ffd4156b5bfd..878b6b642f7d 100644 --- a/core/java/android/view/LayoutInflater.java +++ b/core/java/android/view/LayoutInflater.java @@ -29,6 +29,7 @@ import android.graphics.Canvas; import android.os.Build; import android.os.Handler; import android.os.Message; +import android.os.SystemProperties; import android.os.Trace; import android.util.AttributeSet; import android.util.Log; @@ -38,6 +39,9 @@ import android.widget.FrameLayout; import com.android.internal.R; +import dalvik.system.PathClassLoader; +import java.io.File; +import java.lang.reflect.Method; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -72,6 +76,10 @@ public abstract class LayoutInflater { private static final String TAG = LayoutInflater.class.getSimpleName(); private static final boolean DEBUG = false; + private static final String USE_PRECOMPILED_LAYOUT_SYSTEM_PROPERTY + = "view.precompiled_layout_enabled"; + private static final String COMPILED_VIEW_DEX_FILE_NAME = "/compiled_view.dex"; + /** Empty stack trace used to avoid log spam in re-throw exceptions. */ private static final StackTraceElement[] EMPTY_STACK_TRACE = new StackTraceElement[0]; @@ -93,6 +101,13 @@ public abstract class LayoutInflater { private Factory2 mPrivateFactory; private Filter mFilter; + // Indicates whether we should try to inflate layouts using a precompiled layout instead of + // inflating from the XML resource. + private boolean mUseCompiledView; + // This variable holds the classloader that will be used to look for precompiled layouts. The + // The classloader includes the generated compiled_view.dex file. + private ClassLoader mPrecompiledClassLoader; + @UnsupportedAppUsage final Object[] mConstructorArgs = new Object[2]; @@ -223,6 +238,7 @@ public abstract class LayoutInflater { */ protected LayoutInflater(Context context) { mContext = context; + initPrecompiledViews(); } /** @@ -239,6 +255,7 @@ public abstract class LayoutInflater { mFactory2 = original.mFactory2; mPrivateFactory = original.mPrivateFactory; setFilter(original.mFilter); + initPrecompiledViews(); } /** @@ -380,6 +397,29 @@ public abstract class LayoutInflater { } } + private void initPrecompiledViews() { + try { + mUseCompiledView = + SystemProperties.getBoolean(USE_PRECOMPILED_LAYOUT_SYSTEM_PROPERTY, false); + if (mUseCompiledView) { + mPrecompiledClassLoader = mContext.getClassLoader(); + String dexFile = mContext.getCodeCacheDir() + COMPILED_VIEW_DEX_FILE_NAME; + if (new File(dexFile).exists()) { + mPrecompiledClassLoader = new PathClassLoader(dexFile, mPrecompiledClassLoader); + } else { + // If the precompiled layout file doesn't exist, then disable precompiled + // layouts. + mUseCompiledView = false; + } + } + } catch (Throwable e) { + if (DEBUG) { + Log.e(TAG, "Failed to initialized precompiled views layouts", e); + } + mUseCompiledView = false; + } + } + /** * Inflate a new view hierarchy from the specified xml resource. Throws * {@link InflateException} if there is an error. @@ -436,10 +476,14 @@ public abstract class LayoutInflater { final Resources res = getContext().getResources(); if (DEBUG) { Log.d(TAG, "INFLATING from resource: \"" + res.getResourceName(resource) + "\" (" - + Integer.toHexString(resource) + ")"); + + Integer.toHexString(resource) + ")"); } - final XmlResourceParser parser = res.getLayout(resource); + View view = tryInflatePrecompiled(resource, res, root, attachToRoot); + if (view != null) { + return view; + } + XmlResourceParser parser = res.getLayout(resource); try { return inflate(parser, root, attachToRoot); } finally { @@ -447,6 +491,73 @@ public abstract class LayoutInflater { } } + private @Nullable + View tryInflatePrecompiled(@LayoutRes int resource, Resources res, @Nullable ViewGroup root, + boolean attachToRoot) { + if (!mUseCompiledView) { + return null; + } + + Trace.traceBegin(Trace.TRACE_TAG_VIEW, "inflate (precompiled)"); + + // Try to inflate using a precompiled layout. + String pkg = res.getResourcePackageName(resource); + String layout = res.getResourceEntryName(resource); + + try { + Class clazz = mPrecompiledClassLoader.loadClass("" + pkg + ".CompiledView"); + Method inflater = clazz.getMethod(layout, Context.class, int.class); + View view = (View) inflater.invoke(null, mContext, resource); + + if (view != null && root != null) { + // We were able to use the precompiled inflater, but now we need to do some work to + // attach the view to the root correctly. + XmlResourceParser parser = res.getLayout(resource); + try { + AttributeSet attrs = Xml.asAttributeSet(parser); + advanceToRootNode(parser); + ViewGroup.LayoutParams params = root.generateLayoutParams(attrs); + + if (attachToRoot) { + root.addView(view, params); + } else { + view.setLayoutParams(params); + } + } finally { + parser.close(); + } + } + + return view; + } catch (Throwable e) { + if (DEBUG) { + Log.e(TAG, "Failed to use precompiled view", e); + } + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIEW); + } + return null; + } + + /** + * Advances the given parser to the first START_TAG. Throws InflateException if no start tag is + * found. + */ + private void advanceToRootNode(XmlPullParser parser) + throws InflateException, IOException, XmlPullParserException { + // Look for the root node. + int type; + while ((type = parser.next()) != XmlPullParser.START_TAG && + type != XmlPullParser.END_DOCUMENT) { + // Empty + } + + if (type != XmlPullParser.START_TAG) { + throw new InflateException(parser.getPositionDescription() + + ": No start tag found!"); + } + } + /** * Inflate a new view hierarchy from the specified XML node. Throws * {@link InflateException} if there is an error. @@ -480,18 +591,7 @@ public abstract class LayoutInflater { View result = root; try { - // Look for the root node. - int type; - while ((type = parser.next()) != XmlPullParser.START_TAG && - type != XmlPullParser.END_DOCUMENT) { - // Empty - } - - if (type != XmlPullParser.START_TAG) { - throw new InflateException(parser.getPositionDescription() - + ": No start tag found!"); - } - + advanceToRootNode(parser); final String name = parser.getName(); if (DEBUG) { @@ -994,82 +1094,85 @@ public abstract class LayoutInflater { + "reference. The layout ID " + value + " is not valid."); } - final XmlResourceParser childParser = context.getResources().getLayout(layout); + final View precompiled = tryInflatePrecompiled(layout, context.getResources(), + (ViewGroup) parent, /*attachToRoot=*/true); + if (precompiled == null) { + final XmlResourceParser childParser = context.getResources().getLayout(layout); - try { - final AttributeSet childAttrs = Xml.asAttributeSet(childParser); + try { + final AttributeSet childAttrs = Xml.asAttributeSet(childParser); - while ((type = childParser.next()) != XmlPullParser.START_TAG && - type != XmlPullParser.END_DOCUMENT) { - // Empty. - } + while ((type = childParser.next()) != XmlPullParser.START_TAG && + type != XmlPullParser.END_DOCUMENT) { + // Empty. + } - if (type != XmlPullParser.START_TAG) { - throw new InflateException(childParser.getPositionDescription() + - ": No start tag found!"); - } + if (type != XmlPullParser.START_TAG) { + throw new InflateException(childParser.getPositionDescription() + + ": No start tag found!"); + } - final String childName = childParser.getName(); + final String childName = childParser.getName(); - if (TAG_MERGE.equals(childName)) { - // The <merge> tag doesn't support android:theme, so - // nothing special to do here. - rInflate(childParser, parent, context, childAttrs, false); - } else { - final View view = createViewFromTag(parent, childName, - context, childAttrs, hasThemeOverride); - final ViewGroup group = (ViewGroup) parent; - - final TypedArray a = context.obtainStyledAttributes( - attrs, R.styleable.Include); - final int id = a.getResourceId(R.styleable.Include_id, View.NO_ID); - final int visibility = a.getInt(R.styleable.Include_visibility, -1); - a.recycle(); - - // We try to load the layout params set in the <include /> tag. - // If the parent can't generate layout params (ex. missing width - // or height for the framework ViewGroups, though this is not - // necessarily true of all ViewGroups) then we expect it to throw - // a runtime exception. - // We catch this exception and set localParams accordingly: true - // means we successfully loaded layout params from the <include> - // tag, false means we need to rely on the included layout params. - ViewGroup.LayoutParams params = null; - try { - params = group.generateLayoutParams(attrs); - } catch (RuntimeException e) { - // Ignore, just fail over to child attrs. - } - if (params == null) { - params = group.generateLayoutParams(childAttrs); - } - view.setLayoutParams(params); + if (TAG_MERGE.equals(childName)) { + // The <merge> tag doesn't support android:theme, so + // nothing special to do here. + rInflate(childParser, parent, context, childAttrs, false); + } else { + final View view = createViewFromTag(parent, childName, + context, childAttrs, hasThemeOverride); + final ViewGroup group = (ViewGroup) parent; + + final TypedArray a = context.obtainStyledAttributes( + attrs, R.styleable.Include); + final int id = a.getResourceId(R.styleable.Include_id, View.NO_ID); + final int visibility = a.getInt(R.styleable.Include_visibility, -1); + a.recycle(); + + // We try to load the layout params set in the <include /> tag. + // If the parent can't generate layout params (ex. missing width + // or height for the framework ViewGroups, though this is not + // necessarily true of all ViewGroups) then we expect it to throw + // a runtime exception. + // We catch this exception and set localParams accordingly: true + // means we successfully loaded layout params from the <include> + // tag, false means we need to rely on the included layout params. + ViewGroup.LayoutParams params = null; + try { + params = group.generateLayoutParams(attrs); + } catch (RuntimeException e) { + // Ignore, just fail over to child attrs. + } + if (params == null) { + params = group.generateLayoutParams(childAttrs); + } + view.setLayoutParams(params); - // Inflate all children. - rInflateChildren(childParser, view, childAttrs, true); + // Inflate all children. + rInflateChildren(childParser, view, childAttrs, true); - if (id != View.NO_ID) { - view.setId(id); - } + if (id != View.NO_ID) { + view.setId(id); + } - switch (visibility) { - case 0: - view.setVisibility(View.VISIBLE); - break; - case 1: - view.setVisibility(View.INVISIBLE); - break; - case 2: - view.setVisibility(View.GONE); - break; - } + switch (visibility) { + case 0: + view.setVisibility(View.VISIBLE); + break; + case 1: + view.setVisibility(View.INVISIBLE); + break; + case 2: + view.setVisibility(View.GONE); + break; + } - group.addView(view); + group.addView(view); + } + } finally { + childParser.close(); } - } finally { - childParser.close(); } - LayoutInflater.consumeChildElements(parser); } diff --git a/core/java/android/view/inspector/InspectableProperty.java b/core/java/android/view/inspector/InspectableProperty.java index 5b95715681fc..e2a763e22288 100644 --- a/core/java/android/view/inspector/InspectableProperty.java +++ b/core/java/android/view/inspector/InspectableProperty.java @@ -105,7 +105,6 @@ public @interface InspectableProperty { /** * One entry in an enumeration packed into a primitive {int}. * - * @see IntEnumMapping * @hide */ @Target({TYPE}) diff --git a/core/java/android/view/inspector/IntEnumMapping.java b/core/java/android/view/inspector/IntEnumMapping.java deleted file mode 100644 index 69f6dce94a81..000000000000 --- a/core/java/android/view/inspector/IntEnumMapping.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2018 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.view.inspector; - -import android.annotation.NonNull; -import android.annotation.Nullable; - -import java.util.ArrayList; - -/** - * Maps the values of an {int} property to string names for properties that encode enumerations. - * - * An {@link InspectionCompanion} may provide an instance of this class to a {@link PropertyMapper} - * for enumerations packed into primitive {int} properties. - * - * This class is immutable, and must be constructed by a {@link Builder}. - * - * @see PropertyMapper#mapIntEnum(String, int, IntEnumMapping) - */ -public final class IntEnumMapping { - private final Value[] mValues; - - /** - * Map from a property value to a string name. - * - * @param value The value of a property - * @return The name of the enumeration value, null if the value is not mapped - */ - @Nullable - public String nameOf(int value) { - for (Value valueTuple : mValues) { - if (valueTuple.mValue == value) { - return valueTuple.mName; - } - } - - return null; - } - - /** - * Create a new instance from a builder. - * - * This constructor is private, use {@link Builder#build()} instead. - * - * @param builder A builder to create from - */ - private IntEnumMapping(Builder builder) { - mValues = builder.mValues.toArray(new Value[builder.mValues.size()]); - } - - /** - * A builder for {@link IntEnumMapping} - */ - public static final class Builder { - private final ArrayList<Value> mValues; - - public Builder() { - mValues = new ArrayList<>(); - } - - /** - * Add a new entry to this mapping. - * - * @param name Name of the enumeration value - * @param value Int value of the enumeration value - * @return This builder - */ - @NonNull - public Builder addValue(@NonNull String name, int value) { - mValues.add(new Value(name, value)); - return this; - } - - /** - * Clear the builder, allowing for recycling. - */ - public void clear() { - mValues.clear(); - } - - /** - * Build a new {@link IntEnumMapping} from this builder - * - * @return A new mapping - */ - @NonNull - public IntEnumMapping build() { - return new IntEnumMapping(this); - } - } - - /** - * Inner class that holds the name and value of an enumeration value. - */ - private static final class Value { - @NonNull private final String mName; - private final int mValue; - - private Value(@NonNull String name, int value) { - mName = name; - mValue = value; - } - } -} diff --git a/core/java/android/view/inspector/IntFlagMapping.java b/core/java/android/view/inspector/IntFlagMapping.java index dcb87e18ae5e..8f7dfd5c5144 100644 --- a/core/java/android/view/inspector/IntFlagMapping.java +++ b/core/java/android/view/inspector/IntFlagMapping.java @@ -19,14 +19,20 @@ package android.view.inspector; import android.annotation.NonNull; import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; /** - * Maps the values of an {int} property to arrays of string for properties that encode flags. + * Maps the values of an {@code int} property to arrays of string for properties that encode flags. * * An {@link InspectionCompanion} may provide an instance of this class to a {@link PropertyMapper} - * for flag values packed into primitive {int} properties. + * for flag values packed into primitive {@code int} properties. * - * Each flag has a + * Each flag has a mask and a target value, for non-exclusive flags, the target can also be used as + * the mask. A given integer value is compared against each flag to find what flags are active for + * it by bitwise anding it with the mask and comparing the result against the target, that is, + * {@code (value & mask) == target}. * * This class is immutable, and must be constructed by a {@link Builder}. * @@ -42,8 +48,8 @@ public final class IntFlagMapping { * @return The names of the enabled flags */ @NonNull - public String[] namesOf(int value) { - ArrayList<String> enabledFlagNames = new ArrayList<>(mFlags.length); + public Set<String> get(int value) { + final Set<String> enabledFlagNames = new HashSet<>(mFlags.length); for (Flag flag : mFlags) { if (flag.isEnabledFor(value)) { @@ -51,7 +57,7 @@ public final class IntFlagMapping { } } - return enabledFlagNames.toArray(new String[enabledFlagNames.size()]); + return Collections.unmodifiableSet(enabledFlagNames); } /** @@ -81,7 +87,7 @@ public final class IntFlagMapping { * The target value will be used as a mask, to handle the common case where flag values * are not mutually exclusive. The flag will be considered enabled for a property value if * the result of bitwise anding the target and the value equals the target, that is: - * {(value & target) == target}. + * {@code (value & target) == target}. * * @param name The name of the flag * @param target The value to compare against @@ -97,7 +103,7 @@ public final class IntFlagMapping { * Add a new flag with a mask. * * The flag will be considered enabled for a property value if the result of bitwise anding - * the value and the mask equals the target, that is: {(value & mask) == target}. + * the value and the mask equals the target, that is: {@code (value & mask) == target}. * * @param name The name of the flag * @param target The value to compare against @@ -111,13 +117,6 @@ public final class IntFlagMapping { } /** - * Clear the builder, allowing for recycling. - */ - public void clear() { - mFlags.clear(); - } - - /** * Build a new {@link IntFlagMapping} from this builder. * * @return A new mapping @@ -143,7 +142,7 @@ public final class IntFlagMapping { } /** - * Compare the supplied property value against the mask and taget. + * Compare the supplied property value against the mask and target. * * @param value The value to check * @return True if this flag is enabled diff --git a/core/java/android/view/inspector/PropertyMapper.java b/core/java/android/view/inspector/PropertyMapper.java index 5fb291b34219..e20582bf3ee4 100644 --- a/core/java/android/view/inspector/PropertyMapper.java +++ b/core/java/android/view/inspector/PropertyMapper.java @@ -18,6 +18,7 @@ package android.view.inspector; import android.annotation.AttrRes; import android.annotation.NonNull; +import android.util.SparseArray; /** * An interface for mapping the string names of inspectable properties to integer identifiers. @@ -154,7 +155,7 @@ public interface PropertyMapper { int mapIntEnum( @NonNull String name, @AttrRes int attributeId, - @NonNull IntEnumMapping mapping); + @NonNull SparseArray<String> mapping); /** * Map a string name to an integer ID for a flag set packed into an int property. diff --git a/core/java/android/view/inspector/PropertyReader.java b/core/java/android/view/inspector/PropertyReader.java index fd83e8df6c3a..a8b7ecc3f57e 100644 --- a/core/java/android/view/inspector/PropertyReader.java +++ b/core/java/android/view/inspector/PropertyReader.java @@ -25,7 +25,13 @@ import android.graphics.Color; /** * An interface for reading the properties of an inspectable object. * - * Used as the parameter for {@link InspectionCompanion#readProperties(Object, PropertyReader)}. + * {@code PropertyReader} is defined as an interface that will be called by + * {@link InspectionCompanion#readProperties(Object, PropertyReader)}. This approach allows a + * client inspector to read the values of primitive properties without the overhead of + * instantiating a class to hold the property values for each inspection pass. If an inspectable + * remains unchanged between reading passes, it should be possible for a {@code PropertyReader} to + * avoid new allocations for subsequent reading passes. + * * It has separate methods for all primitive types to avoid autoboxing overhead if a concrete * implementation is able to work with primitives. Implementations should be prepared to accept * {null} as the value of {@link PropertyReader#readObject(int, Object)}. @@ -38,7 +44,7 @@ public interface PropertyReader { * * @param id Identifier of the property from a {@link PropertyMapper} * @param value Value of the property - * @throws PropertyTypeMismatchException If the property ID is not mapped as a {boolean} + * @throws PropertyTypeMismatchException If the property ID is not mapped as a {@code boolean} */ void readBoolean(int id, boolean value); @@ -47,7 +53,7 @@ public interface PropertyReader { * * @param id Identifier of the property from a {@link PropertyMapper} * @param value Value of the property - * @throws PropertyTypeMismatchException If the property ID is not mapped as a {byte} + * @throws PropertyTypeMismatchException If the property ID is not mapped as a {@code byte} */ void readByte(int id, byte value); @@ -56,7 +62,7 @@ public interface PropertyReader { * * @param id Identifier of the property from a {@link PropertyMapper} * @param value Value of the property - * @throws PropertyTypeMismatchException If the property ID is not mapped as a {char} + * @throws PropertyTypeMismatchException If the property ID is not mapped as a {@code char} */ void readChar(int id, char value); @@ -65,7 +71,7 @@ public interface PropertyReader { * * @param id Identifier of the property from a {@link PropertyMapper} * @param value Value of the property - * @throws PropertyTypeMismatchException If the property ID is not mapped as a {double} + * @throws PropertyTypeMismatchException If the property ID is not mapped as a {@code double} */ void readDouble(int id, double value); @@ -74,7 +80,7 @@ public interface PropertyReader { * * @param id Identifier of the property from a {@link PropertyMapper} * @param value Value of the property - * @throws PropertyTypeMismatchException If the property ID is not mapped as a {float} + * @throws PropertyTypeMismatchException If the property ID is not mapped as a {@code float} */ void readFloat(int id, float value); @@ -83,7 +89,7 @@ public interface PropertyReader { * * @param id Identifier of the property from a {@link PropertyMapper} * @param value Value of the property - * @throws PropertyTypeMismatchException If the property ID is not mapped as an {int} + * @throws PropertyTypeMismatchException If the property ID is not mapped as an {@code int} */ void readInt(int id, int value); @@ -92,7 +98,7 @@ public interface PropertyReader { * * @param id Identifier of the property from a {@link PropertyMapper} * @param value Value of the property - * @throws PropertyTypeMismatchException If the property ID is not mapped as a {long} + * @throws PropertyTypeMismatchException If the property ID is not mapped as a {@code long} */ void readLong(int id, long value); @@ -101,7 +107,7 @@ public interface PropertyReader { * * @param id Identifier of the property from a {@link PropertyMapper} * @param value Value of the property - * @throws PropertyTypeMismatchException If the property ID is not mapped as a {short} + * @throws PropertyTypeMismatchException If the property ID is not mapped as a {@code short} */ void readShort(int id, short value); diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index bad2dbfebdc5..60393502bbe7 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -16,6 +16,7 @@ package android.webkit; +import android.annotation.CallbackExecutor; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -69,6 +70,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.List; import java.util.Map; +import java.util.concurrent.Executor; /** * A View that displays web pages. @@ -1688,6 +1690,84 @@ public class WebView extends AbsoluteLayout return mProvider.getWebViewClient(); } + + /** + * Gets the WebView renderer associated with this WebView. + * + * <p>In {@link android.os.Build.VERSION_CODES#O} and above, WebView may + * run in "multiprocess" mode. In multiprocess mode, rendering of web + * content is performed by a sandboxed renderer process separate to the + * application process. This renderer process may be shared with other + * WebViews in the application, but is not shared with other application + * processes. + * + * <p>If WebView is running in multiprocess mode, this method returns a + * handle to the renderer process associated with the WebView, which can + * be used to control the renderer process. + * + * @return the {@link WebViewRenderer} renderer handle associated + * with this {@link WebView}, or {@code null} if + * WebView is not runing in multiprocess mode. + */ + @Nullable + public WebViewRenderer getWebViewRenderer() { + checkThread(); + return mProvider.getWebViewRenderer(); + } + + /** + * Sets the renderer client object associated with this WebView. + * + * <p>The renderer client encapsulates callbacks relevant to WebView renderer + * state. See {@link WebViewRendererClient} for details. + * + * <p>Although many WebView instances may share a single underlying + * renderer, and renderers may live either in the application + * process, or in a sandboxed process that is isolated from the + * application process, instances of {@link WebViewRendererClient} + * are set per-WebView. Callbacks represent renderer events from + * the perspective of this WebView, and may or may not be correlated + * with renderer events affecting other WebViews. + * + * @param executor the Executor on which {@link WebViewRendererClient} callbacks will execute. + * @param webViewRendererClient the {@link WebViewRendererClient} object. + */ + public void setWebViewRendererClient( + @NonNull @CallbackExecutor Executor executor, + @NonNull WebViewRendererClient webViewRendererClient) { + checkThread(); + mProvider.setWebViewRendererClient(executor, webViewRendererClient); + } + + /** + * Sets the renderer client object associated with this WebView. + * + * See {@link #setWebViewRendererClient(Executor,WebViewRendererClient)} for details. + * + * <p> {@link WebViewRendererClient} callbacks will run on the thread that this WebView was + * initialized on. + * + * @param webViewRendererClient the {@link WebViewRendererClient} object. + */ + public void setWebViewRendererClient( + @Nullable WebViewRendererClient webViewRendererClient) { + checkThread(); + mProvider.setWebViewRendererClient(null, webViewRendererClient); + } + + /** + * Gets the renderer client object associated with this WebView. + * + * @return the {@link WebViewRendererClient} object associated with this WebView, if one has + * been set via {@link #setWebViewRendererClient(WebViewRendererClient)} or {@code null} + * otherwise. + */ + @Nullable + public WebViewRendererClient getWebViewRendererClient() { + checkThread(); + return mProvider.getWebViewRendererClient(); + } + /** * Registers the interface to be used when content can not be handled by * the rendering engine, and should be downloaded instead. This will replace diff --git a/core/java/android/webkit/WebViewProvider.java b/core/java/android/webkit/WebViewProvider.java index 95e7a986efd2..baf582693bd8 100644 --- a/core/java/android/webkit/WebViewProvider.java +++ b/core/java/android/webkit/WebViewProvider.java @@ -54,6 +54,7 @@ import android.webkit.WebView.VisualStateCallback; import java.io.BufferedWriter; import java.io.File; import java.util.Map; +import java.util.concurrent.Executor; /** * WebView backend provider interface: this interface is the abstract backend to a WebView @@ -237,6 +238,14 @@ public interface WebViewProvider { public WebViewClient getWebViewClient(); + public WebViewRenderer getWebViewRenderer(); + + public void setWebViewRendererClient( + @Nullable Executor executor, + @Nullable WebViewRendererClient client); + + public WebViewRendererClient getWebViewRendererClient(); + public void setDownloadListener(DownloadListener listener); public void setWebChromeClient(WebChromeClient client); diff --git a/core/java/android/webkit/WebViewRenderer.java b/core/java/android/webkit/WebViewRenderer.java new file mode 100644 index 000000000000..532825485ed3 --- /dev/null +++ b/core/java/android/webkit/WebViewRenderer.java @@ -0,0 +1,45 @@ +/* + * Copyright 2019 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.webkit; + +/** + * WebViewRenderer provides an opaque handle to a {@link WebView} renderer. + */ +public abstract class WebViewRenderer { + /** + * Cause this renderer to terminate. + * + * <p>Calling this on a not yet started, or an already terminated renderer will have no effect. + * + * <p>Terminating a renderer process may have an effect on multiple {@link WebView} instances. + * + * <p>Renderer termination must be handled by properly overriding + * {@link WebViewClient#onRenderProcessGone} for every WebView that shares this + * renderer. If termination is not handled by all associated WebViews, then the application + * process will also be terminated. + * + * @return {@code true} if it was possible to terminate this renderer, {@code false} otherwise. + */ + public abstract boolean terminate(); + + /** + * This class cannot be created by applications. + * @hide + */ + public WebViewRenderer() { + } +} diff --git a/core/java/android/webkit/WebViewRendererClient.java b/core/java/android/webkit/WebViewRendererClient.java new file mode 100644 index 000000000000..2fadf54fd434 --- /dev/null +++ b/core/java/android/webkit/WebViewRendererClient.java @@ -0,0 +1,77 @@ +/* + * Copyright 2019 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.webkit; + +import android.annotation.NonNull; +import android.annotation.Nullable; + +/** + * Used to receive callbacks on {@link WebView} renderer events. + * + * WebViewRendererClient instances may be set or retrieved via {@link + * WebView#setWebViewRendererClient(WebViewRendererClient)} and {@link + * WebView#getWebViewRendererClient()}. + * + * Instances may be attached to multiple WebViews, and thus a single renderer event may cause + * a callback to be called multiple times with different WebView parameters. + */ +public abstract class WebViewRendererClient { + /** + * Called when the renderer currently associated with {@code view} becomes unresponsive as a + * result of a long running blocking task such as the execution of JavaScript. + * + * <p>If a WebView fails to process an input event, or successfully navigate to a new URL within + * a reasonable time frame, the renderer is considered to be unresponsive, and this callback + * will be called. + * + * <p>This callback will continue to be called at regular intervals as long as the renderer + * remains unresponsive. If the renderer becomes responsive again, {@link + * WebViewRendererClient#onRendererResponsive} will be called once, and this method will not + * subsequently be called unless another period of unresponsiveness is detected. + * + * <p>No action is taken by WebView as a result of this method call. Applications may + * choose to terminate the associated renderer via the object that is passed to this callback, + * if in multiprocess mode, however this must be accompanied by correctly handling + * {@link WebViewClient#onRenderProcessGone} for this WebView, and all other WebViews associated + * with the same renderer. Failure to do so will result in application termination. + * + * @param view The {@link WebView} for which unresponsiveness was detected. + * @param renderer The {@link WebViewRenderer} that has become unresponsive, + * or {@code null} if WebView is running in single process mode. + */ + public abstract void onRendererUnresponsive( + @NonNull WebView view, @Nullable WebViewRenderer renderer); + + /** + * Called once when an unresponsive renderer currently associated with {@code view} becomes + * responsive. + * + * <p>After a WebView renderer becomes unresponsive, which is notified to the application by + * {@link WebViewRendererClient#onRendererUnresponsive}, it is possible for the blocking + * renderer task to complete, returning the renderer to a responsive state. In that case, + * this method is called once to indicate responsiveness. + * + * <p>No action is taken by WebView as a result of this method call. + * + * @param view The {@link WebView} for which responsiveness was detected. + * + * @param renderer The {@link WebViewRenderer} that has become responsive, or {@code null} if + * WebView is running in single process mode. + */ + public abstract void onRendererResponsive( + @NonNull WebView view, @Nullable WebViewRenderer renderer); +} diff --git a/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java b/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java index 2995a8f43268..7a00a51647f6 100644 --- a/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java +++ b/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java @@ -58,6 +58,15 @@ public class AmbientDisplayConfiguration { return mContext.getResources().getBoolean(R.bool.config_dozePulsePickup); } + public boolean tapGestureEnabled(int user) { + return boolSettingDefaultOn(Settings.Secure.DOZE_TAP_SCREEN_GESTURE, user) + && tapSensorAvailable(); + } + + public boolean tapSensorAvailable() { + return !TextUtils.isEmpty(tapSensorType()); + } + public boolean doubleTapGestureEnabled(int user) { return boolSettingDefaultOn(Settings.Secure.DOZE_DOUBLE_TAP_GESTURE, user) && doubleTapSensorAvailable(); @@ -86,6 +95,10 @@ public class AmbientDisplayConfiguration { return mContext.getResources().getString(R.string.config_dozeDoubleTapSensorType); } + public String tapSensorType() { + return mContext.getResources().getString(R.string.config_dozeTapSensorType); + } + public String longPressSensorType() { return mContext.getResources().getString(R.string.config_dozeLongPressSensorType); } diff --git a/core/java/com/android/internal/infra/AbstractRemoteService.java b/core/java/com/android/internal/infra/AbstractRemoteService.java index 594595843ca7..72c67d7ddc08 100644 --- a/core/java/com/android/internal/infra/AbstractRemoteService.java +++ b/core/java/com/android/internal/infra/AbstractRemoteService.java @@ -139,6 +139,14 @@ public abstract class AbstractRemoteService<S extends AbstractRemoteService<S, I return mDestroyed; } + /** + * Gets the name of the service. + */ + @NonNull + public final ComponentName getComponentName() { + return mComponentName; + } + private void handleOnConnectedStateChangedInternal(boolean connected) { if (connected) { handlePendingRequests(); diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 5125f5c8c3da..17cc6afcd8f0 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -337,6 +337,25 @@ public class BatteryStatsImpl extends BatteryStats { private final PlatformIdleStateCallback mPlatformIdleStateCallback; + private final Runnable mDeferSetCharging = new Runnable() { + @Override + public void run() { + synchronized (BatteryStatsImpl.this) { + if (mOnBattery) { + // if the device gets unplugged in the time between this runnable being + // executed and the lock being taken, we don't want to set charging state + return; + } + boolean changed = setChargingLocked(true); + if (changed) { + final long uptime = mClocks.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + addHistoryRecordLocked(elapsedRealtime, uptime); + } + } + } + }; + /** * This handler is running on {@link BackgroundThread}. */ @@ -12340,6 +12359,14 @@ public class BatteryStatsImpl extends BatteryStats { } boolean setChargingLocked(boolean charging) { + // if the device is no longer charging, remove the callback + // if the device is now charging, it means that this is either called + // 1. directly when level >= 90 + // 2. or from within the runnable that we deferred + // For 1. if we have an existing callback, remove it, since we will immediatelly send a + // ACTION_CHARGING + // For 2. we remove existing callback so we don't send multiple ACTION_CHARGING + mHandler.removeCallbacks(mDeferSetCharging); if (mCharging != charging) { mCharging = charging; if (charging) { @@ -12678,12 +12705,23 @@ public class BatteryStatsImpl extends BatteryStats { // charging even if it happens to go down a level. changed |= setChargingLocked(true); mLastChargeStepLevel = level; - } if (!mCharging) { + } + if (!mCharging) { if (mLastChargeStepLevel < level) { - // We have not reporting that we are charging, but the level has now - // gone up, so consider the state to be charging. - changed |= setChargingLocked(true); + // We have not reported that we are charging, but the level has gone up, + // but we would like to not have tons of activity from charging-constraint + // jobs, so instead of reporting ACTION_CHARGING immediately, we defer it. mLastChargeStepLevel = level; + if (!mHandler.hasCallbacks(mDeferSetCharging)) { + mHandler.postDelayed( + mDeferSetCharging, + mConstants.BATTERY_CHARGED_DELAY_MS); + } + } else if (mLastChargeStepLevel > level) { + // if we had deferred a runnable due to charge level increasing, but then + // later the charge level drops (could be due to thermal issues), we don't + // want to trigger the deferred runnable, so remove it here + mHandler.removeCallbacks(mDeferSetCharging); } } else { if (mLastChargeStepLevel > level) { @@ -13300,6 +13338,8 @@ public class BatteryStatsImpl extends BatteryStats { = "battery_level_collection_delay_ms"; public static final String KEY_MAX_HISTORY_FILES = "max_history_files"; public static final String KEY_MAX_HISTORY_BUFFER_KB = "max_history_buffer_kb"; + public static final String KEY_BATTERY_CHARGED_DELAY_MS = + "battery_charged_delay_ms"; private static final boolean DEFAULT_TRACK_CPU_TIMES_BY_PROC_STATE = false; private static final boolean DEFAULT_TRACK_CPU_ACTIVE_CLUSTER_TIME = true; @@ -13312,6 +13352,7 @@ public class BatteryStatsImpl extends BatteryStats { private static final int DEFAULT_MAX_HISTORY_BUFFER_KB = 128; /*Kilo Bytes*/ private static final int DEFAULT_MAX_HISTORY_FILES_LOW_RAM_DEVICE = 64; private static final int DEFAULT_MAX_HISTORY_BUFFER_LOW_RAM_DEVICE_KB = 64; /*Kilo Bytes*/ + private static final int DEFAULT_BATTERY_CHARGED_DELAY_MS = 900000; /* 15 min */ public boolean TRACK_CPU_TIMES_BY_PROC_STATE = DEFAULT_TRACK_CPU_TIMES_BY_PROC_STATE; public boolean TRACK_CPU_ACTIVE_CLUSTER_TIME = DEFAULT_TRACK_CPU_ACTIVE_CLUSTER_TIME; @@ -13324,6 +13365,7 @@ public class BatteryStatsImpl extends BatteryStats { = DEFAULT_BATTERY_LEVEL_COLLECTION_DELAY_MS; public int MAX_HISTORY_FILES; public int MAX_HISTORY_BUFFER; /*Bytes*/ + public int BATTERY_CHARGED_DELAY_MS = DEFAULT_BATTERY_CHARGED_DELAY_MS; private ContentResolver mResolver; private final KeyValueListParser mParser = new KeyValueListParser(','); @@ -13392,6 +13434,9 @@ public class BatteryStatsImpl extends BatteryStats { DEFAULT_MAX_HISTORY_BUFFER_LOW_RAM_DEVICE_KB : DEFAULT_MAX_HISTORY_BUFFER_KB) * 1024; + BATTERY_CHARGED_DELAY_MS = mParser.getInt( + KEY_BATTERY_CHARGED_DELAY_MS, + DEFAULT_BATTERY_CHARGED_DELAY_MS); } } @@ -13449,6 +13494,8 @@ public class BatteryStatsImpl extends BatteryStats { pw.println(MAX_HISTORY_FILES); pw.print(KEY_MAX_HISTORY_BUFFER_KB); pw.print("="); pw.println(MAX_HISTORY_BUFFER/1024); + pw.print(KEY_BATTERY_CHARGED_DELAY_MS); pw.print("="); + pw.println(BATTERY_CHARGED_DELAY_MS); } } diff --git a/core/proto/android/app/settings_enums.proto b/core/proto/android/app/settings_enums.proto index 49ca378ef0e2..2148273208e5 100644 --- a/core/proto/android/app/settings_enums.proto +++ b/core/proto/android/app/settings_enums.proto @@ -97,4 +97,7 @@ enum PageId { // OPEN: Settings > System > Input & Gesture > Silence alerts SETTINGS_GESTURE_SILENCE = 1625; + + // OPEN: Settings > System > Input & Gesture > Tap to check + SETTINGS_GESTURE_TAP_SCREEN = 1626; } diff --git a/services/core/java/com/android/server/wm/StackWindowListener.java b/core/proto/android/bluetooth/hfp/enums.proto index c763c175687f..d286e4b64d67 100644 --- a/services/core/java/com/android/server/wm/StackWindowListener.java +++ b/core/proto/android/bluetooth/hfp/enums.proto @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 The Android Open Source Project + * Copyright 2018 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,18 @@ * 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.server.wm; +syntax = "proto2"; +package android.bluetooth.hfp; -import android.graphics.Rect; +option java_outer_classname = "BluetoothHfpProtoEnums"; +option java_multiple_files = true; -/** - * Interface used by the creator of {@link StackWindowController} to listen to changes with - * the stack container. - */ -public interface StackWindowListener extends WindowContainerListener { - - /** Called when the stack container would like its controller to resize. */ - void requestResize(Rect bounds); -} +enum ScoCodec { + SCO_CODEC_UNKNOWN = 0; + SCO_CODEC_CVSD = 1; + // Default codec behind Wide Band Speech + SCO_CODEC_MSBC = 2; +}
\ No newline at end of file diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto index cc5aa20258ce..415857771899 100644 --- a/core/proto/android/providers/settings/global.proto +++ b/core/proto/android/providers/settings/global.proto @@ -436,12 +436,19 @@ message GlobalSettingsProto { // Ordered GPU debug layer list for GLES // i.e. <layer1>:<layer2>:...:<layerN> optional SettingProto debug_layers_gles = 7; - // GUP - List of Apps selected to use Game Update Packages - optional SettingProto gup_dev_opt_in_apps = 8; - // GUP - List of Apps selected not to use Game Update Packages - optional SettingProto gup_dev_opt_out_apps = 9; - // GUP - List of Apps that are forbidden to use Game Update Packages - optional SettingProto gup_black_list = 10; + // GUP - Game Update Package global preference for all Apps + // 0 = Default + // 1 = All Apps use Game Update Package + // 2 = All Apps use system graphics driver + optional SettingProto gup_dev_all_apps = 8; + // GUP - List of Apps selected to use Game Update Package + // i.e. <pkg1>,<pkg2>,...,<pkgN> + optional SettingProto gup_dev_opt_in_apps = 9; + // GUP - List of Apps selected not to use Game Update Package + // i.e. <pkg1>,<pkg2>,...,<pkgN> + optional SettingProto gup_dev_opt_out_apps = 10; + // GUP - List of Apps that are forbidden to use Game Update Package + optional SettingProto gup_blacklist = 11; } optional Gpu gpu = 59; diff --git a/core/proto/android/providers/settings/secure.proto b/core/proto/android/providers/settings/secure.proto index 9f4345d4668f..4bfd4d236abb 100644 --- a/core/proto/android/providers/settings/secure.proto +++ b/core/proto/android/providers/settings/secure.proto @@ -182,6 +182,7 @@ message SecureSettingsProto { optional SettingProto pulse_on_pick_up = 3 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto pulse_on_long_press = 4 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto pulse_on_double_tap = 5 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto pulse_on_tap = 6 [ (android.privacy).dest = DEST_AUTOMATIC ]; } optional Doze doze = 21; diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 7813128d46c7..cf1f7bb2aac1 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -2532,6 +2532,16 @@ <permission android:name="android.permission.WRITE_GSERVICES" android:protectionLevel="signature|privileged" /> + <!-- @SystemApi @hide Allows an application to modify config settings. + <p>Not for use by third-party applications. --> + <permission android:name="android.permission.WRITE_DEVICE_CONFIG" + android:protectionLevel="signature|configurator"/> + + <!-- @SystemApi @hide Allows an application to read config settings. + <p>Not for use by third-party applications. --> + <permission android:name="android.permission.READ_DEVICE_CONFIG" + android:protectionLevel="signature|preinstalled" /> + <!-- @SystemApi @TestApi Allows an application to call {@link android.app.ActivityManager#forceStopPackage}. @hide --> diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index 18a42bc5ed0b..b15f72efd717 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -274,6 +274,9 @@ <!-- Additional flag from base permission type: this permission can be automatically granted to the document manager --> <flag name="documenter" value="0x40000" /> + <!-- Additional flag from base permission type: this permission automatically + granted to device configurator --> + <flag name="configurator" value="0x80000" /> </attr> <!-- Flags indicating more context for a permission group. --> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 4d20fa465479..d777b028fdb8 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1689,6 +1689,8 @@ config_enableFusedLocationOverlay is false. --> <string name="config_fusedLocationProviderPackageName" translatable="false">com.android.location.fused</string> + <string-array name="config_locationExtraPackageNames" translatable="false"></string-array> + <!-- The package name of the default network recommendation app. A network recommendation provider must: * Be granted the SCORE_NETWORKS permission. @@ -1890,6 +1892,8 @@ cell broadcasting sms, and MMS. --> <bool name="config_sms_capable">true</bool> + <!-- TODO: STOPSHIP(b/110557011): Remove this from framework and overlays as we use + config_defaultRoleHolders now. --> <!-- Default SMS Application. This will be the default SMS application when the phone first boots. The user can then change the default app to one of their choosing. @@ -1908,6 +1912,12 @@ the behavior will be as though no app was named as an explicit default. --> <string name="default_browser" translatable="false"></string> + <!-- Default role holders. This will be an array of roles and package names of their default + holders, with each item in the format of "ROLE_NAME: PACKAGE_NAME_1, PACKAGE_NAME_2". --> + <string-array name="config_defaultRoleHolders" translatable="false"> + <item>android.app.role.SMS: com.android.messaging</item> + </string-array> + <!-- Enable/disable default bluetooth profiles: HSP_AG, ObexObjectPush, Audio, NAP --> <bool name="config_bluetooth_default_profiles">true</bool> @@ -2203,6 +2213,9 @@ <!-- Type of the double tap sensor. Empty if double tap is not supported. --> <string name="config_dozeDoubleTapSensorType" translatable="false"></string> + <!-- Type of the tap sensor. Empty if tap is not supported. --> + <string name="config_dozeTapSensorType" translatable="false"></string> + <!-- Type of the long press sensor. Empty if long press is not supported. --> <string name="config_dozeLongPressSensorType" translatable="false"></string> @@ -2800,6 +2813,9 @@ <!-- Flag indicating which package name can access the persistent data partition --> <string name="config_persistentDataPackageName" translatable="false"></string> + <!-- Flag indicating which package name can access DeviceConfig table --> + <string name="config_deviceConfiguratorPackageName" translatable="false"></string> + <!-- Flag indicating apps will skip sending hold request before merge. In this case IMS service implementation will do both.i.e.hold followed by merge. --> <bool name="skipHoldBeforeMerge">true</bool> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index b3b30e992302..777886a9911c 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2985,6 +2985,11 @@ <public name="system_notification_accent_color" /> </public-group> + <public-group type="array" first-id="0x01070006"> + <!-- @hide @SystemApi --> + <public name="config_defaultRoleHolders" /> + </public-group> + <!-- =============================================================== DO NOT ADD UN-GROUPED ITEMS HERE diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index daf8b446c7bb..eb0a7a1d8b10 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1840,6 +1840,7 @@ <java-symbol type="array" name="radioAttributes" /> <java-symbol type="array" name="config_oemUsbModeOverride" /> <java-symbol type="array" name="config_locationProviderPackageNames" /> + <java-symbol type="array" name="config_locationExtraPackageNames" /> <java-symbol type="array" name="config_testLocationProviders" /> <java-symbol type="array" name="config_defaultNotificationVibePattern" /> <java-symbol type="array" name="config_notificationFallbackVibePattern" /> @@ -2139,6 +2140,7 @@ <java-symbol type="string" name="config_carrierAppInstallDialogComponent" /> <java-symbol type="string" name="config_defaultNetworkScorerPackageName" /> <java-symbol type="string" name="config_persistentDataPackageName" /> + <java-symbol type="string" name="config_deviceConfiguratorPackageName" /> <java-symbol type="layout" name="resolver_list" /> <java-symbol type="id" name="resolver_list" /> @@ -3001,6 +3003,7 @@ <java-symbol type="array" name="config_emergency_mcc_codes" /> <java-symbol type="string" name="config_dozeDoubleTapSensorType" /> + <java-symbol type="string" name="config_dozeTapSensorType" /> <java-symbol type="bool" name="config_dozePulsePickup" /> <!-- Used for MimeIconUtils. --> diff --git a/core/tests/coretests/Android.mk b/core/tests/coretests/Android.mk index 74943c7bd6dd..0fc3bd224fbf 100644 --- a/core/tests/coretests/Android.mk +++ b/core/tests/coretests/Android.mk @@ -36,12 +36,12 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ frameworks-core-util-lib \ mockwebserver \ guava \ - android-support-test \ + androidx.test.runner \ + androidx.test.rules \ mockito-target-minus-junit4 \ espresso-core \ ub-uiautomator \ platform-test-annotations \ - compatibility-device-util \ truth-prebuilt \ print-test-util-lib \ testng # TODO: remove once Android migrates to JUnit 4.12, which provide assertThrows diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml index 46d4a4773389..86818c611c1f 100644 --- a/core/tests/coretests/AndroidManifest.xml +++ b/core/tests/coretests/AndroidManifest.xml @@ -56,6 +56,7 @@ <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INJECT_EVENTS" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> + <uses-permission android:name="android.permission.READ_DEVICE_CONFIG" /> <uses-permission android:name="android.permission.READ_DREAM_STATE" /> <uses-permission android:name="android.permission.WRITE_DREAM_STATE" /> <uses-permission android:name="android.permission.READ_LOGS"/> @@ -65,6 +66,7 @@ <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> + <uses-permission android:name="android.permission.WRITE_DEVICE_CONFIG" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /> @@ -1425,7 +1427,7 @@ </application> - <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner" + <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner" android:targetPackage="com.android.frameworks.coretests" android:label="Frameworks Core Tests" /> <key-sets> diff --git a/core/tests/coretests/AndroidTest.xml b/core/tests/coretests/AndroidTest.xml index 68ef34b279e6..b40aa87cb78b 100644 --- a/core/tests/coretests/AndroidTest.xml +++ b/core/tests/coretests/AndroidTest.xml @@ -25,6 +25,7 @@ <option name="test-tag" value="FrameworksCoreTests" /> <test class="com.android.tradefed.testtype.AndroidJUnitTest" > <option name="package" value="com.android.frameworks.coretests" /> + <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" /> <option name="hidden-api-checks" value="false"/> </test> </configuration> diff --git a/core/tests/coretests/src/android/animation/AnimatorInflaterTest.java b/core/tests/coretests/src/android/animation/AnimatorInflaterTest.java index e26bdf53b872..be1d44cec6a6 100644 --- a/core/tests/coretests/src/android/animation/AnimatorInflaterTest.java +++ b/core/tests/coretests/src/android/animation/AnimatorInflaterTest.java @@ -13,18 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.animation; -import android.support.test.filters.LargeTest; import android.test.ActivityInstrumentationTestCase2; -import java.util.HashSet; -import java.util.Set; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; +import androidx.test.filters.LargeTest; import com.android.frameworks.coretests.R; +import java.util.HashSet; +import java.util.Set; + @LargeTest public class AnimatorInflaterTest extends ActivityInstrumentationTestCase2<BasicAnimatorActivity> { Set<Integer> identityHashes = new HashSet<Integer>(); diff --git a/core/tests/coretests/src/android/animation/AnimatorSetActivity.java b/core/tests/coretests/src/android/animation/AnimatorSetActivity.java index 501ea485b8b2..af265afa83e5 100644 --- a/core/tests/coretests/src/android/animation/AnimatorSetActivity.java +++ b/core/tests/coretests/src/android/animation/AnimatorSetActivity.java @@ -1,10 +1,26 @@ -package android.animation; +/* + * Copyright (C) 2015 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. + */ -import com.android.frameworks.coretests.R; +package android.animation; import android.app.Activity; import android.os.Bundle; +import com.android.frameworks.coretests.R; + public class AnimatorSetActivity extends Activity { @Override public void onCreate(Bundle savedBundleInstance) { diff --git a/core/tests/coretests/src/android/animation/AnimatorSetActivityTest.java b/core/tests/coretests/src/android/animation/AnimatorSetActivityTest.java index 922bc59d71d1..55837ba3926c 100644 --- a/core/tests/coretests/src/android/animation/AnimatorSetActivityTest.java +++ b/core/tests/coretests/src/android/animation/AnimatorSetActivityTest.java @@ -1,12 +1,29 @@ -package android.animation; +/* + * Copyright (C) 2015 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. + */ -import com.android.frameworks.coretests.R; +package android.animation; import android.test.ActivityInstrumentationTestCase2; -import android.test.UiThreadTest; -import android.test.suitebuilder.annotation.SmallTest; import android.view.View; +import androidx.test.annotation.UiThreadTest; +import androidx.test.filters.SmallTest; + +import com.android.frameworks.coretests.R; + import java.util.ArrayList; public class AnimatorSetActivityTest extends ActivityInstrumentationTestCase2<AnimatorSetActivity> { diff --git a/core/tests/coretests/src/android/animation/AnimatorSetEventsTest.java b/core/tests/coretests/src/android/animation/AnimatorSetEventsTest.java index 7eb32ee36876..4e90d1acf4a0 100644 --- a/core/tests/coretests/src/android/animation/AnimatorSetEventsTest.java +++ b/core/tests/coretests/src/android/animation/AnimatorSetEventsTest.java @@ -13,12 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.animation; import android.os.Handler; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.SmallTest; import android.widget.Button; + +import androidx.test.filters.MediumTest; + import com.android.frameworks.coretests.R; import java.util.concurrent.TimeUnit; diff --git a/core/tests/coretests/src/android/animation/AutoCancelTest.java b/core/tests/coretests/src/android/animation/AutoCancelTest.java index b1f88db86473..b3ec92cf1f0f 100644 --- a/core/tests/coretests/src/android/animation/AutoCancelTest.java +++ b/core/tests/coretests/src/android/animation/AutoCancelTest.java @@ -13,11 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.animation; import android.os.Handler; import android.test.ActivityInstrumentationTestCase2; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.filters.SmallTest; import java.util.HashMap; import java.util.concurrent.TimeUnit; diff --git a/core/tests/coretests/src/android/animation/BasicAnimatorActivity.java b/core/tests/coretests/src/android/animation/BasicAnimatorActivity.java index 0e1e6ac98672..2b9866d7a0b2 100644 --- a/core/tests/coretests/src/android/animation/BasicAnimatorActivity.java +++ b/core/tests/coretests/src/android/animation/BasicAnimatorActivity.java @@ -13,14 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package android.animation; -import com.android.frameworks.coretests.R; +package android.animation; import android.app.Activity; import android.os.Bundle; import android.widget.Button; +import com.android.frameworks.coretests.R; + public class BasicAnimatorActivity extends Activity { public Button mAnimatingButton; @Override diff --git a/core/tests/coretests/src/android/animation/EventsTest.java b/core/tests/coretests/src/android/animation/EventsTest.java index 28cfe3d5d68b..ba7413a2a4f7 100644 --- a/core/tests/coretests/src/android/animation/EventsTest.java +++ b/core/tests/coretests/src/android/animation/EventsTest.java @@ -13,13 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.animation; import android.os.Handler; import android.test.ActivityInstrumentationTestCase2; -import android.test.UiThreadTest; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.annotation.UiThreadTest; +import androidx.test.filters.MediumTest; +import androidx.test.filters.SmallTest; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; diff --git a/core/tests/coretests/src/android/animation/FutureWaiter.java b/core/tests/coretests/src/android/animation/FutureWaiter.java index 0c65e20be6a5..0c09a4a27d93 100644 --- a/core/tests/coretests/src/android/animation/FutureWaiter.java +++ b/core/tests/coretests/src/android/animation/FutureWaiter.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.animation; import com.google.common.util.concurrent.AbstractFuture; diff --git a/core/tests/coretests/src/android/animation/ObjectAnimatorEventsTest.java b/core/tests/coretests/src/android/animation/ObjectAnimatorEventsTest.java index 606a93949a54..53f94727f6d3 100644 --- a/core/tests/coretests/src/android/animation/ObjectAnimatorEventsTest.java +++ b/core/tests/coretests/src/android/animation/ObjectAnimatorEventsTest.java @@ -13,9 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.animation; import android.widget.Button; + import com.android.frameworks.coretests.R; /** diff --git a/core/tests/coretests/src/android/animation/StateListAnimatorTest.java b/core/tests/coretests/src/android/animation/StateListAnimatorTest.java index a9961e19e0c6..e755b89f8551 100644 --- a/core/tests/coretests/src/android/animation/StateListAnimatorTest.java +++ b/core/tests/coretests/src/android/animation/StateListAnimatorTest.java @@ -14,16 +14,16 @@ * limitations under the License. */ - package android.animation; -import android.support.test.filters.LargeTest; import android.test.ActivityInstrumentationTestCase2; -import android.test.UiThreadTest; import android.util.StateSet; import android.view.View; import android.view.ViewGroup; +import androidx.test.annotation.UiThreadTest; +import androidx.test.filters.LargeTest; + import com.android.frameworks.coretests.R; import java.util.concurrent.atomic.AtomicInteger; diff --git a/core/tests/coretests/src/android/animation/ValueAnimatorEventsTest.java b/core/tests/coretests/src/android/animation/ValueAnimatorEventsTest.java index c25d050dd3f4..f6d71b88bd89 100644 --- a/core/tests/coretests/src/android/animation/ValueAnimatorEventsTest.java +++ b/core/tests/coretests/src/android/animation/ValueAnimatorEventsTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.animation; /** diff --git a/core/tests/coretests/src/android/animation/ValueAnimatorTests.java b/core/tests/coretests/src/android/animation/ValueAnimatorTests.java index 4facf7742153..dee0a3ecdbe0 100644 --- a/core/tests/coretests/src/android/animation/ValueAnimatorTests.java +++ b/core/tests/coretests/src/android/animation/ValueAnimatorTests.java @@ -13,8 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.animation; +import static android.test.MoreAsserts.assertNotEqual; + import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertNotNull; @@ -24,23 +27,20 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.SystemClock; -import android.support.test.annotation.UiThreadTest; -import android.support.test.filters.MediumTest; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; import android.view.Choreographer; import android.view.animation.LinearInterpolator; +import androidx.test.filters.MediumTest; +import androidx.test.rule.ActivityTestRule; +import androidx.test.runner.AndroidJUnit4; + import org.junit.After; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import java.util.ArrayList; -import static android.test.MoreAsserts.assertNotEqual; - @RunWith(AndroidJUnit4.class) @MediumTest public class ValueAnimatorTests { diff --git a/core/tests/coretests/src/android/animation/ViewPropertyAnimatorTest.java b/core/tests/coretests/src/android/animation/ViewPropertyAnimatorTest.java index 30ec182f757c..997af009a9b8 100644 --- a/core/tests/coretests/src/android/animation/ViewPropertyAnimatorTest.java +++ b/core/tests/coretests/src/android/animation/ViewPropertyAnimatorTest.java @@ -13,15 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.animation; import android.os.Handler; import android.test.ActivityInstrumentationTestCase2; -import android.test.UiThreadTest; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.SmallTest; import android.view.ViewPropertyAnimator; import android.widget.Button; + +import androidx.test.annotation.UiThreadTest; +import androidx.test.filters.MediumTest; +import androidx.test.filters.SmallTest; + import com.android.frameworks.coretests.R; import java.util.concurrent.TimeUnit; diff --git a/core/tests/coretests/src/android/app/ApplicationErrorReportTest.java b/core/tests/coretests/src/android/app/ApplicationErrorReportTest.java index 19a390ab1a11..8dc5ad66194b 100644 --- a/core/tests/coretests/src/android/app/ApplicationErrorReportTest.java +++ b/core/tests/coretests/src/android/app/ApplicationErrorReportTest.java @@ -16,15 +16,16 @@ package android.app; -import org.junit.Test; -import org.junit.runner.RunWith; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import android.app.ApplicationErrorReport.CrashInfo; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) @SmallTest diff --git a/core/tests/coretests/src/android/app/ApplicationPackageManagerTest.java b/core/tests/coretests/src/android/app/ApplicationPackageManagerTest.java index 063bef7387c6..4b0ed65e5fde 100644 --- a/core/tests/coretests/src/android/app/ApplicationPackageManagerTest.java +++ b/core/tests/coretests/src/android/app/ApplicationPackageManagerTest.java @@ -16,13 +16,17 @@ package android.app; +import static android.os.storage.VolumeInfo.STATE_MOUNTED; +import static android.os.storage.VolumeInfo.STATE_UNMOUNTED; + import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageInfo; import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; -import android.support.test.filters.LargeTest; + +import androidx.test.filters.LargeTest; import junit.framework.TestCase; @@ -32,9 +36,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import static android.os.storage.VolumeInfo.STATE_MOUNTED; -import static android.os.storage.VolumeInfo.STATE_UNMOUNTED; - @LargeTest public class ApplicationPackageManagerTest extends TestCase { private static final String sInternalVolPath = "/data"; diff --git a/core/tests/coretests/src/android/app/DownloadManagerFunctionalTest.java b/core/tests/coretests/src/android/app/DownloadManagerFunctionalTest.java index c1d4be0f33c3..33e040253f06 100644 --- a/core/tests/coretests/src/android/app/DownloadManagerFunctionalTest.java +++ b/core/tests/coretests/src/android/app/DownloadManagerFunctionalTest.java @@ -22,7 +22,8 @@ import android.database.Cursor; import android.net.Uri; import android.os.Environment; import android.os.ParcelFileDescriptor; -import android.test.suitebuilder.annotation.LargeTest; + +import androidx.test.filters.LargeTest; import com.google.mockwebserver.MockResponse; diff --git a/core/tests/coretests/src/android/app/DownloadManagerStressTest.java b/core/tests/coretests/src/android/app/DownloadManagerStressTest.java index 39d9a8e31ddc..adfe76f2f151 100644 --- a/core/tests/coretests/src/android/app/DownloadManagerStressTest.java +++ b/core/tests/coretests/src/android/app/DownloadManagerStressTest.java @@ -23,10 +23,11 @@ import android.net.Uri; import android.os.Environment; import android.os.ParcelFileDescriptor; import android.os.StatFs; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.Suppress; import android.util.Log; +import androidx.test.filters.LargeTest; +import androidx.test.filters.Suppress; + import java.io.File; import java.io.FileOutputStream; import java.io.IOException; diff --git a/core/tests/coretests/src/android/app/InstrumentationTest.java b/core/tests/coretests/src/android/app/InstrumentationTest.java index 9b59da48e760..93b5aecfc8f7 100644 --- a/core/tests/coretests/src/android/app/InstrumentationTest.java +++ b/core/tests/coretests/src/android/app/InstrumentationTest.java @@ -17,9 +17,10 @@ package android.app; import android.os.Bundle; -import android.support.test.filters.LargeTest; import android.test.InstrumentationTestCase; +import androidx.test.filters.LargeTest; + @LargeTest public class InstrumentationTest extends InstrumentationTestCase { diff --git a/core/tests/coretests/src/android/app/LoaderLifecycleTest.java b/core/tests/coretests/src/android/app/LoaderLifecycleTest.java index c83e7988dcc6..e343383df3f1 100644 --- a/core/tests/coretests/src/android/app/LoaderLifecycleTest.java +++ b/core/tests/coretests/src/android/app/LoaderLifecycleTest.java @@ -14,7 +14,6 @@ * limitations under the License. */ - package android.app; import static junit.framework.TestCase.assertNotNull; @@ -27,11 +26,12 @@ import static org.junit.Assert.fail; import android.content.Context; import android.os.Handler; import android.os.Parcelable; -import android.support.test.filters.MediumTest; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; import android.util.ArrayMap; +import androidx.test.filters.MediumTest; +import androidx.test.rule.ActivityTestRule; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/app/NotificationTest.java b/core/tests/coretests/src/android/app/NotificationTest.java index e89a4d3bf94f..c17aa9254808 100644 --- a/core/tests/coretests/src/android/app/NotificationTest.java +++ b/core/tests/coretests/src/android/app/NotificationTest.java @@ -33,11 +33,12 @@ import android.media.session.MediaSession; import android.os.Build; import android.os.Parcel; import android.os.Parcelable; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.widget.RemoteViews; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/app/SearchManagerTest.java b/core/tests/coretests/src/android/app/SearchManagerTest.java index 08b7f60c368f..14370c887675 100644 --- a/core/tests/coretests/src/android/app/SearchManagerTest.java +++ b/core/tests/coretests/src/android/app/SearchManagerTest.java @@ -17,17 +17,13 @@ package android.app; import android.app.activity.LocalActivity; - -import android.app.Activity; -import android.app.ISearchManager; -import android.app.SearchManager; -import android.app.SearchableInfo; import android.content.ComponentName; import android.content.Context; import android.os.ServiceManager; import android.test.ActivityInstrumentationTestCase2; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; + +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; /** * To launch this test from the command line: diff --git a/core/tests/coretests/src/android/app/activity/ActivityManagerTest.java b/core/tests/coretests/src/android/app/activity/ActivityManagerTest.java index 61d73bc918d5..bbd442d53f76 100644 --- a/core/tests/coretests/src/android/app/activity/ActivityManagerTest.java +++ b/core/tests/coretests/src/android/app/activity/ActivityManagerTest.java @@ -21,8 +21,9 @@ import android.content.Context; import android.content.pm.ConfigurationInfo; import android.content.res.Configuration; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; -import android.test.suitebuilder.annotation.Suppress; + +import androidx.test.filters.SmallTest; +import androidx.test.filters.Suppress; import java.util.Iterator; import java.util.List; diff --git a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java index 0f83a29d8d36..9cb34895dea4 100644 --- a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +++ b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java @@ -36,13 +36,14 @@ import android.app.servertransaction.StopActivityItem; import android.content.Intent; import android.content.res.Configuration; import android.os.IBinder; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.MediumTest; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; import android.util.MergedConfiguration; import android.view.Display; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.MediumTest; +import androidx.test.rule.ActivityTestRule; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/app/activity/BroadcastTest.java b/core/tests/coretests/src/android/app/activity/BroadcastTest.java index 13e70ebdb2e3..0f81896692c0 100644 --- a/core/tests/coretests/src/android/app/activity/BroadcastTest.java +++ b/core/tests/coretests/src/android/app/activity/BroadcastTest.java @@ -27,11 +27,10 @@ import android.os.Bundle; import android.os.IBinder; import android.os.Parcel; import android.os.UserHandle; -import android.support.test.filters.LargeTest; -import android.test.FlakyTest; import android.util.Log; -import java.util.Arrays; +import androidx.test.filters.FlakyTest; +import androidx.test.filters.LargeTest; @LargeTest public class BroadcastTest extends ActivityTestsBase { @@ -231,7 +230,7 @@ public class BroadcastTest extends ActivityTestsBase { }; // Mark flaky until http://b/issue?id=1191607 is resolved. - @FlakyTest(tolerance=2) + @FlakyTest public void testRegistered() throws Exception { runLaunchpad(LaunchpadActivity.BROADCAST_REGISTERED); } @@ -248,12 +247,12 @@ public class BroadcastTest extends ActivityTestsBase { runLaunchpad(LaunchpadActivity.BROADCAST_ABORT); } - @FlakyTest(tolerance=2) + @FlakyTest public void testAll() throws Exception { runLaunchpad(LaunchpadActivity.BROADCAST_ALL); } - @FlakyTest(tolerance=2) + @FlakyTest public void testMulti() throws Exception { runLaunchpad(LaunchpadActivity.BROADCAST_MULTI); } @@ -348,7 +347,7 @@ public class BroadcastTest extends ActivityTestsBase { } // Marking flaky until http://b/issue?id=1191337 is resolved - @FlakyTest(tolerance=2) + @FlakyTest public void testReceiveSticky() throws Exception { Intent intent = new Intent(LaunchpadActivity.BROADCAST_STICKY1, null); intent.putExtra("test", LaunchpadActivity.DATA_1); @@ -358,7 +357,7 @@ public class BroadcastTest extends ActivityTestsBase { } // Marking flaky until http://b/issue?id=1191337 is resolved - @FlakyTest(tolerance=2) + @FlakyTest public void testReceive2Sticky() throws Exception { Intent intent = new Intent(LaunchpadActivity.BROADCAST_STICKY1, null); intent.putExtra("test", LaunchpadActivity.DATA_1); diff --git a/core/tests/coretests/src/android/app/activity/IntentSenderTest.java b/core/tests/coretests/src/android/app/activity/IntentSenderTest.java index 8c1d79b5d89c..19ddb52db86e 100644 --- a/core/tests/coretests/src/android/app/activity/IntentSenderTest.java +++ b/core/tests/coretests/src/android/app/activity/IntentSenderTest.java @@ -21,7 +21,8 @@ import android.app.PendingIntent; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; -import android.support.test.filters.LargeTest; + +import androidx.test.filters.LargeTest; @LargeTest public class IntentSenderTest extends BroadcastTest { diff --git a/core/tests/coretests/src/android/app/activity/LaunchTest.java b/core/tests/coretests/src/android/app/activity/LaunchTest.java index 5b86dceb75f8..6846ea75e524 100644 --- a/core/tests/coretests/src/android/app/activity/LaunchTest.java +++ b/core/tests/coretests/src/android/app/activity/LaunchTest.java @@ -17,8 +17,9 @@ package android.app.activity; import android.content.ComponentName; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.Suppress; + +import androidx.test.filters.LargeTest; +import androidx.test.filters.Suppress; @Suppress // Flaky. public class LaunchTest extends ActivityTestsBase { diff --git a/core/tests/coretests/src/android/app/activity/LifecycleTest.java b/core/tests/coretests/src/android/app/activity/LifecycleTest.java index ed01fac5e0a9..5aa03807264e 100644 --- a/core/tests/coretests/src/android/app/activity/LifecycleTest.java +++ b/core/tests/coretests/src/android/app/activity/LifecycleTest.java @@ -18,8 +18,9 @@ package android.app.activity; import android.content.ComponentName; import android.content.Intent; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.Suppress; + +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; public class LifecycleTest extends ActivityTestsBase { private Intent mTopIntent; diff --git a/core/tests/coretests/src/android/app/activity/MetaDataTest.java b/core/tests/coretests/src/android/app/activity/MetaDataTest.java index 5b9c0e903135..cf27878e897e 100644 --- a/core/tests/coretests/src/android/app/activity/MetaDataTest.java +++ b/core/tests/coretests/src/android/app/activity/MetaDataTest.java @@ -27,8 +27,11 @@ import android.content.res.TypedArray; import android.content.res.XmlResourceParser; import android.os.Bundle; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.filters.SmallTest; + import com.android.frameworks.coretests.R; + import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; diff --git a/core/tests/coretests/src/android/app/activity/RemoteSubActivityScreen.java b/core/tests/coretests/src/android/app/activity/RemoteSubActivityScreen.java index 9f402a5265ec..8184627494ed 100644 --- a/core/tests/coretests/src/android/app/activity/RemoteSubActivityScreen.java +++ b/core/tests/coretests/src/android/app/activity/RemoteSubActivityScreen.java @@ -1,19 +1,18 @@ -/* //device/apps/AndroidTests/src/com.android.unit_tests/activity/TestedScreen.java -** -** Copyright 2006, 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. -*/ +/* + * Copyright (C) 2006 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.app.activity; @@ -21,7 +20,8 @@ import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Process; -import android.util.Log; + +//device/apps/AndroidTests/src/com.android.unit_tests/activity/TestedScreen.java public class RemoteSubActivityScreen extends SubActivityScreen { Handler mHandler = new Handler(); diff --git a/core/tests/coretests/src/android/app/activity/ServiceTest.java b/core/tests/coretests/src/android/app/activity/ServiceTest.java index d3ae415223e0..9d2aebd1e6cd 100644 --- a/core/tests/coretests/src/android/app/activity/ServiceTest.java +++ b/core/tests/coretests/src/android/app/activity/ServiceTest.java @@ -22,13 +22,12 @@ import android.content.Intent; import android.content.ServiceConnection; import android.os.Binder; import android.os.Bundle; -import android.os.RemoteException; import android.os.IBinder; import android.os.Parcel; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.SmallTest; -import android.test.suitebuilder.annotation.Suppress; -import android.util.Log; +import android.os.RemoteException; + +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; // These test binders purport to support an interface whose canonical // interface name is ServiceTest.SERVICE_LOCAL diff --git a/core/tests/coretests/src/android/app/activity/SetTimeZonePermissionsTest.java b/core/tests/coretests/src/android/app/activity/SetTimeZonePermissionsTest.java index 41b95476baf3..8e172952c9ee 100644 --- a/core/tests/coretests/src/android/app/activity/SetTimeZonePermissionsTest.java +++ b/core/tests/coretests/src/android/app/activity/SetTimeZonePermissionsTest.java @@ -19,7 +19,8 @@ package android.app.activity; import android.app.AlarmManager; import android.content.Context; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.LargeTest; + +import androidx.test.filters.LargeTest; import java.util.TimeZone; diff --git a/core/tests/coretests/src/android/app/activity/SubActivityTest.java b/core/tests/coretests/src/android/app/activity/SubActivityTest.java index 35dde8a51567..53f89fe1276b 100644 --- a/core/tests/coretests/src/android/app/activity/SubActivityTest.java +++ b/core/tests/coretests/src/android/app/activity/SubActivityTest.java @@ -16,9 +16,10 @@ package android.app.activity; -import android.test.suitebuilder.annotation.Suppress; import android.content.ComponentName; +import androidx.test.filters.Suppress; + @Suppress public class SubActivityTest extends ActivityTestsBase { diff --git a/core/tests/coretests/src/android/app/admin/PasswordMetricsTest.java b/core/tests/coretests/src/android/app/admin/PasswordMetricsTest.java index 9b5b725a3bed..8d42c74be7b0 100644 --- a/core/tests/coretests/src/android/app/admin/PasswordMetricsTest.java +++ b/core/tests/coretests/src/android/app/admin/PasswordMetricsTest.java @@ -27,8 +27,9 @@ import static org.junit.Assert.assertNotEquals; import android.app.admin.PasswordMetrics.PasswordComplexityBucket; import android.os.Parcel; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/app/assist/AssistStructureTest.java b/core/tests/coretests/src/android/app/assist/AssistStructureTest.java index 689e683dda23..1f4e5dffc84e 100644 --- a/core/tests/coretests/src/android/app/assist/AssistStructureTest.java +++ b/core/tests/coretests/src/android/app/assist/AssistStructureTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.app.assist; import static android.view.View.AUTOFILL_TYPE_TEXT; @@ -22,13 +23,9 @@ import static android.view.View.IMPORTANT_FOR_AUTOFILL_YES; import static com.google.common.truth.Truth.assertThat; import android.app.assist.AssistStructure.ViewNode; -import android.content.ComponentName; import android.content.Context; import android.os.Parcel; import android.os.SystemClock; -import android.support.test.InstrumentationRegistry; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; import android.text.InputFilter; import android.util.Log; import android.view.autofill.AutofillId; @@ -37,6 +34,10 @@ import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.test.InstrumentationRegistry; +import androidx.test.rule.ActivityTestRule; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/app/assist/EmptyLayoutActivity.java b/core/tests/coretests/src/android/app/assist/EmptyLayoutActivity.java index f4b6bed1cac8..defec433e403 100644 --- a/core/tests/coretests/src/android/app/assist/EmptyLayoutActivity.java +++ b/core/tests/coretests/src/android/app/assist/EmptyLayoutActivity.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.app.assist; import android.app.Activity; diff --git a/core/tests/coretests/src/android/app/backup/BackupDataTest.java b/core/tests/coretests/src/android/app/backup/BackupDataTest.java index 5b8e481cf573..18ff54fa6989 100644 --- a/core/tests/coretests/src/android/app/backup/BackupDataTest.java +++ b/core/tests/coretests/src/android/app/backup/BackupDataTest.java @@ -16,31 +16,22 @@ package android.app.backup; -import android.app.backup.BackupDataInput; -import android.app.backup.BackupDataOutput; -import android.content.res.AssetFileDescriptor; import android.content.res.AssetManager; import android.os.Bundle; import android.os.Environment; import android.os.ParcelFileDescriptor; -import android.support.test.filters.LargeTest; import android.test.AndroidTestCase; -import android.test.InstrumentationTestCase; import android.util.Base64; -import android.util.Log; -import org.json.JSONObject; + +import androidx.test.filters.LargeTest; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; -import java.io.FileReader; import java.io.IOException; -import java.io.InputStream; import java.io.InputStreamReader; -import java.lang.Exception; -import java.nio.ByteBuffer; @LargeTest public class BackupDataTest extends AndroidTestCase { diff --git a/core/tests/coretests/src/android/app/backup/FullBackupTest.java b/core/tests/coretests/src/android/app/backup/FullBackupTest.java index 5db416b33af7..08edb4e9be97 100644 --- a/core/tests/coretests/src/android/app/backup/FullBackupTest.java +++ b/core/tests/coretests/src/android/app/backup/FullBackupTest.java @@ -18,11 +18,12 @@ package android.app.backup; import android.app.backup.FullBackup.BackupScheme.PathWithRequiredFlags; import android.content.Context; -import android.support.test.filters.LargeTest; import android.test.AndroidTestCase; import android.util.ArrayMap; import android.util.ArraySet; +import androidx.test.filters.LargeTest; + import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; diff --git a/core/tests/coretests/src/android/app/servertransaction/ClientTransactionTests.java b/core/tests/coretests/src/android/app/servertransaction/ClientTransactionTests.java index b1f855246320..52b26589279f 100644 --- a/core/tests/coretests/src/android/app/servertransaction/ClientTransactionTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/ClientTransactionTests.java @@ -23,8 +23,9 @@ import static org.mockito.Mockito.verify; import android.app.ClientTransactionHandler; import android.os.IBinder; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java b/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java index fb0f5344f643..ad28d13dc46a 100644 --- a/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java @@ -35,8 +35,9 @@ import android.os.Binder; import android.os.Bundle; import android.os.PersistableBundle; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionExecutorTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionExecutorTests.java index a788a938357f..f730a244a593 100644 --- a/core/tests/coretests/src/android/app/servertransaction/TransactionExecutorTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/TransactionExecutorTests.java @@ -45,10 +45,11 @@ import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.util.ArrayMap; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java index 2801f32430ef..8604b0c48476 100644 --- a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java @@ -50,8 +50,9 @@ import android.os.PersistableBundle; import android.os.RemoteCallback; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import com.android.internal.app.IVoiceInteractor; diff --git a/core/tests/coretests/src/android/app/timezone/DistroFormatVersionTest.java b/core/tests/coretests/src/android/app/timezone/DistroFormatVersionTest.java index e20645c7d3c8..0efc0ab89a73 100644 --- a/core/tests/coretests/src/android/app/timezone/DistroFormatVersionTest.java +++ b/core/tests/coretests/src/android/app/timezone/DistroFormatVersionTest.java @@ -21,7 +21,8 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import android.os.Parcel; -import android.support.test.filters.LargeTest; + +import androidx.test.filters.LargeTest; import org.junit.Test; diff --git a/core/tests/coretests/src/android/app/timezone/DistroRulesVersionTest.java b/core/tests/coretests/src/android/app/timezone/DistroRulesVersionTest.java index b69054cebbd2..b519bf8b13f7 100644 --- a/core/tests/coretests/src/android/app/timezone/DistroRulesVersionTest.java +++ b/core/tests/coretests/src/android/app/timezone/DistroRulesVersionTest.java @@ -21,7 +21,8 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import android.os.Parcel; -import android.support.test.filters.LargeTest; + +import androidx.test.filters.LargeTest; import org.junit.Test; diff --git a/core/tests/coretests/src/android/app/timezone/RulesStateTest.java b/core/tests/coretests/src/android/app/timezone/RulesStateTest.java index dd462403ed82..bb535b6fac7d 100644 --- a/core/tests/coretests/src/android/app/timezone/RulesStateTest.java +++ b/core/tests/coretests/src/android/app/timezone/RulesStateTest.java @@ -16,14 +16,13 @@ package android.app.timezone; -import static junit.framework.Assert.fail; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import android.os.Parcel; -import android.support.test.filters.LargeTest; + +import androidx.test.filters.LargeTest; import org.junit.Test; diff --git a/core/tests/coretests/src/android/app/timezone/RulesUpdaterContractTest.java b/core/tests/coretests/src/android/app/timezone/RulesUpdaterContractTest.java index 4004086354ca..df9ddea53c91 100644 --- a/core/tests/coretests/src/android/app/timezone/RulesUpdaterContractTest.java +++ b/core/tests/coretests/src/android/app/timezone/RulesUpdaterContractTest.java @@ -25,7 +25,8 @@ import static org.mockito.hamcrest.MockitoHamcrest.argThat; import android.content.Context; import android.content.Intent; import android.os.UserHandle; -import android.support.test.filters.LargeTest; + +import androidx.test.filters.LargeTest; import org.hamcrest.BaseMatcher; import org.hamcrest.Description; diff --git a/core/tests/coretests/src/android/app/usage/EventListTest.java b/core/tests/coretests/src/android/app/usage/EventListTest.java index 9dc0d4309a8f..685fcae46553 100644 --- a/core/tests/coretests/src/android/app/usage/EventListTest.java +++ b/core/tests/coretests/src/android/app/usage/EventListTest.java @@ -20,10 +20,11 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.util.Log; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/app/usage/UsageStatsTest.java b/core/tests/coretests/src/android/app/usage/UsageStatsTest.java index 28aaf1e05644..1633e1ac50a0 100644 --- a/core/tests/coretests/src/android/app/usage/UsageStatsTest.java +++ b/core/tests/coretests/src/android/app/usage/UsageStatsTest.java @@ -21,6 +21,7 @@ import static android.app.usage.UsageEvents.Event.ACTIVITY_PAUSED; import static android.app.usage.UsageEvents.Event.ACTIVITY_RESUMED; import static android.app.usage.UsageEvents.Event.ACTIVITY_STOPPED; import static android.app.usage.UsageEvents.Event.CONTINUING_FOREGROUND_SERVICE; +import static android.app.usage.UsageEvents.Event.DEVICE_SHUTDOWN; import static android.app.usage.UsageEvents.Event.END_OF_DAY; import static android.app.usage.UsageEvents.Event.FLUSH_TO_DISK; import static android.app.usage.UsageEvents.Event.FOREGROUND_SERVICE_START; @@ -33,8 +34,9 @@ import static org.junit.Assert.fail; import android.app.usage.UsageEvents.Event; import android.os.Parcel; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Test; @@ -528,6 +530,11 @@ public class UsageStatsTest { } @Test + public void testEvent_DEVICE_SHUTDOWN() { + testClosingEvent(DEVICE_SHUTDOWN); + } + + @Test public void testEvent_FLUSH_TO_DISK() { testClosingEvent(FLUSH_TO_DISK); } @@ -535,8 +542,9 @@ public class UsageStatsTest { private void testClosingEvent(int eventType) { // When these three closing events are received, all open activities/services need to be // closed and usage stats are updated. - if (eventType != FLUSH_TO_DISK) { - fail("Closing eventType must be one of FLUSH_TO_DISK"); + if (eventType != DEVICE_SHUTDOWN + && eventType != FLUSH_TO_DISK) { + fail("Closing eventType must be one of DEVICE_SHUTDOWN, FLUSH_TO_DISK"); } left.mPackageName = "com.test"; diff --git a/core/tests/coretests/src/android/content/AbstractCrossUserContentResolverTest.java b/core/tests/coretests/src/android/content/AbstractCrossUserContentResolverTest.java index 978ea7aa9c00..c307e648752d 100644 --- a/core/tests/coretests/src/android/content/AbstractCrossUserContentResolverTest.java +++ b/core/tests/coretests/src/android/content/AbstractCrossUserContentResolverTest.java @@ -16,7 +16,6 @@ package android.content; - import static org.junit.Assert.fail; import android.app.ActivityManager; @@ -30,9 +29,10 @@ import android.os.IBinder; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.LargeTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.LargeTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Before; diff --git a/core/tests/coretests/src/android/content/AssetTest.java b/core/tests/coretests/src/android/content/AssetTest.java index b66574cee231..8e55e8a1a632 100644 --- a/core/tests/coretests/src/android/content/AssetTest.java +++ b/core/tests/coretests/src/android/content/AssetTest.java @@ -18,7 +18,8 @@ package android.content; import android.content.res.AssetManager; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.filters.SmallTest; import java.io.IOException; import java.io.InputStream; diff --git a/core/tests/coretests/src/android/content/BrickDeniedTest.java b/core/tests/coretests/src/android/content/BrickDeniedTest.java index 3d246b457ed5..d8c9baa8df5b 100644 --- a/core/tests/coretests/src/android/content/BrickDeniedTest.java +++ b/core/tests/coretests/src/android/content/BrickDeniedTest.java @@ -17,7 +17,8 @@ package android.content; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.filters.SmallTest; /** Test to make sure brick intents <b>don't</b> work without permission. */ public class BrickDeniedTest extends AndroidTestCase { diff --git a/core/tests/coretests/src/android/content/BroadcastReceiverTests.java b/core/tests/coretests/src/android/content/BroadcastReceiverTests.java index 8deccb7ffa7f..1509ff960ece 100644 --- a/core/tests/coretests/src/android/content/BroadcastReceiverTests.java +++ b/core/tests/coretests/src/android/content/BroadcastReceiverTests.java @@ -18,9 +18,9 @@ package android.content; import static org.junit.Assert.fail; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/android/content/ContentProviderOperationTest.java b/core/tests/coretests/src/android/content/ContentProviderOperationTest.java index aea124b08658..b142761760c4 100644 --- a/core/tests/coretests/src/android/content/ContentProviderOperationTest.java +++ b/core/tests/coretests/src/android/content/ContentProviderOperationTest.java @@ -16,22 +16,23 @@ package android.content; -import android.content.ContentValues; import android.database.Cursor; import android.database.MatrixCursor; import android.net.Uri; import android.os.Parcel; -import android.test.suitebuilder.annotation.SmallTest; import android.text.TextUtils; + +import androidx.test.filters.SmallTest; + import junit.framework.TestCase; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; -import java.util.Set; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; @SmallTest public class ContentProviderOperationTest extends TestCase { diff --git a/core/tests/coretests/src/android/content/ContentProviderTest.java b/core/tests/coretests/src/android/content/ContentProviderTest.java index 2142f27ff6d8..8895f9bdf23d 100644 --- a/core/tests/coretests/src/android/content/ContentProviderTest.java +++ b/core/tests/coretests/src/android/content/ContentProviderTest.java @@ -23,7 +23,8 @@ import static org.mockito.Mockito.withSettings; import android.content.pm.ApplicationInfo; import android.content.pm.ProviderInfo; import android.net.Uri; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/android/content/ContentQueryMapTest.java b/core/tests/coretests/src/android/content/ContentQueryMapTest.java index f47bfdbb28fc..710623488552 100644 --- a/core/tests/coretests/src/android/content/ContentQueryMapTest.java +++ b/core/tests/coretests/src/android/content/ContentQueryMapTest.java @@ -16,16 +16,14 @@ package android.content; -import android.content.ContentQueryMap; -import android.content.ContentResolver; -import android.content.ContentValues; import android.database.Cursor; import android.os.Handler; import android.os.Looper; import android.provider.Settings; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.Suppress; + +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; import java.util.Observable; import java.util.Observer; diff --git a/core/tests/coretests/src/android/content/ContentResolverTest.java b/core/tests/coretests/src/android/content/ContentResolverTest.java index 9940bf7dd692..f14f2896d8f5 100644 --- a/core/tests/coretests/src/android/content/ContentResolverTest.java +++ b/core/tests/coretests/src/android/content/ContentResolverTest.java @@ -31,10 +31,11 @@ import android.graphics.Paint; import android.net.Uri; import android.os.MemoryFile; import android.os.ParcelFileDescriptor; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; import android.util.Size; +import androidx.test.InstrumentationRegistry; +import androidx.test.runner.AndroidJUnit4; + import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/android/content/ContentValuesTest.java b/core/tests/coretests/src/android/content/ContentValuesTest.java index 7b39939b2d0c..0ab79e730ea1 100644 --- a/core/tests/coretests/src/android/content/ContentValuesTest.java +++ b/core/tests/coretests/src/android/content/ContentValuesTest.java @@ -17,8 +17,8 @@ package android.content; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; +import androidx.test.filters.SmallTest; /* runtest -c android.content.ContentValuesTest frameworks-core @@ -29,7 +29,7 @@ import android.test.suitebuilder.annotation.SmallTest; adb shell pm uninstall -k com.android.frameworks.coretests && \ adb install out/target/product/bullhead/testcases/FrameworksCoreTests/FrameworksCoreTests.apk && \ adb shell am instrument -w -e package android.content \ - com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner + com.android.frameworks.coretests/androidx.test.runner.AndroidJUnitRunner */ public class ContentValuesTest extends AndroidTestCase { diff --git a/core/tests/coretests/src/android/content/ContextTest.java b/core/tests/coretests/src/android/content/ContextTest.java index c8a3098690be..2f442c34f2c1 100644 --- a/core/tests/coretests/src/android/content/ContextTest.java +++ b/core/tests/coretests/src/android/content/ContextTest.java @@ -19,11 +19,12 @@ package android.content; import static org.junit.Assert.assertEquals; import android.app.ActivityThread; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.view.WindowManager; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/content/ManagedUserContentResolverTest.java b/core/tests/coretests/src/android/content/ManagedUserContentResolverTest.java index 4362ec3a0ed6..22b23148cbcf 100644 --- a/core/tests/coretests/src/android/content/ManagedUserContentResolverTest.java +++ b/core/tests/coretests/src/android/content/ManagedUserContentResolverTest.java @@ -19,7 +19,8 @@ package android.content; import android.content.pm.UserInfo; import android.os.RemoteException; import android.os.UserHandle; -import android.support.test.filters.LargeTest; + +import androidx.test.filters.LargeTest; /** * To run the tests, use @@ -32,7 +33,7 @@ import android.support.test.filters.LargeTest; * Install: adb install -r \ * ${ANDROID_PRODUCT_OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk * Run: adb shell am instrument -e class android.content.ManagedUserContentResolverTest -w \ - * com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner + * com.android.frameworks.coretests/androidx.test.runner.AndroidJUnitRunner */ @LargeTest public class ManagedUserContentResolverTest extends AbstractCrossUserContentResolverTest { diff --git a/core/tests/coretests/src/android/content/MemoryFileProviderTest.java b/core/tests/coretests/src/android/content/MemoryFileProviderTest.java index bbe7c1008299..7cd486222101 100644 --- a/core/tests/coretests/src/android/content/MemoryFileProviderTest.java +++ b/core/tests/coretests/src/android/content/MemoryFileProviderTest.java @@ -18,9 +18,10 @@ package android.content; import android.net.Uri; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; +import androidx.test.filters.SmallTest; import java.io.InputStream; import java.util.Arrays; diff --git a/core/tests/coretests/src/android/content/RestrictionsManagerTest.java b/core/tests/coretests/src/android/content/RestrictionsManagerTest.java index 10d74f7d2945..fd5de3217389 100644 --- a/core/tests/coretests/src/android/content/RestrictionsManagerTest.java +++ b/core/tests/coretests/src/android/content/RestrictionsManagerTest.java @@ -13,13 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License */ + package android.content; import android.os.Bundle; import android.os.Parcelable; -import android.support.test.filters.LargeTest; import android.test.AndroidTestCase; +import androidx.test.filters.LargeTest; + import java.util.Arrays; import java.util.HashSet; import java.util.List; diff --git a/core/tests/coretests/src/android/content/SecondaryUserContentResolverTest.java b/core/tests/coretests/src/android/content/SecondaryUserContentResolverTest.java index f8b13f032652..dbe027800e3f 100644 --- a/core/tests/coretests/src/android/content/SecondaryUserContentResolverTest.java +++ b/core/tests/coretests/src/android/content/SecondaryUserContentResolverTest.java @@ -18,7 +18,8 @@ package android.content; import android.content.pm.UserInfo; import android.os.RemoteException; -import android.support.test.filters.LargeTest; + +import androidx.test.filters.LargeTest; /** * To run the tests, use @@ -31,7 +32,7 @@ import android.support.test.filters.LargeTest; * Install: adb install -r \ * ${ANDROID_PRODUCT_OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk * Run: adb shell am instrument -e class android.content.SecondaryUserContentResolverTest -w \ - * com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner + * com.android.frameworks.coretests/androidx.test.runner.AndroidJUnitRunner */ @LargeTest public class SecondaryUserContentResolverTest extends AbstractCrossUserContentResolverTest { diff --git a/core/tests/coretests/src/android/content/UriMatcherTest.java b/core/tests/coretests/src/android/content/UriMatcherTest.java index f3b9e76f3bcb..6cef46b0731a 100644 --- a/core/tests/coretests/src/android/content/UriMatcherTest.java +++ b/core/tests/coretests/src/android/content/UriMatcherTest.java @@ -17,14 +17,14 @@ package android.content; import android.net.Uri; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.filters.SmallTest; import junit.framework.TestCase; import java.lang.reflect.Field; import java.util.ArrayList; - public class UriMatcherTest extends TestCase { static final int ROOT = 0; diff --git a/core/tests/coretests/src/android/content/pm/AndroidHidlUpdaterTest.java b/core/tests/coretests/src/android/content/pm/AndroidHidlUpdaterTest.java index 2acb08da4ef0..9b360db023d0 100644 --- a/core/tests/coretests/src/android/content/pm/AndroidHidlUpdaterTest.java +++ b/core/tests/coretests/src/android/content/pm/AndroidHidlUpdaterTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.content.pm; import static android.content.pm.PackageBuilder.builder; @@ -20,7 +21,8 @@ import static android.content.pm.SharedLibraryNames.ANDROID_HIDL_BASE; import static android.content.pm.SharedLibraryNames.ANDROID_HIDL_MANAGER; import android.os.Build; -import android.support.test.filters.SmallTest; + +import androidx.test.filters.SmallTest; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/content/pm/AndroidTestBaseUpdaterTest.java b/core/tests/coretests/src/android/content/pm/AndroidTestBaseUpdaterTest.java index dce22ce6a6f2..0ed76dcf7c5d 100644 --- a/core/tests/coretests/src/android/content/pm/AndroidTestBaseUpdaterTest.java +++ b/core/tests/coretests/src/android/content/pm/AndroidTestBaseUpdaterTest.java @@ -13,13 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.content.pm; import static android.content.pm.PackageBuilder.builder; import static android.content.pm.SharedLibraryNames.ANDROID_TEST_BASE; import android.os.Build; -import android.support.test.filters.SmallTest; + +import androidx.test.filters.SmallTest; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/content/pm/AndroidTestRunnerSplitUpdaterTest.java b/core/tests/coretests/src/android/content/pm/AndroidTestRunnerSplitUpdaterTest.java index 866de93c07fe..7f817d66caf7 100644 --- a/core/tests/coretests/src/android/content/pm/AndroidTestRunnerSplitUpdaterTest.java +++ b/core/tests/coretests/src/android/content/pm/AndroidTestRunnerSplitUpdaterTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.content.pm; import static android.content.pm.PackageBuilder.builder; @@ -20,7 +21,8 @@ import static android.content.pm.SharedLibraryNames.ANDROID_TEST_MOCK; import static android.content.pm.SharedLibraryNames.ANDROID_TEST_RUNNER; import android.content.pm.PackageBackwardCompatibility.AndroidTestRunnerSplitUpdater; -import android.support.test.filters.SmallTest; + +import androidx.test.filters.SmallTest; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/content/pm/ComponentTest.java b/core/tests/coretests/src/android/content/pm/ComponentTest.java index cc7564165bba..f31f0b5ee1b4 100644 --- a/core/tests/coretests/src/android/content/pm/ComponentTest.java +++ b/core/tests/coretests/src/android/content/pm/ComponentTest.java @@ -21,7 +21,14 @@ import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED; import static android.content.pm.PackageManager.GET_DISABLED_COMPONENTS; -import android.test.suitebuilder.annotation.Suppress; +import android.content.ComponentName; +import android.content.Intent; +import android.test.AndroidTestCase; + +import androidx.test.filters.MediumTest; +import androidx.test.filters.SmallTest; +import androidx.test.filters.Suppress; + import com.android.frameworks.coretests.enabled_app.DisabledActivity; import com.android.frameworks.coretests.enabled_app.DisabledProvider; import com.android.frameworks.coretests.enabled_app.DisabledReceiver; @@ -31,12 +38,6 @@ import com.android.frameworks.coretests.enabled_app.EnabledProvider; import com.android.frameworks.coretests.enabled_app.EnabledReceiver; import com.android.frameworks.coretests.enabled_app.EnabledService; -import android.content.ComponentName; -import android.content.Intent; -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.SmallTest; - import java.util.List; /** diff --git a/core/tests/coretests/src/android/content/pm/LimitedLengthInputStreamTest.java b/core/tests/coretests/src/android/content/pm/LimitedLengthInputStreamTest.java index 1f762fdc49f4..1c703ab0b98f 100644 --- a/core/tests/coretests/src/android/content/pm/LimitedLengthInputStreamTest.java +++ b/core/tests/coretests/src/android/content/pm/LimitedLengthInputStreamTest.java @@ -17,7 +17,8 @@ package android.content.pm; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.MediumTest; + +import androidx.test.filters.MediumTest; import java.io.ByteArrayInputStream; import java.io.IOException; diff --git a/core/tests/coretests/src/android/content/pm/MacAuthenticatedInputStreamTest.java b/core/tests/coretests/src/android/content/pm/MacAuthenticatedInputStreamTest.java index 659f9ea77956..1ddd753de80e 100644 --- a/core/tests/coretests/src/android/content/pm/MacAuthenticatedInputStreamTest.java +++ b/core/tests/coretests/src/android/content/pm/MacAuthenticatedInputStreamTest.java @@ -16,9 +16,12 @@ package android.content.pm; -import android.support.test.filters.LargeTest; import android.test.AndroidTestCase; +import androidx.test.filters.LargeTest; + +import libcore.io.Streams; + import java.io.ByteArrayInputStream; import java.util.Arrays; @@ -26,8 +29,6 @@ import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; -import libcore.io.Streams; - @LargeTest public class MacAuthenticatedInputStreamTest extends AndroidTestCase { diff --git a/core/tests/coretests/src/android/content/pm/OptionalClassRunner.java b/core/tests/coretests/src/android/content/pm/OptionalClassRunner.java index 91697c0d74f3..05db8ee29844 100644 --- a/core/tests/coretests/src/android/content/pm/OptionalClassRunner.java +++ b/core/tests/coretests/src/android/content/pm/OptionalClassRunner.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.content.pm; import org.junit.Assume; diff --git a/core/tests/coretests/src/android/content/pm/OrgApacheHttpLegacyUpdaterTest.java b/core/tests/coretests/src/android/content/pm/OrgApacheHttpLegacyUpdaterTest.java index dcd2707a9540..834a0bbeab89 100644 --- a/core/tests/coretests/src/android/content/pm/OrgApacheHttpLegacyUpdaterTest.java +++ b/core/tests/coretests/src/android/content/pm/OrgApacheHttpLegacyUpdaterTest.java @@ -13,13 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.content.pm; import static android.content.pm.PackageBuilder.builder; import static android.content.pm.SharedLibraryNames.ORG_APACHE_HTTP_LEGACY; import android.os.Build; -import android.support.test.filters.SmallTest; + +import androidx.test.filters.SmallTest; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/content/pm/PackageBackwardCompatibilityTest.java b/core/tests/coretests/src/android/content/pm/PackageBackwardCompatibilityTest.java index c64d5202e1fd..3d7aab001227 100644 --- a/core/tests/coretests/src/android/content/pm/PackageBackwardCompatibilityTest.java +++ b/core/tests/coretests/src/android/content/pm/PackageBackwardCompatibilityTest.java @@ -24,7 +24,8 @@ import static android.content.pm.SharedLibraryNames.ORG_APACHE_HTTP_LEGACY; import android.content.pm.PackageBackwardCompatibility.RemoveUnnecessaryAndroidTestBaseLibrary; import android.os.Build; -import android.support.test.filters.SmallTest; + +import androidx.test.filters.SmallTest; import org.junit.Assume; import org.junit.Test; diff --git a/core/tests/coretests/src/android/content/pm/PackageBuilder.java b/core/tests/coretests/src/android/content/pm/PackageBuilder.java index 4ceed834aab7..c5db9622b60d 100644 --- a/core/tests/coretests/src/android/content/pm/PackageBuilder.java +++ b/core/tests/coretests/src/android/content/pm/PackageBuilder.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.content.pm; import static org.junit.Assert.assertEquals; diff --git a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java index 8ac9451deaf6..0ab536779296 100644 --- a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java +++ b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java @@ -54,11 +54,12 @@ import android.system.ErrnoException; import android.system.Os; import android.system.StructStat; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.SmallTest; -import android.test.suitebuilder.annotation.Suppress; import android.util.Log; +import androidx.test.filters.LargeTest; +import androidx.test.filters.SmallTest; +import androidx.test.filters.Suppress; + import com.android.frameworks.coretests.R; import com.android.internal.content.PackageHelper; diff --git a/core/tests/coretests/src/android/content/pm/PackageParserCacheHelperTest.java b/core/tests/coretests/src/android/content/pm/PackageParserCacheHelperTest.java index 00be82219e4f..e852f989a17f 100644 --- a/core/tests/coretests/src/android/content/pm/PackageParserCacheHelperTest.java +++ b/core/tests/coretests/src/android/content/pm/PackageParserCacheHelperTest.java @@ -22,8 +22,9 @@ import android.content.pm.PackageParserCacheHelper.ReadHelper; import android.content.pm.PackageParserCacheHelper.WriteHelper; import android.os.Bundle; import android.os.Parcel; -import android.support.test.runner.AndroidJUnit4; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/content/pm/PackageParserTest.java b/core/tests/coretests/src/android/content/pm/PackageParserTest.java index 3f91a65549a1..be1b1ce48276 100644 --- a/core/tests/coretests/src/android/content/pm/PackageParserTest.java +++ b/core/tests/coretests/src/android/content/pm/PackageParserTest.java @@ -29,9 +29,10 @@ import android.os.Build; import android.os.Bundle; import android.os.FileUtils; import android.os.SystemProperties; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import com.android.frameworks.coretests.R; diff --git a/core/tests/coretests/src/android/content/pm/PackageSharedLibraryUpdaterTest.java b/core/tests/coretests/src/android/content/pm/PackageSharedLibraryUpdaterTest.java index d5d3d7a6f2f4..71a0e5e51b71 100644 --- a/core/tests/coretests/src/android/content/pm/PackageSharedLibraryUpdaterTest.java +++ b/core/tests/coretests/src/android/content/pm/PackageSharedLibraryUpdaterTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.content.pm; import java.util.function.Supplier; diff --git a/core/tests/coretests/src/android/content/pm/ParceledListSliceTest.java b/core/tests/coretests/src/android/content/pm/ParceledListSliceTest.java index 952bb5530c15..8874525ebc77 100644 --- a/core/tests/coretests/src/android/content/pm/ParceledListSliceTest.java +++ b/core/tests/coretests/src/android/content/pm/ParceledListSliceTest.java @@ -1,8 +1,25 @@ +/* + * Copyright (C) 2014 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.content.pm; import android.os.Parcel; import android.os.Parcelable; -import android.support.test.filters.LargeTest; + +import androidx.test.filters.LargeTest; import junit.framework.TestCase; diff --git a/core/tests/coretests/src/android/content/pm/RegisteredServicesCacheTest.java b/core/tests/coretests/src/android/content/pm/RegisteredServicesCacheTest.java index d3d1f22af3cb..365e97ded928 100644 --- a/core/tests/coretests/src/android/content/pm/RegisteredServicesCacheTest.java +++ b/core/tests/coretests/src/android/content/pm/RegisteredServicesCacheTest.java @@ -21,11 +21,12 @@ import android.os.FileUtils; import android.os.Parcel; import android.os.Parcelable; import android.os.UserHandle; -import android.support.test.filters.LargeTest; import android.test.AndroidTestCase; import android.util.AttributeSet; import android.util.SparseArray; +import androidx.test.filters.LargeTest; + import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; diff --git a/core/tests/coretests/src/android/content/pm/RemoveUnnecessaryAndroidTestBaseLibraryTest.java b/core/tests/coretests/src/android/content/pm/RemoveUnnecessaryAndroidTestBaseLibraryTest.java index 3dba4406de47..216b0c8950b7 100644 --- a/core/tests/coretests/src/android/content/pm/RemoveUnnecessaryAndroidTestBaseLibraryTest.java +++ b/core/tests/coretests/src/android/content/pm/RemoveUnnecessaryAndroidTestBaseLibraryTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.content.pm; import static android.content.pm.PackageBuilder.builder; @@ -20,7 +21,8 @@ import static android.content.pm.SharedLibraryNames.ANDROID_TEST_BASE; import android.content.pm.PackageBackwardCompatibility.RemoveUnnecessaryAndroidTestBaseLibrary; import android.os.Build; -import android.support.test.filters.SmallTest; + +import androidx.test.filters.SmallTest; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/content/pm/RemoveUnnecessaryOrgApacheHttpLegacyLibraryTest.java b/core/tests/coretests/src/android/content/pm/RemoveUnnecessaryOrgApacheHttpLegacyLibraryTest.java index 15b27d71f81d..fc60980bb796 100644 --- a/core/tests/coretests/src/android/content/pm/RemoveUnnecessaryOrgApacheHttpLegacyLibraryTest.java +++ b/core/tests/coretests/src/android/content/pm/RemoveUnnecessaryOrgApacheHttpLegacyLibraryTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.content.pm; import static android.content.pm.PackageBuilder.builder; @@ -20,7 +21,8 @@ import static android.content.pm.SharedLibraryNames.ORG_APACHE_HTTP_LEGACY; import android.content.pm.PackageBackwardCompatibility.RemoveUnnecessaryOrgApacheHttpLegacyLibrary; import android.os.Build; -import android.support.test.filters.SmallTest; + +import androidx.test.filters.SmallTest; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/content/pm/SignatureTest.java b/core/tests/coretests/src/android/content/pm/SignatureTest.java index a3fa1a9c06cf..f0b4af6fc44f 100644 --- a/core/tests/coretests/src/android/content/pm/SignatureTest.java +++ b/core/tests/coretests/src/android/content/pm/SignatureTest.java @@ -16,7 +16,7 @@ package android.content.pm; -import android.support.test.filters.LargeTest; +import androidx.test.filters.LargeTest; import junit.framework.TestCase; diff --git a/core/tests/coretests/src/android/content/pm/VerificationParamsTest.java b/core/tests/coretests/src/android/content/pm/VerificationParamsTest.java index 68942cbd54ad..f6527da0ba1a 100644 --- a/core/tests/coretests/src/android/content/pm/VerificationParamsTest.java +++ b/core/tests/coretests/src/android/content/pm/VerificationParamsTest.java @@ -16,12 +16,12 @@ package android.content.pm; -import android.content.pm.VerificationParams; import android.net.Uri; import android.os.Parcel; -import android.support.test.filters.LargeTest; import android.test.AndroidTestCase; +import androidx.test.filters.LargeTest; + /** * Tests the android.content.pm.VerificationParams class * diff --git a/core/tests/coretests/src/android/content/pm/VerifierDeviceIdentityTest.java b/core/tests/coretests/src/android/content/pm/VerifierDeviceIdentityTest.java index 88d7a59a98e2..e7cd02d866d5 100644 --- a/core/tests/coretests/src/android/content/pm/VerifierDeviceIdentityTest.java +++ b/core/tests/coretests/src/android/content/pm/VerifierDeviceIdentityTest.java @@ -17,7 +17,8 @@ package android.content.pm; import android.os.Parcel; -import android.support.test.filters.LargeTest; + +import androidx.test.filters.LargeTest; import java.util.Random; diff --git a/core/tests/coretests/src/android/content/pm/dex/DexMetadataHelperTest.java b/core/tests/coretests/src/android/content/pm/dex/DexMetadataHelperTest.java index e248a7771cab..1ca879cde6c8 100644 --- a/core/tests/coretests/src/android/content/pm/dex/DexMetadataHelperTest.java +++ b/core/tests/coretests/src/android/content/pm/dex/DexMetadataHelperTest.java @@ -29,12 +29,21 @@ import android.content.pm.PackageParser.Package; import android.content.pm.PackageParser.PackageLite; import android.content.pm.PackageParser.PackageParserException; import android.os.FileUtils; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import com.android.frameworks.coretests.R; +import libcore.testing.io.TestIoUtils; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -45,14 +54,6 @@ import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; -import libcore.testing.io.TestIoUtils; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - @SmallTest @RunWith(AndroidJUnit4.class) public class DexMetadataHelperTest { diff --git a/core/tests/coretests/src/android/content/res/ConfigurationBoundResourceCacheTest.java b/core/tests/coretests/src/android/content/res/ConfigurationBoundResourceCacheTest.java index 47554a68645a..47b14bbaa8fa 100644 --- a/core/tests/coretests/src/android/content/res/ConfigurationBoundResourceCacheTest.java +++ b/core/tests/coretests/src/android/content/res/ConfigurationBoundResourceCacheTest.java @@ -17,9 +17,10 @@ package android.content.res; import android.test.ActivityInstrumentationTestCase2; -import android.test.suitebuilder.annotation.SmallTest; import android.util.TypedValue; +import androidx.test.filters.SmallTest; + import com.android.frameworks.coretests.R; import java.lang.reflect.InvocationTargetException; diff --git a/core/tests/coretests/src/android/content/res/ConfigurationTest.java b/core/tests/coretests/src/android/content/res/ConfigurationTest.java index 72b9197089d7..2fc3e36e7948 100644 --- a/core/tests/coretests/src/android/content/res/ConfigurationTest.java +++ b/core/tests/coretests/src/android/content/res/ConfigurationTest.java @@ -13,19 +13,18 @@ * License for the specific language governing permissions and limitations under * the License. */ -package android.content.res; -import org.junit.runner.RunWith; -import org.junit.Test; -import org.junit.runners.JUnit4; +package android.content.res; -import android.content.res.Configuration; -import android.support.test.filters.SmallTest; import android.platform.test.annotations.Presubmit; +import androidx.test.filters.SmallTest; + import junit.framework.TestCase; -import static org.junit.Assert.assertEquals; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; /** * Build/install/run: bit FrameworksCoreTests:android.content.res.ConfigurationTest diff --git a/core/tests/coretests/src/android/content/res/FontResourcesParserTest.java b/core/tests/coretests/src/android/content/res/FontResourcesParserTest.java index 42ff2e94a24e..7ab9d7f4ffe1 100644 --- a/core/tests/coretests/src/android/content/res/FontResourcesParserTest.java +++ b/core/tests/coretests/src/android/content/res/FontResourcesParserTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.content.res; import static android.content.res.FontResourcesParser.FamilyResourceEntry; @@ -26,9 +27,10 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import android.app.Instrumentation; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import com.android.frameworks.coretests.R; diff --git a/core/tests/coretests/src/android/content/res/ResourcesLocaleTest.java b/core/tests/coretests/src/android/content/res/ResourcesLocaleTest.java index e85666eb1639..aa1a5341de57 100644 --- a/core/tests/coretests/src/android/content/res/ResourcesLocaleTest.java +++ b/core/tests/coretests/src/android/content/res/ResourcesLocaleTest.java @@ -13,14 +13,15 @@ * License for the specific language governing permissions and limitations under * the License. */ + package android.content.res; import android.os.FileUtils; import android.os.LocaleList; -import android.support.test.filters.SmallTest; import android.test.AndroidTestCase; import android.util.DisplayMetrics; -import android.view.Display; + +import androidx.test.filters.SmallTest; import com.android.frameworks.coretests.R; diff --git a/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java b/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java index b2ff9278d83b..a2dab996a8d7 100644 --- a/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java +++ b/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java @@ -13,18 +13,20 @@ * License for the specific language governing permissions and limitations under * the License. */ + package android.content.res; import android.annotation.NonNull; import android.app.ResourcesManager; import android.os.Binder; import android.os.LocaleList; -import android.support.test.filters.SmallTest; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.Display; import android.view.DisplayAdjustments; +import androidx.test.filters.SmallTest; + import junit.framework.TestCase; public class ResourcesManagerTest extends TestCase { diff --git a/core/tests/coretests/src/android/database/CursorWindowTest.java b/core/tests/coretests/src/android/database/CursorWindowTest.java index 075f5b7f1d6a..123da3e8703b 100644 --- a/core/tests/coretests/src/android/database/CursorWindowTest.java +++ b/core/tests/coretests/src/android/database/CursorWindowTest.java @@ -16,14 +16,14 @@ package android.database; -import android.test.suitebuilder.annotation.SmallTest; -import android.database.CursorWindow; import android.test.PerformanceTestCase; -import java.util.Arrays; +import androidx.test.filters.SmallTest; import junit.framework.TestCase; +import java.util.Arrays; + public class CursorWindowTest extends TestCase implements PerformanceTestCase { public boolean isPerformanceOnly() { return false; diff --git a/core/tests/coretests/src/android/database/DatabaseCursorTest.java b/core/tests/coretests/src/android/database/DatabaseCursorTest.java index 3507223b68ab..eb4fd70a1136 100644 --- a/core/tests/coretests/src/android/database/DatabaseCursorTest.java +++ b/core/tests/coretests/src/android/database/DatabaseCursorTest.java @@ -18,10 +18,6 @@ package android.database; import android.content.ContentValues; import android.content.Context; -import android.database.Cursor; -import android.database.CursorIndexOutOfBoundsException; -import android.database.DataSetObserver; -import android.database.DatabaseUtils; import android.database.sqlite.SQLiteCursor; import android.database.sqlite.SQLiteCursorDriver; import android.database.sqlite.SQLiteDatabase; @@ -29,11 +25,12 @@ import android.database.sqlite.SQLiteQuery; import android.os.Looper; import android.test.AndroidTestCase; import android.test.PerformanceTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.Suppress; import android.util.Log; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; + import java.io.File; import java.util.ArrayList; import java.util.Arrays; diff --git a/core/tests/coretests/src/android/database/DatabaseGeneralTest.java b/core/tests/coretests/src/android/database/DatabaseGeneralTest.java index 9d75c784fe41..49fb75bf6a45 100644 --- a/core/tests/coretests/src/android/database/DatabaseGeneralTest.java +++ b/core/tests/coretests/src/android/database/DatabaseGeneralTest.java @@ -25,16 +25,17 @@ import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDebug; import android.database.sqlite.SQLiteException; import android.os.Parcel; -import android.support.test.InstrumentationRegistry; import android.support.test.uiautomator.UiDevice; import android.test.AndroidTestCase; import android.test.PerformanceTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.SmallTest; import android.util.Log; import android.util.Pair; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; +import androidx.test.filters.SmallTest; + import junit.framework.Assert; import java.io.File; diff --git a/core/tests/coretests/src/android/database/DatabaseLocaleTest.java b/core/tests/coretests/src/android/database/DatabaseLocaleTest.java index b32829412cb5..ee7936fb8857 100644 --- a/core/tests/coretests/src/android/database/DatabaseLocaleTest.java +++ b/core/tests/coretests/src/android/database/DatabaseLocaleTest.java @@ -17,17 +17,17 @@ package android.database; import android.database.sqlite.SQLiteDatabase; -import android.database.Cursor; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.SmallTest; -import android.util.Log; import android.test.MoreAsserts; +import android.util.Log; -import java.util.ArrayList; -import java.util.Locale; +import androidx.test.filters.MediumTest; +import androidx.test.filters.SmallTest; import junit.framework.TestCase; +import java.util.ArrayList; +import java.util.Locale; + public class DatabaseLocaleTest extends TestCase { private SQLiteDatabase mDatabase; diff --git a/core/tests/coretests/src/android/database/DatabaseLockTest.java b/core/tests/coretests/src/android/database/DatabaseLockTest.java index 8d3cf5a13124..e8936c98392e 100644 --- a/core/tests/coretests/src/android/database/DatabaseLockTest.java +++ b/core/tests/coretests/src/android/database/DatabaseLockTest.java @@ -17,11 +17,13 @@ package android.database; import android.database.sqlite.SQLiteDatabase; -import android.test.suitebuilder.annotation.Suppress; +import android.test.AndroidTestCase; import android.util.Log; + +import androidx.test.filters.Suppress; + import java.io.File; import java.util.concurrent.atomic.AtomicInteger; -import android.test.AndroidTestCase; /* * This is a series of unit tests for database locks. diff --git a/core/tests/coretests/src/android/database/DatabaseStatementTest.java b/core/tests/coretests/src/android/database/DatabaseStatementTest.java index 895d715c8cc0..4b34650183e3 100644 --- a/core/tests/coretests/src/android/database/DatabaseStatementTest.java +++ b/core/tests/coretests/src/android/database/DatabaseStatementTest.java @@ -17,14 +17,14 @@ package android.database; import android.content.Context; -import android.database.Cursor; import android.database.sqlite.SQLiteConstraintException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDoneException; import android.database.sqlite.SQLiteStatement; import android.test.AndroidTestCase; import android.test.PerformanceTestCase; -import android.test.suitebuilder.annotation.MediumTest; + +import androidx.test.filters.MediumTest; import java.io.File; diff --git a/core/tests/coretests/src/android/database/DatabaseStressTest.java b/core/tests/coretests/src/android/database/DatabaseStressTest.java index 30e46e7dfb90..bfea1fc61eb7 100644 --- a/core/tests/coretests/src/android/database/DatabaseStressTest.java +++ b/core/tests/coretests/src/android/database/DatabaseStressTest.java @@ -17,11 +17,11 @@ package android.database; import android.content.Context; -import android.database.sqlite.*; +import android.database.sqlite.SQLiteDatabase; +import android.test.AndroidTestCase; import android.util.Log; -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.Suppress; +import androidx.test.filters.Suppress; import java.io.File; diff --git a/core/tests/coretests/src/android/database/DatabaseUtilsTest.java b/core/tests/coretests/src/android/database/DatabaseUtilsTest.java index 7c206d7eecf7..be156c8eb67a 100644 --- a/core/tests/coretests/src/android/database/DatabaseUtilsTest.java +++ b/core/tests/coretests/src/android/database/DatabaseUtilsTest.java @@ -20,7 +20,7 @@ import static android.database.DatabaseUtils.bindSelection; import static org.junit.Assert.assertEquals; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/database/RedactingCursorTest.java b/core/tests/coretests/src/android/database/RedactingCursorTest.java index 93998f3db05f..e2d2bae0e8b2 100644 --- a/core/tests/coretests/src/android/database/RedactingCursorTest.java +++ b/core/tests/coretests/src/android/database/RedactingCursorTest.java @@ -22,8 +22,9 @@ import static org.junit.Assert.assertTrue; import android.content.Context; import android.net.Uri; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/database/SQLiteOpenHelperTest.java b/core/tests/coretests/src/android/database/SQLiteOpenHelperTest.java index 9ed3f11b548f..730a3cb45856 100644 --- a/core/tests/coretests/src/android/database/SQLiteOpenHelperTest.java +++ b/core/tests/coretests/src/android/database/SQLiteOpenHelperTest.java @@ -26,11 +26,12 @@ import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabaseConfiguration; import android.database.sqlite.SQLiteDebug; import android.database.sqlite.SQLiteOpenHelper; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.util.Log; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/android/database/run_newdb_perf_test.sh b/core/tests/coretests/src/android/database/run_newdb_perf_test.sh index c5b2c97b572f..95f1f83bea10 100755 --- a/core/tests/coretests/src/android/database/run_newdb_perf_test.sh +++ b/core/tests/coretests/src/android/database/run_newdb_perf_test.sh @@ -23,7 +23,7 @@ echo "Running benchmark $RUN_N times" for (( i=0; i<$RUN_N; i++ )) do - adb shell am instrument -e class 'android.database.NewDatabasePerformanceTestSuite' -w 'com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner' + adb shell am instrument -e class 'android.database.NewDatabasePerformanceTestSuite' -w 'com.android.frameworks.coretests/androidx.test.runner.AndroidJUnitRunner' done adb logcat -d > /tmp/testlogcat.txt diff --git a/core/tests/coretests/src/android/database/sqlite/SQLiteCompatibilityWalFlagsTest.java b/core/tests/coretests/src/android/database/sqlite/SQLiteCompatibilityWalFlagsTest.java index 551a58ed7cb5..5dbcb3c46b50 100644 --- a/core/tests/coretests/src/android/database/sqlite/SQLiteCompatibilityWalFlagsTest.java +++ b/core/tests/coretests/src/android/database/sqlite/SQLiteCompatibilityWalFlagsTest.java @@ -22,9 +22,10 @@ import static org.junit.Assert.assertTrue; import android.content.Context; import android.database.DatabaseUtils; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Test; diff --git a/core/tests/coretests/src/android/database/sqlite/SQLiteConnectionPoolTest.java b/core/tests/coretests/src/android/database/sqlite/SQLiteConnectionPoolTest.java index ed14a5348ab4..f1d27d4a13ab 100644 --- a/core/tests/coretests/src/android/database/sqlite/SQLiteConnectionPoolTest.java +++ b/core/tests/coretests/src/android/database/sqlite/SQLiteConnectionPoolTest.java @@ -21,11 +21,12 @@ import static org.junit.Assert.assertTrue; import android.content.Context; import android.os.HandlerThread; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.util.Log; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/android/database/sqlite/SQLiteCursorTest.java b/core/tests/coretests/src/android/database/sqlite/SQLiteCursorTest.java index c52cf6ec5e5f..78d3c417dcf8 100644 --- a/core/tests/coretests/src/android/database/sqlite/SQLiteCursorTest.java +++ b/core/tests/coretests/src/android/database/sqlite/SQLiteCursorTest.java @@ -23,7 +23,8 @@ import android.database.Cursor; import android.database.CursorWindow; import android.platform.test.annotations.Presubmit; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.LargeTest; + +import androidx.test.filters.LargeTest; import java.io.File; import java.util.Arrays; diff --git a/core/tests/coretests/src/android/graphics/BitmapFactoryTest.java b/core/tests/coretests/src/android/graphics/BitmapFactoryTest.java index e9e2a4d098f0..564460e18294 100644 --- a/core/tests/coretests/src/android/graphics/BitmapFactoryTest.java +++ b/core/tests/coretests/src/android/graphics/BitmapFactoryTest.java @@ -17,14 +17,14 @@ package android.graphics; import android.os.ParcelFileDescriptor; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.filters.SmallTest; import junit.framework.TestCase; import java.io.ByteArrayOutputStream; import java.io.FileDescriptor; - public class BitmapFactoryTest extends TestCase { // tests that we can decode bitmaps from MemoryFiles diff --git a/core/tests/coretests/src/android/graphics/BitmapTest.java b/core/tests/coretests/src/android/graphics/BitmapTest.java index 3666dddb0782..e79d2ae1e194 100644 --- a/core/tests/coretests/src/android/graphics/BitmapTest.java +++ b/core/tests/coretests/src/android/graphics/BitmapTest.java @@ -16,11 +16,10 @@ package android.graphics; -import android.test.suitebuilder.annotation.SmallTest; +import androidx.test.filters.SmallTest; import junit.framework.TestCase; - public class BitmapTest extends TestCase { @SmallTest diff --git a/core/tests/coretests/src/android/graphics/ColorSpaceRendererTest.java b/core/tests/coretests/src/android/graphics/ColorSpaceRendererTest.java index 6e38fb685887..8e9b38cc5a1f 100644 --- a/core/tests/coretests/src/android/graphics/ColorSpaceRendererTest.java +++ b/core/tests/coretests/src/android/graphics/ColorSpaceRendererTest.java @@ -19,8 +19,8 @@ package android.graphics; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/graphics/ColorStateListTest.java b/core/tests/coretests/src/android/graphics/ColorStateListTest.java index 374d1421bdbc..1d34f9383818 100644 --- a/core/tests/coretests/src/android/graphics/ColorStateListTest.java +++ b/core/tests/coretests/src/android/graphics/ColorStateListTest.java @@ -19,7 +19,8 @@ package android.graphics; import android.content.res.ColorStateList; import android.content.res.Resources; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.filters.SmallTest; import com.android.frameworks.coretests.R; diff --git a/core/tests/coretests/src/android/graphics/FontFileUtilTest.java b/core/tests/coretests/src/android/graphics/FontFileUtilTest.java index 76267b23a0ca..1771671db26a 100644 --- a/core/tests/coretests/src/android/graphics/FontFileUtilTest.java +++ b/core/tests/coretests/src/android/graphics/FontFileUtilTest.java @@ -22,11 +22,12 @@ import android.content.Context; import android.content.res.AssetManager; import android.graphics.fonts.FontFileUtil; import android.graphics.fonts.FontVariationAxis; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; import android.util.Log; import android.util.Pair; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; + import org.junit.Test; import java.io.File; diff --git a/core/tests/coretests/src/android/graphics/GraphicsPerformanceTests.java b/core/tests/coretests/src/android/graphics/GraphicsPerformanceTests.java index 164c1aa770bd..3cfeb2546940 100644 --- a/core/tests/coretests/src/android/graphics/GraphicsPerformanceTests.java +++ b/core/tests/coretests/src/android/graphics/GraphicsPerformanceTests.java @@ -20,7 +20,8 @@ import android.content.Context; import android.content.res.Resources; import android.test.AndroidTestCase; import android.test.PerformanceTestCase; -import android.test.suitebuilder.annotation.Suppress; + +import androidx.test.filters.Suppress; import com.android.frameworks.coretests.R; diff --git a/core/tests/coretests/src/android/graphics/PaintTest.java b/core/tests/coretests/src/android/graphics/PaintTest.java index b5ed01f708b1..bf56df1c9441 100644 --- a/core/tests/coretests/src/android/graphics/PaintTest.java +++ b/core/tests/coretests/src/android/graphics/PaintTest.java @@ -18,9 +18,9 @@ package android.graphics; import static org.junit.Assert.assertNotEquals; -import android.graphics.Paint; import android.test.InstrumentationTestCase; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.filters.SmallTest; import java.util.Arrays; import java.util.HashSet; diff --git a/core/tests/coretests/src/android/graphics/PathOffsetTest.java b/core/tests/coretests/src/android/graphics/PathOffsetTest.java index 950f8731bae1..6cc42f6a3efc 100644 --- a/core/tests/coretests/src/android/graphics/PathOffsetTest.java +++ b/core/tests/coretests/src/android/graphics/PathOffsetTest.java @@ -16,13 +16,13 @@ package android.graphics; +import static org.junit.Assert.assertTrue; import android.graphics.Bitmap.Config; import android.graphics.Path.Direction; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; -import static org.junit.Assert.assertTrue; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/graphics/PathTest.java b/core/tests/coretests/src/android/graphics/PathTest.java index 78e4959da92a..c6d6d1ff90d5 100644 --- a/core/tests/coretests/src/android/graphics/PathTest.java +++ b/core/tests/coretests/src/android/graphics/PathTest.java @@ -16,11 +16,10 @@ package android.graphics; -import android.test.suitebuilder.annotation.SmallTest; +import androidx.test.filters.SmallTest; import junit.framework.TestCase; - public class PathTest extends TestCase { @SmallTest diff --git a/core/tests/coretests/src/android/graphics/RectTest.java b/core/tests/coretests/src/android/graphics/RectTest.java index d31d7d54940c..2918f44ad65d 100644 --- a/core/tests/coretests/src/android/graphics/RectTest.java +++ b/core/tests/coretests/src/android/graphics/RectTest.java @@ -23,8 +23,9 @@ import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertNull; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/graphics/ThreadBitmapTest.java b/core/tests/coretests/src/android/graphics/ThreadBitmapTest.java index 909a8d97df51..e1ca7dfb7cc2 100644 --- a/core/tests/coretests/src/android/graphics/ThreadBitmapTest.java +++ b/core/tests/coretests/src/android/graphics/ThreadBitmapTest.java @@ -16,7 +16,7 @@ package android.graphics; -import android.test.suitebuilder.annotation.LargeTest; +import androidx.test.filters.LargeTest; import junit.framework.TestCase; diff --git a/core/tests/coretests/src/android/graphics/TypefaceSystemFallbackTest.java b/core/tests/coretests/src/android/graphics/TypefaceSystemFallbackTest.java index 6fdb71fcbab0..c66bac6cc335 100644 --- a/core/tests/coretests/src/android/graphics/TypefaceSystemFallbackTest.java +++ b/core/tests/coretests/src/android/graphics/TypefaceSystemFallbackTest.java @@ -27,12 +27,13 @@ import android.graphics.fonts.Font; import android.graphics.fonts.FontCustomizationParser; import android.graphics.fonts.FontFamily; import android.graphics.fonts.SystemFonts; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.text.FontConfig; import android.util.ArrayMap; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/android/graphics/TypefaceTest.java b/core/tests/coretests/src/android/graphics/TypefaceTest.java index b0c7976f8014..2d16f826b243 100644 --- a/core/tests/coretests/src/android/graphics/TypefaceTest.java +++ b/core/tests/coretests/src/android/graphics/TypefaceTest.java @@ -22,13 +22,12 @@ import static org.junit.Assert.assertTrue; import android.content.Context; import android.content.res.AssetManager; import android.content.res.Resources; -import android.graphics.Paint; -import android.graphics.Typeface; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import com.android.frameworks.coretests.R; diff --git a/core/tests/coretests/src/android/graphics/drawable/AdaptiveIconDrawableTest.java b/core/tests/coretests/src/android/graphics/drawable/AdaptiveIconDrawableTest.java index 781e343e8139..3dc998709b8f 100644 --- a/core/tests/coretests/src/android/graphics/drawable/AdaptiveIconDrawableTest.java +++ b/core/tests/coretests/src/android/graphics/drawable/AdaptiveIconDrawableTest.java @@ -1,3 +1,19 @@ +/* + * 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 android.graphics.drawable; import android.content.res.Resources; @@ -11,11 +27,12 @@ import android.graphics.Path.Direction; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Region; -import android.support.test.filters.LargeTest; import android.test.AndroidTestCase; import android.util.Log; import android.util.PathParser; +import androidx.test.filters.LargeTest; + import org.junit.Test; import java.io.File; diff --git a/core/tests/coretests/src/android/graphics/drawable/DrawableWrapperTest.java b/core/tests/coretests/src/android/graphics/drawable/DrawableWrapperTest.java index 655efb5239eb..d0a6ff9251cc 100644 --- a/core/tests/coretests/src/android/graphics/drawable/DrawableWrapperTest.java +++ b/core/tests/coretests/src/android/graphics/drawable/DrawableWrapperTest.java @@ -24,8 +24,9 @@ import android.graphics.ColorFilter; import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffXfermode; import android.graphics.Xfermode; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/graphics/drawable/IconTest.java b/core/tests/coretests/src/android/graphics/drawable/IconTest.java index 64fadc03f0bb..2bdcc284154b 100644 --- a/core/tests/coretests/src/android/graphics/drawable/IconTest.java +++ b/core/tests/coretests/src/android/graphics/drawable/IconTest.java @@ -25,9 +25,10 @@ import android.os.Handler; import android.os.HandlerThread; import android.os.Parcel; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; import android.util.Log; +import androidx.test.filters.SmallTest; + import com.android.frameworks.coretests.R; import java.io.ByteArrayOutputStream; diff --git a/core/tests/coretests/src/android/hardware/display/AmbientBrightnessDayStatsTest.java b/core/tests/coretests/src/android/hardware/display/AmbientBrightnessDayStatsTest.java index f90ae340b2e9..0a25bd7e3f2c 100644 --- a/core/tests/coretests/src/android/hardware/display/AmbientBrightnessDayStatsTest.java +++ b/core/tests/coretests/src/android/hardware/display/AmbientBrightnessDayStatsTest.java @@ -23,8 +23,9 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import android.os.Parcel; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/hardware/display/BrightnessConfigurationTest.java b/core/tests/coretests/src/android/hardware/display/BrightnessConfigurationTest.java index dcc51e121b32..823fca5a68ad 100644 --- a/core/tests/coretests/src/android/hardware/display/BrightnessConfigurationTest.java +++ b/core/tests/coretests/src/android/hardware/display/BrightnessConfigurationTest.java @@ -22,10 +22,11 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import android.os.Parcel; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.util.Pair; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/hardware/display/VirtualDisplayTest.java b/core/tests/coretests/src/android/hardware/display/VirtualDisplayTest.java index f30b1a29c781..daf613976358 100644 --- a/core/tests/coretests/src/android/hardware/display/VirtualDisplayTest.java +++ b/core/tests/coretests/src/android/hardware/display/VirtualDisplayTest.java @@ -22,15 +22,12 @@ import android.graphics.Color; import android.graphics.PixelFormat; import android.graphics.Point; import android.graphics.drawable.ColorDrawable; -import android.hardware.display.DisplayManager; -import android.hardware.display.VirtualDisplay; import android.media.Image; import android.media.ImageReader; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.SystemClock; -import android.support.test.filters.LargeTest; import android.test.AndroidTestCase; import android.util.DisplayMetrics; import android.util.Log; @@ -40,6 +37,8 @@ import android.view.ViewGroup.LayoutParams; import android.view.WindowManager; import android.widget.ImageView; +import androidx.test.filters.LargeTest; + import java.nio.ByteBuffer; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; diff --git a/core/tests/coretests/src/android/hardware/hdmi/HdmiUtilsTest.java b/core/tests/coretests/src/android/hardware/hdmi/HdmiUtilsTest.java new file mode 100644 index 000000000000..16be0b0a27c1 --- /dev/null +++ b/core/tests/coretests/src/android/hardware/hdmi/HdmiUtilsTest.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2018 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.hardware.hdmi; + +import static com.google.common.truth.Truth.assertThat; + +import android.support.test.filters.SmallTest; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@SmallTest +@RunWith(JUnit4.class) +/** Tests for {@link HdmiUtils} class. */ +public class HdmiUtilsTest { + + @Test + public void pathToPort_isMe() { + int targetPhysicalAddress = 0x1000; + int myPhysicalAddress = 0x1000; + assertThat(HdmiUtils.getLocalPortFromPhysicalAddress( + targetPhysicalAddress, myPhysicalAddress)).isEqualTo( + HdmiUtils.TARGET_SAME_PHYSICAL_ADDRESS); + } + + @Test + public void pathToPort_isDirectlyBelow() { + int targetPhysicalAddress = 0x1100; + int myPhysicalAddress = 0x1000; + assertThat(HdmiUtils.getLocalPortFromPhysicalAddress( + targetPhysicalAddress, myPhysicalAddress)).isEqualTo(1); + } + + @Test + public void pathToPort_isBelow() { + int targetPhysicalAddress = 0x1110; + int myPhysicalAddress = 0x1000; + assertThat(HdmiUtils.getLocalPortFromPhysicalAddress( + targetPhysicalAddress, myPhysicalAddress)).isEqualTo(1); + } + + @Test + public void pathToPort_neitherMeNorBelow() { + int targetPhysicalAddress = 0x3000; + int myPhysicalAddress = 0x2000; + assertThat(HdmiUtils.getLocalPortFromPhysicalAddress( + targetPhysicalAddress, myPhysicalAddress)).isEqualTo( + HdmiUtils.TARGET_NOT_UNDER_LOCAL_DEVICE); + + targetPhysicalAddress = 0x2200; + myPhysicalAddress = 0x3300; + assertThat(HdmiUtils.getLocalPortFromPhysicalAddress( + targetPhysicalAddress, myPhysicalAddress)).isEqualTo( + HdmiUtils.TARGET_NOT_UNDER_LOCAL_DEVICE); + + targetPhysicalAddress = 0x2213; + myPhysicalAddress = 0x2212; + assertThat(HdmiUtils.getLocalPortFromPhysicalAddress( + targetPhysicalAddress, myPhysicalAddress)).isEqualTo( + HdmiUtils.TARGET_NOT_UNDER_LOCAL_DEVICE); + + targetPhysicalAddress = 0x2340; + myPhysicalAddress = 0x2310; + assertThat(HdmiUtils.getLocalPortFromPhysicalAddress( + targetPhysicalAddress, myPhysicalAddress)).isEqualTo( + HdmiUtils.TARGET_NOT_UNDER_LOCAL_DEVICE); + } +} diff --git a/core/tests/coretests/src/android/metrics/LogMakerTest.java b/core/tests/coretests/src/android/metrics/LogMakerTest.java index 3be776deb9f1..aabfc2872269 100644 --- a/core/tests/coretests/src/android/metrics/LogMakerTest.java +++ b/core/tests/coretests/src/android/metrics/LogMakerTest.java @@ -13,9 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.metrics; -import android.support.test.filters.LargeTest; +import androidx.test.filters.LargeTest; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; diff --git a/core/tests/coretests/src/android/metrics/MetricsReaderTest.java b/core/tests/coretests/src/android/metrics/MetricsReaderTest.java index 784a12fa1f57..96dac648c01e 100644 --- a/core/tests/coretests/src/android/metrics/MetricsReaderTest.java +++ b/core/tests/coretests/src/android/metrics/MetricsReaderTest.java @@ -13,10 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.metrics; import android.metrics.MetricsReader.Event; -import android.support.test.filters.LargeTest; + +import androidx.test.filters.LargeTest; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; diff --git a/core/tests/coretests/src/android/net/LocalSocketTest.java b/core/tests/coretests/src/android/net/LocalSocketTest.java index 1286b137cc1f..91722377df09 100644 --- a/core/tests/coretests/src/android/net/LocalSocketTest.java +++ b/core/tests/coretests/src/android/net/LocalSocketTest.java @@ -16,12 +16,9 @@ package android.net; -import android.net.Credentials; -import android.net.LocalServerSocket; -import android.net.LocalSocket; -import android.net.LocalSocketAddress; import android.test.MoreAsserts; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.filters.SmallTest; import junit.framework.TestCase; diff --git a/core/tests/coretests/src/android/net/NetworkKeyTest.java b/core/tests/coretests/src/android/net/NetworkKeyTest.java index fff23a04db9f..0f1c71d7c601 100644 --- a/core/tests/coretests/src/android/net/NetworkKeyTest.java +++ b/core/tests/coretests/src/android/net/NetworkKeyTest.java @@ -1,3 +1,19 @@ +/* + * Copyright (C) 2014 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.net; import static org.junit.Assert.assertEquals; @@ -7,7 +23,8 @@ import static org.mockito.Mockito.when; import android.net.wifi.ScanResult; import android.net.wifi.WifiInfo; import android.net.wifi.WifiSsid; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/android/net/NetworkPolicyManagerTest.java b/core/tests/coretests/src/android/net/NetworkPolicyManagerTest.java index c6758ce1950d..29e212f4839e 100644 --- a/core/tests/coretests/src/android/net/NetworkPolicyManagerTest.java +++ b/core/tests/coretests/src/android/net/NetworkPolicyManagerTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.net; import static android.net.NetworkPolicyManager.MASK_ALL_NETWORKS; diff --git a/core/tests/coretests/src/android/net/NetworkRecommendationProviderTest.java b/core/tests/coretests/src/android/net/NetworkRecommendationProviderTest.java index ff9816ad090c..3e45a79951d3 100644 --- a/core/tests/coretests/src/android/net/NetworkRecommendationProviderTest.java +++ b/core/tests/coretests/src/android/net/NetworkRecommendationProviderTest.java @@ -1,3 +1,19 @@ +/* + * Copyright (C) 2016 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.net; import static junit.framework.Assert.assertFalse; @@ -9,7 +25,8 @@ import static org.mockito.Matchers.eq; import android.Manifest.permission; import android.content.Context; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/android/net/SSLCertificateSocketFactoryTest.java b/core/tests/coretests/src/android/net/SSLCertificateSocketFactoryTest.java index 5cbf02a79083..bc12e727c5f0 100644 --- a/core/tests/coretests/src/android/net/SSLCertificateSocketFactoryTest.java +++ b/core/tests/coretests/src/android/net/SSLCertificateSocketFactoryTest.java @@ -19,7 +19,7 @@ package android.net; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/net/SSLSessionCacheTest.java b/core/tests/coretests/src/android/net/SSLSessionCacheTest.java index 11d066b3afb0..eec09e65a501 100644 --- a/core/tests/coretests/src/android/net/SSLSessionCacheTest.java +++ b/core/tests/coretests/src/android/net/SSLSessionCacheTest.java @@ -19,10 +19,10 @@ package android.net; import com.android.org.conscrypt.ClientSessionContext; import com.android.org.conscrypt.SSLClientSessionCache; -import org.mockito.Mockito; - import junit.framework.TestCase; +import org.mockito.Mockito; + import java.security.KeyManagementException; import java.security.SecureRandom; diff --git a/core/tests/coretests/src/android/net/ScoredNetworkTest.java b/core/tests/coretests/src/android/net/ScoredNetworkTest.java index 109f32e1a48e..d984d86e1147 100644 --- a/core/tests/coretests/src/android/net/ScoredNetworkTest.java +++ b/core/tests/coretests/src/android/net/ScoredNetworkTest.java @@ -16,11 +16,17 @@ package android.net; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import android.os.Bundle; import android.os.Parcel; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/net/SntpClientTest.java b/core/tests/coretests/src/android/net/SntpClientTest.java index d72738c6e32c..87edb6e01425 100644 --- a/core/tests/coretests/src/android/net/SntpClientTest.java +++ b/core/tests/coretests/src/android/net/SntpClientTest.java @@ -20,9 +20,10 @@ import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; -import android.support.test.runner.AndroidJUnit4; import android.util.Log; +import androidx.test.runner.AndroidJUnit4; + import libcore.util.HexEncoding; import org.junit.Before; diff --git a/core/tests/coretests/src/android/net/UriTest.java b/core/tests/coretests/src/android/net/UriTest.java index ea0347d67ad7..a33de7bb2d9d 100644 --- a/core/tests/coretests/src/android/net/UriTest.java +++ b/core/tests/coretests/src/android/net/UriTest.java @@ -18,7 +18,8 @@ package android.net; import android.content.ContentUris; import android.os.Parcel; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.filters.SmallTest; import junit.framework.TestCase; diff --git a/core/tests/coretests/src/android/net/WebAddressTest.java b/core/tests/coretests/src/android/net/WebAddressTest.java index 6fcb97ea8b5f..70a62533d8e1 100644 --- a/core/tests/coretests/src/android/net/WebAddressTest.java +++ b/core/tests/coretests/src/android/net/WebAddressTest.java @@ -16,8 +16,8 @@ package android.net; -import android.net.WebAddress; -import android.test.suitebuilder.annotation.SmallTest; +import androidx.test.filters.SmallTest; + import junit.framework.TestCase; public class WebAddressTest extends TestCase { diff --git a/core/tests/coretests/src/android/net/http/SslCertificateTest.java b/core/tests/coretests/src/android/net/http/SslCertificateTest.java index 6a30c6c5afdf..1beb1de0075c 100644 --- a/core/tests/coretests/src/android/net/http/SslCertificateTest.java +++ b/core/tests/coretests/src/android/net/http/SslCertificateTest.java @@ -17,12 +17,13 @@ package android.net.http; -import android.net.http.SslCertificate; -import android.test.suitebuilder.annotation.LargeTest; +import androidx.test.filters.LargeTest; + +import junit.framework.TestCase; + import java.io.ByteArrayInputStream; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; -import junit.framework.TestCase; public class SslCertificateTest extends TestCase { diff --git a/core/tests/coretests/src/android/os/AidlTest.java b/core/tests/coretests/src/android/os/AidlTest.java index bf11d56de045..4c5141537c6a 100644 --- a/core/tests/coretests/src/android/os/AidlTest.java +++ b/core/tests/coretests/src/android/os/AidlTest.java @@ -16,11 +16,10 @@ package android.os; -import android.os.IInterface; -import android.os.Parcel; -import android.os.Parcelable; -import android.test.suitebuilder.annotation.SmallTest; +import androidx.test.filters.SmallTest; + import com.google.android.collect.Lists; + import junit.framework.TestCase; import java.util.List; diff --git a/core/tests/coretests/src/android/os/BinderProxyCountingTest.java b/core/tests/coretests/src/android/os/BinderProxyCountingTest.java index 6cdb35abce5a..ce6ad87a310e 100644 --- a/core/tests/coretests/src/android/os/BinderProxyCountingTest.java +++ b/core/tests/coretests/src/android/os/BinderProxyCountingTest.java @@ -14,7 +14,6 @@ * limitations under the License. */ - package android.os; import static org.junit.Assert.assertEquals; @@ -25,12 +24,13 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.LargeTest; -import android.support.test.runner.AndroidJUnit4; import android.support.test.uiautomator.UiDevice; import android.util.Log; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.LargeTest; +import androidx.test.runner.AndroidJUnit4; + import com.android.frameworks.coretests.aidl.IBpcCallbackObserver; import com.android.frameworks.coretests.aidl.IBpcTestAppCmdService; import com.android.frameworks.coretests.aidl.IBpcTestServiceCmdService; @@ -63,7 +63,7 @@ import java.util.function.Consumer; * Install: adb install -r \ * ${ANDROID_PRODUCT_OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk * Run: adb shell am instrument -e class android.os.BinderProxyCountingTest -w \ - * com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner + * com.android.frameworks.coretests/androidx.test.runner.AndroidJUnitRunner * * or * diff --git a/core/tests/coretests/src/android/os/BinderProxyTest.java b/core/tests/coretests/src/android/os/BinderProxyTest.java index 4c36b5c359a2..aceda2d0524b 100644 --- a/core/tests/coretests/src/android/os/BinderProxyTest.java +++ b/core/tests/coretests/src/android/os/BinderProxyTest.java @@ -19,7 +19,8 @@ package android.os; import android.annotation.Nullable; import android.content.Context; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.MediumTest; + +import androidx.test.filters.MediumTest; public class BinderProxyTest extends AndroidTestCase { private static class CountingListener implements Binder.ProxyTransactListener { diff --git a/core/tests/coretests/src/android/os/BinderTest.java b/core/tests/coretests/src/android/os/BinderTest.java index 6c9c3c111ff8..a354195c75a3 100644 --- a/core/tests/coretests/src/android/os/BinderTest.java +++ b/core/tests/coretests/src/android/os/BinderTest.java @@ -16,7 +16,7 @@ package android.os; -import android.test.suitebuilder.annotation.SmallTest; +import androidx.test.filters.SmallTest; import junit.framework.TestCase; diff --git a/core/tests/coretests/src/android/os/BinderThreadPriorityService.java b/core/tests/coretests/src/android/os/BinderThreadPriorityService.java index 47a4483b8a29..ed42058d3ef4 100644 --- a/core/tests/coretests/src/android/os/BinderThreadPriorityService.java +++ b/core/tests/coretests/src/android/os/BinderThreadPriorityService.java @@ -18,7 +18,6 @@ package android.os; import android.app.Service; import android.content.Intent; -import android.text.TextUtils; import android.util.Log; /** diff --git a/core/tests/coretests/src/android/os/BinderThreadPriorityTest.java b/core/tests/coretests/src/android/os/BinderThreadPriorityTest.java index 56e977c7d687..48c9df65da61 100644 --- a/core/tests/coretests/src/android/os/BinderThreadPriorityTest.java +++ b/core/tests/coretests/src/android/os/BinderThreadPriorityTest.java @@ -21,7 +21,6 @@ import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.util.Log; import java.io.File; diff --git a/core/tests/coretests/src/android/os/BinderWorkSourceTest.java b/core/tests/coretests/src/android/os/BinderWorkSourceTest.java index 5664df6e9744..e16a3dbe4a26 100644 --- a/core/tests/coretests/src/android/os/BinderWorkSourceTest.java +++ b/core/tests/coretests/src/android/os/BinderWorkSourceTest.java @@ -24,9 +24,10 @@ import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.platform.test.annotations.Presubmit; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.LargeTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.LargeTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Before; diff --git a/core/tests/coretests/src/android/os/BrightnessLimit.java b/core/tests/coretests/src/android/os/BrightnessLimit.java index fabcf3d920a9..5a3724f7aa24 100644 --- a/core/tests/coretests/src/android/os/BrightnessLimit.java +++ b/core/tests/coretests/src/android/os/BrightnessLimit.java @@ -18,7 +18,6 @@ package android.os; import android.app.Activity; import android.hardware.display.DisplayManager; -import android.os.Bundle; import android.provider.Settings; import android.view.View; import android.view.View.OnClickListener; diff --git a/core/tests/coretests/src/android/os/BroadcasterTest.java b/core/tests/coretests/src/android/os/BroadcasterTest.java index 551ea8d7d5d4..b4c47af93355 100644 --- a/core/tests/coretests/src/android/os/BroadcasterTest.java +++ b/core/tests/coretests/src/android/os/BroadcasterTest.java @@ -16,11 +16,8 @@ package android.os; -import android.os.Broadcaster; -import android.os.Handler; -import android.os.Message; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.SmallTest; +import androidx.test.filters.MediumTest; + import junit.framework.TestCase; public class BroadcasterTest extends TestCase { diff --git a/core/tests/coretests/src/android/os/BuildTest.java b/core/tests/coretests/src/android/os/BuildTest.java index 37586279d980..decc76869a53 100644 --- a/core/tests/coretests/src/android/os/BuildTest.java +++ b/core/tests/coretests/src/android/os/BuildTest.java @@ -16,9 +16,8 @@ package android.os; -import android.os.Build; -import android.test.suitebuilder.annotation.SmallTest; -import android.util.Log; +import androidx.test.filters.SmallTest; + import junit.framework.Assert; import junit.framework.TestCase; diff --git a/core/tests/coretests/src/android/os/BundleTest.java b/core/tests/coretests/src/android/os/BundleTest.java index 9fcf96d6f3ae..e4dc99347802 100644 --- a/core/tests/coretests/src/android/os/BundleTest.java +++ b/core/tests/coretests/src/android/os/BundleTest.java @@ -20,8 +20,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import android.support.test.runner.AndroidJUnit4; -import android.test.suitebuilder.annotation.SmallTest; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/os/EnvironmentTest.java b/core/tests/coretests/src/android/os/EnvironmentTest.java index 5189df574a33..d98ceaf57dd9 100644 --- a/core/tests/coretests/src/android/os/EnvironmentTest.java +++ b/core/tests/coretests/src/android/os/EnvironmentTest.java @@ -25,8 +25,9 @@ import static android.os.Environment.classifyExternalStorageDirectory; import static org.junit.Assert.assertEquals; import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Before; diff --git a/core/tests/coretests/src/android/os/FileObserverTest.java b/core/tests/coretests/src/android/os/FileObserverTest.java index 93e27af44170..ece7645b7389 100644 --- a/core/tests/coretests/src/android/os/FileObserverTest.java +++ b/core/tests/coretests/src/android/os/FileObserverTest.java @@ -16,13 +16,14 @@ package android.os; -import com.google.android.collect.Lists; -import com.google.android.collect.Maps; - import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.util.Log; +import androidx.test.filters.MediumTest; + +import com.google.android.collect.Lists; +import com.google.android.collect.Maps; + import java.io.File; import java.io.FileOutputStream; import java.util.Iterator; diff --git a/core/tests/coretests/src/android/os/FileUtilsTest.java b/core/tests/coretests/src/android/os/FileUtilsTest.java index 514ea0cc013e..5bce227cdf48 100644 --- a/core/tests/coretests/src/android/os/FileUtilsTest.java +++ b/core/tests/coretests/src/android/os/FileUtilsTest.java @@ -51,8 +51,9 @@ import static org.junit.Assert.fail; import android.content.Context; import android.os.FileUtils.MemoryPipe; import android.provider.DocumentsContract.Document; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.runner.AndroidJUnit4; import libcore.io.Streams; diff --git a/core/tests/coretests/src/android/os/HandlerTester.java b/core/tests/coretests/src/android/os/HandlerTester.java index a216a0bf7169..fa442f474d6e 100644 --- a/core/tests/coretests/src/android/os/HandlerTester.java +++ b/core/tests/coretests/src/android/os/HandlerTester.java @@ -16,10 +16,6 @@ package android.os; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; - public abstract class HandlerTester extends Thread { public abstract void go(); public abstract void handleMessage(Message msg); diff --git a/core/tests/coretests/src/android/os/HandlerThreadTest.java b/core/tests/coretests/src/android/os/HandlerThreadTest.java index 9772aa427999..93cfc40d555e 100644 --- a/core/tests/coretests/src/android/os/HandlerThreadTest.java +++ b/core/tests/coretests/src/android/os/HandlerThreadTest.java @@ -16,13 +16,9 @@ package android.os; +import androidx.test.filters.MediumTest; + import junit.framework.TestCase; -import android.os.Handler; -import android.os.HandlerThread; -import android.os.Message; -import android.os.Process; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.SmallTest; public class HandlerThreadTest extends TestCase { private static final int TEST_WHAT = 1; diff --git a/core/tests/coretests/src/android/os/IdleHandlerTest.java b/core/tests/coretests/src/android/os/IdleHandlerTest.java index 6c0a862aa2ea..d8886c97838e 100644 --- a/core/tests/coretests/src/android/os/IdleHandlerTest.java +++ b/core/tests/coretests/src/android/os/IdleHandlerTest.java @@ -16,11 +16,10 @@ package android.os; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; import android.os.MessageQueue.IdleHandler; -import android.test.suitebuilder.annotation.MediumTest; + +import androidx.test.filters.MediumTest; + import junit.framework.TestCase; public class IdleHandlerTest extends TestCase { diff --git a/core/tests/coretests/src/android/os/LocaleListTest.java b/core/tests/coretests/src/android/os/LocaleListTest.java index 17ef7730f452..1f00a7a12c54 100644 --- a/core/tests/coretests/src/android/os/LocaleListTest.java +++ b/core/tests/coretests/src/android/os/LocaleListTest.java @@ -13,14 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package android.os; -import android.test.suitebuilder.annotation.SmallTest; +package android.os; -import java.util.Locale; +import androidx.test.filters.SmallTest; import junit.framework.TestCase; +import java.util.Locale; + public class LocaleListTest extends TestCase { @SmallTest public void testConstructor() throws Exception { diff --git a/core/tests/coretests/src/android/os/MemoryFileTest.java b/core/tests/coretests/src/android/os/MemoryFileTest.java index 20b298d639d2..05c2995fa158 100644 --- a/core/tests/coretests/src/android/os/MemoryFileTest.java +++ b/core/tests/coretests/src/android/os/MemoryFileTest.java @@ -17,8 +17,9 @@ package android.os; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.filters.LargeTest; +import androidx.test.filters.SmallTest; import java.io.IOException; import java.io.InputStream; diff --git a/core/tests/coretests/src/android/os/MessageQueueTest.java b/core/tests/coretests/src/android/os/MessageQueueTest.java index 1cd1020bfe3a..2c5588e6ed0d 100644 --- a/core/tests/coretests/src/android/os/MessageQueueTest.java +++ b/core/tests/coretests/src/android/os/MessageQueueTest.java @@ -16,11 +16,9 @@ package android.os; -import android.os.Handler; -import android.os.Message; -import android.os.SystemClock; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.Suppress; +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; + import junit.framework.TestCase; @Suppress // Failing. diff --git a/core/tests/coretests/src/android/os/MessengerService.java b/core/tests/coretests/src/android/os/MessengerService.java index f15e13408084..db3347197d90 100644 --- a/core/tests/coretests/src/android/os/MessengerService.java +++ b/core/tests/coretests/src/android/os/MessengerService.java @@ -18,11 +18,6 @@ package android.os; import android.app.Service; import android.content.Intent; -import android.os.RemoteException; -import android.os.IBinder; -import android.os.Handler; -import android.os.Message; -import android.os.Messenger; public class MessengerService extends Service { private final Handler mHandler = new Handler() { diff --git a/core/tests/coretests/src/android/os/MessengerTest.java b/core/tests/coretests/src/android/os/MessengerTest.java index 473ffe2298b3..9143ff1d1017 100644 --- a/core/tests/coretests/src/android/os/MessengerTest.java +++ b/core/tests/coretests/src/android/os/MessengerTest.java @@ -20,13 +20,9 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; -import android.os.RemoteException; -import android.os.Handler; -import android.os.IBinder; -import android.os.Message; -import android.os.Messenger; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.MediumTest; + +import androidx.test.filters.MediumTest; public class MessengerTest extends AndroidTestCase { private Messenger mServiceMessenger; diff --git a/core/tests/coretests/src/android/os/OsTests.java b/core/tests/coretests/src/android/os/OsTests.java index 2b841269e5ae..08fb945857e9 100644 --- a/core/tests/coretests/src/android/os/OsTests.java +++ b/core/tests/coretests/src/android/os/OsTests.java @@ -16,12 +16,8 @@ package android.os; -import com.google.android.collect.Lists; import junit.framework.TestSuite; -import java.util.Enumeration; -import java.util.List; - public class OsTests { public static TestSuite suite() { TestSuite suite = new TestSuite(OsTests.class.getName()); diff --git a/core/tests/coretests/src/android/os/ParcelNullabilityTest.java b/core/tests/coretests/src/android/os/ParcelNullabilityTest.java index 516dc0ab135c..a6b296d37f82 100644 --- a/core/tests/coretests/src/android/os/ParcelNullabilityTest.java +++ b/core/tests/coretests/src/android/os/ParcelNullabilityTest.java @@ -20,10 +20,11 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import android.support.test.runner.AndroidJUnit4; -import android.test.suitebuilder.annotation.SmallTest; import android.util.ArrayMap; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/os/PatternMatcherTest.java b/core/tests/coretests/src/android/os/PatternMatcherTest.java index 9645ccc11b76..82350cd5ffdf 100644 --- a/core/tests/coretests/src/android/os/PatternMatcherTest.java +++ b/core/tests/coretests/src/android/os/PatternMatcherTest.java @@ -1,9 +1,27 @@ +/* + * Copyright (C) 2016 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.os; -import android.test.suitebuilder.annotation.SmallTest; +import androidx.test.filters.SmallTest; + import junit.framework.TestCase; -import org.junit.runner.RunWith; + import org.junit.Test; +import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @RunWith(JUnit4.class) diff --git a/core/tests/coretests/src/android/os/PerformanceCollectorTest.java b/core/tests/coretests/src/android/os/PerformanceCollectorTest.java index 7533c84673de..38ad90f11a23 100644 --- a/core/tests/coretests/src/android/os/PerformanceCollectorTest.java +++ b/core/tests/coretests/src/android/os/PerformanceCollectorTest.java @@ -17,15 +17,16 @@ package android.os; import android.os.PerformanceCollector.PerformanceResultsWriter; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.filters.MediumTest; +import androidx.test.filters.SmallTest; + +import junit.framework.TestCase; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Random; -import junit.framework.TestCase; - public class PerformanceCollectorTest extends TestCase { private PerformanceCollector mPerfCollector; diff --git a/core/tests/coretests/src/android/os/PowerManagerTest.java b/core/tests/coretests/src/android/os/PowerManagerTest.java index a828f4418515..1b587dd92db0 100644 --- a/core/tests/coretests/src/android/os/PowerManagerTest.java +++ b/core/tests/coretests/src/android/os/PowerManagerTest.java @@ -21,10 +21,11 @@ import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.verify; import android.content.Context; -import android.support.test.InstrumentationRegistry; import android.support.test.uiautomator.UiDevice; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; import org.junit.After; import org.junit.Test; diff --git a/core/tests/coretests/src/android/os/PowerManagerVrTest.java b/core/tests/coretests/src/android/os/PowerManagerVrTest.java index e01e5fa4faee..5d2c65b0153c 100644 --- a/core/tests/coretests/src/android/os/PowerManagerVrTest.java +++ b/core/tests/coretests/src/android/os/PowerManagerVrTest.java @@ -19,16 +19,14 @@ package android.os; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; -import android.os.PowerManager; -import android.os.RemoteException; -import android.os.ServiceManager; import android.provider.Settings; -import android.service.dreams.IDreamManager; import android.service.dreams.DreamService; -import android.support.test.filters.MediumTest; -import android.support.test.filters.SmallTest; +import android.service.dreams.IDreamManager; import android.test.ActivityInstrumentationTestCase2; +import androidx.test.filters.MediumTest; +import androidx.test.filters.SmallTest; + /** * Tests dream aspects of PowerManager. */ diff --git a/core/tests/coretests/src/android/os/ProcessTest.java b/core/tests/coretests/src/android/os/ProcessTest.java index 1f5b7c829831..b749e715316a 100644 --- a/core/tests/coretests/src/android/os/ProcessTest.java +++ b/core/tests/coretests/src/android/os/ProcessTest.java @@ -17,14 +17,10 @@ package android.os; -import android.os.Process; -import android.os.UserHandle; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.SmallTest; +import androidx.test.filters.MediumTest; import junit.framework.TestCase; - public class ProcessTest extends TestCase { @MediumTest diff --git a/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java b/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java index 9e1523165925..d5163e193510 100644 --- a/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java +++ b/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java @@ -24,10 +24,11 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; import android.system.Os; +import androidx.test.InstrumentationRegistry; +import androidx.test.runner.AndroidJUnit4; + import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/android/os/SetPersistentVrThreadTest.java b/core/tests/coretests/src/android/os/SetPersistentVrThreadTest.java index 9e445541ad3a..8085993389bb 100644 --- a/core/tests/coretests/src/android/os/SetPersistentVrThreadTest.java +++ b/core/tests/coretests/src/android/os/SetPersistentVrThreadTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.os; import android.app.ActivityManager; @@ -20,10 +21,10 @@ import android.app.VrManager; import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; -import android.os.Process; import android.provider.Settings; import android.test.ActivityInstrumentationTestCase2; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.filters.SmallTest; /** * Tests ActivityManager#setPersistentVrThread and ActivityManager#setVrThread's diff --git a/core/tests/coretests/src/android/os/TestHandlerThread.java b/core/tests/coretests/src/android/os/TestHandlerThread.java index 7e84af363a86..8c0330b4bb45 100644 --- a/core/tests/coretests/src/android/os/TestHandlerThread.java +++ b/core/tests/coretests/src/android/os/TestHandlerThread.java @@ -16,11 +16,6 @@ package android.os; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; -import android.os.MessageQueue.IdleHandler; - abstract class TestHandlerThread { private boolean mDone = false; private boolean mSuccess = false; diff --git a/core/tests/coretests/src/android/os/TestVrActivity.java b/core/tests/coretests/src/android/os/TestVrActivity.java index 33ff1645b37b..75df7c22fe65 100644 --- a/core/tests/coretests/src/android/os/TestVrActivity.java +++ b/core/tests/coretests/src/android/os/TestVrActivity.java @@ -17,7 +17,6 @@ package android.os; import android.app.Activity; -import android.os.Bundle; import android.service.vr.VrListenerService; import java.util.concurrent.CountDownLatch; diff --git a/core/tests/coretests/src/android/os/TraceTest.java b/core/tests/coretests/src/android/os/TraceTest.java index 1541553f36f1..5cad549d39bf 100644 --- a/core/tests/coretests/src/android/os/TraceTest.java +++ b/core/tests/coretests/src/android/os/TraceTest.java @@ -16,13 +16,13 @@ package android.os; -import android.os.Debug; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.SmallTest; -import android.test.suitebuilder.annotation.Suppress; import android.util.Log; +import androidx.test.filters.LargeTest; +import androidx.test.filters.SmallTest; +import androidx.test.filters.Suppress; + /** * This class is used to test the native tracing support. Run this test * while tracing on the emulator and then run traceview to view the trace. diff --git a/core/tests/coretests/src/android/os/UserHandleTest.java b/core/tests/coretests/src/android/os/UserHandleTest.java index af559fddd48a..4a1cdbfe3114 100644 --- a/core/tests/coretests/src/android/os/UserHandleTest.java +++ b/core/tests/coretests/src/android/os/UserHandleTest.java @@ -25,7 +25,7 @@ import static android.os.UserHandle.getUserId; import static org.junit.Assert.assertEquals; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/os/VintfObjectTest.java b/core/tests/coretests/src/android/os/VintfObjectTest.java index 44510c2379f5..af3660a6dab9 100644 --- a/core/tests/coretests/src/android/os/VintfObjectTest.java +++ b/core/tests/coretests/src/android/os/VintfObjectTest.java @@ -16,7 +16,6 @@ package android.os; -import junit.framework.Assert; import junit.framework.TestCase; public class VintfObjectTest extends TestCase { diff --git a/core/tests/coretests/src/android/os/storage/StorageManagerIntegrationTest.java b/core/tests/coretests/src/android/os/storage/StorageManagerIntegrationTest.java index 3ec297c27a2a..62f2ac28a601 100644 --- a/core/tests/coretests/src/android/os/storage/StorageManagerIntegrationTest.java +++ b/core/tests/coretests/src/android/os/storage/StorageManagerIntegrationTest.java @@ -19,7 +19,8 @@ package android.os.storage; import android.os.ParcelFileDescriptor; import android.os.ProxyFileDescriptorCallback; import android.system.ErrnoException; -import android.test.suitebuilder.annotation.LargeTest; + +import androidx.test.filters.LargeTest; import com.android.frameworks.coretests.R; diff --git a/core/tests/coretests/src/android/preference/ListPreferenceTest.java b/core/tests/coretests/src/android/preference/ListPreferenceTest.java index 72f62f167989..51dbb64244fc 100644 --- a/core/tests/coretests/src/android/preference/ListPreferenceTest.java +++ b/core/tests/coretests/src/android/preference/ListPreferenceTest.java @@ -16,10 +16,10 @@ package android.preference; -import android.preference.ListPreference; -import android.support.test.filters.LargeTest; import android.test.AndroidTestCase; +import androidx.test.filters.LargeTest; + @LargeTest public class ListPreferenceTest extends AndroidTestCase { public void testListPreferenceSummaryFromEntries() { diff --git a/core/tests/coretests/src/android/preference/PreferenceIconSpaceTest.java b/core/tests/coretests/src/android/preference/PreferenceIconSpaceTest.java index 654474cba699..0deb77e60a51 100644 --- a/core/tests/coretests/src/android/preference/PreferenceIconSpaceTest.java +++ b/core/tests/coretests/src/android/preference/PreferenceIconSpaceTest.java @@ -16,20 +16,20 @@ package android.preference; - import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/print/IPrintManagerParametersTest.java b/core/tests/coretests/src/android/print/IPrintManagerParametersTest.java index 5d12f7e43558..94d85e63cc5f 100644 --- a/core/tests/coretests/src/android/print/IPrintManagerParametersTest.java +++ b/core/tests/coretests/src/android/print/IPrintManagerParametersTest.java @@ -41,9 +41,10 @@ import android.print.test.services.PrintServiceCallbacks; import android.print.test.services.PrinterDiscoverySessionCallbacks; import android.print.test.services.StubbablePrinterDiscoverySession; import android.printservice.recommendation.IRecommendationsChangeListener; -import android.support.test.filters.LargeTest; -import android.support.test.filters.MediumTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/android/provider/DeviceConfigTest.java b/core/tests/coretests/src/android/provider/DeviceConfigTest.java index 800b86418163..17e9654b651a 100644 --- a/core/tests/coretests/src/android/provider/DeviceConfigTest.java +++ b/core/tests/coretests/src/android/provider/DeviceConfigTest.java @@ -28,9 +28,10 @@ import android.content.ContentResolver; import android.os.Bundle; import android.os.SystemClock; import android.platform.test.annotations.Presubmit; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Test; diff --git a/core/tests/coretests/src/android/provider/DocumentsProviderTest.java b/core/tests/coretests/src/android/provider/DocumentsProviderTest.java index 1465d0a98394..02a9adf4fb4d 100644 --- a/core/tests/coretests/src/android/provider/DocumentsProviderTest.java +++ b/core/tests/coretests/src/android/provider/DocumentsProviderTest.java @@ -20,9 +20,10 @@ import android.content.ContentProviderClient; import android.content.ContentResolver; import android.net.Uri; import android.provider.DocumentsContract.Path; -import android.support.test.filters.SmallTest; import android.test.ProviderTestCase2; +import androidx.test.filters.SmallTest; + import java.util.Arrays; /** diff --git a/core/tests/coretests/src/android/provider/FontsContractE2ETest.java b/core/tests/coretests/src/android/provider/FontsContractE2ETest.java index 29558696436d..7e02be85f01a 100644 --- a/core/tests/coretests/src/android/provider/FontsContractE2ETest.java +++ b/core/tests/coretests/src/android/provider/FontsContractE2ETest.java @@ -25,25 +25,25 @@ import static org.junit.Assert.assertSame; import android.app.Instrumentation; import android.content.Context; import android.content.pm.PackageInfo; -import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.Signature; import android.graphics.Typeface; import android.os.Handler; -import android.provider.FontsContract.Columns; import android.provider.FontsContract.FontFamilyResult; -import android.provider.FontsContract.FontInfo; -import android.provider.FontsContract; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; -import java.util.ArrayList; -import java.util.List; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import java.util.ArrayList; +import java.util.List; + @SmallTest @RunWith(AndroidJUnit4.class) public class FontsContractE2ETest { diff --git a/core/tests/coretests/src/android/provider/FontsContractTest.java b/core/tests/coretests/src/android/provider/FontsContractTest.java index d42d79e8fd82..c5d6f7fad3e8 100644 --- a/core/tests/coretests/src/android/provider/FontsContractTest.java +++ b/core/tests/coretests/src/android/provider/FontsContractTest.java @@ -13,31 +13,33 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.provider; +import static android.provider.FontsContract.Columns.RESULT_CODE_FONT_NOT_FOUND; +import static android.provider.FontsContract.Columns.RESULT_CODE_FONT_UNAVAILABLE; +import static android.provider.FontsContract.Columns.RESULT_CODE_MALFORMED_QUERY; +import static android.provider.FontsContract.Columns.RESULT_CODE_OK; + import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import static android.provider.FontsContract.Columns.RESULT_CODE_OK; -import static android.provider.FontsContract.Columns.RESULT_CODE_FONT_NOT_FOUND; -import static android.provider.FontsContract.Columns.RESULT_CODE_FONT_UNAVAILABLE; -import static android.provider.FontsContract.Columns.RESULT_CODE_MALFORMED_QUERY; - import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; -import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ProviderInfo; import android.content.pm.Signature; import android.database.MatrixCursor; import android.graphics.fonts.FontVariationAxis; import android.provider.FontsContract.FontInfo; -import android.support.test.filters.SmallTest; import android.test.ProviderTestCase2; import android.util.Base64; +import androidx.test.filters.SmallTest; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; diff --git a/core/tests/coretests/src/android/provider/MockFontProvider.java b/core/tests/coretests/src/android/provider/MockFontProvider.java index ad5b130ca90d..e527dec13baf 100644 --- a/core/tests/coretests/src/android/provider/MockFontProvider.java +++ b/core/tests/coretests/src/android/provider/MockFontProvider.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.provider; import static android.provider.FontsContract.Columns; @@ -21,16 +22,13 @@ import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; -import android.content.res.AssetFileDescriptor; import android.content.res.AssetManager; import android.database.Cursor; import android.database.MatrixCursor; -import android.graphics.fonts.FontVariationAxis; import android.net.Uri; -import android.os.CancellationSignal; import android.os.ParcelFileDescriptor; -import android.util.ArraySet; -import android.util.SparseArray; + +import com.android.internal.annotations.GuardedBy; import java.io.File; import java.io.FileNotFoundException; @@ -46,8 +44,6 @@ import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; -import com.android.internal.annotations.GuardedBy; - public class MockFontProvider extends ContentProvider { final static String AUTHORITY = "android.provider.fonts.font"; diff --git a/core/tests/coretests/src/android/provider/SearchRecentSuggestionsProviderTest.java b/core/tests/coretests/src/android/provider/SearchRecentSuggestionsProviderTest.java index 7458de5fd310..f84355f6755e 100644 --- a/core/tests/coretests/src/android/provider/SearchRecentSuggestionsProviderTest.java +++ b/core/tests/coretests/src/android/provider/SearchRecentSuggestionsProviderTest.java @@ -21,9 +21,9 @@ import android.content.ContentResolver; import android.database.Cursor; import android.net.Uri; import android.test.ProviderTestCase2; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.Suppress; + +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; /** * ProviderTestCase that performs unit tests of SearchRecentSuggestionsProvider. diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java index df4600e07047..93af0130d74c 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -27,8 +27,9 @@ import static java.lang.reflect.Modifier.isPublic; import static java.lang.reflect.Modifier.isStatic; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; @@ -477,9 +478,10 @@ public class SettingsBackupTest { Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_ALL_ANGLE, Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_PKGS, Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_VALUES, + Settings.Global.GUP_DEV_ALL_APPS, Settings.Global.GUP_DEV_OPT_IN_APPS, Settings.Global.GUP_DEV_OPT_OUT_APPS, - Settings.Global.GUP_BLACK_LIST, + Settings.Global.GUP_BLACKLIST, Settings.Global.GPU_DEBUG_LAYER_APP, Settings.Global.ENABLE_GNSS_RAW_MEAS_FULL_TRACKING, Settings.Global.INSTALL_CARRIER_APP_NOTIFICATION_PERSISTENT, @@ -666,6 +668,7 @@ public class SettingsBackupTest { Settings.Secure.SMS_DEFAULT_APPLICATION, Settings.Secure.SPELL_CHECKER_ENABLED, // Intentionally removed in Q Settings.Secure.TRUST_AGENTS_INITIALIZED, + Settings.Secure.TV_APP_USES_NON_SYSTEM_INPUTS, Settings.Secure.TV_INPUT_CUSTOM_LABELS, Settings.Secure.TV_INPUT_HIDDEN_INPUTS, Settings.Secure.TV_USER_SETUP_COMPLETE, diff --git a/core/tests/coretests/src/android/provider/SettingsProviderTest.java b/core/tests/coretests/src/android/provider/SettingsProviderTest.java index cb6f0e692082..a5f5f6733237 100644 --- a/core/tests/coretests/src/android/provider/SettingsProviderTest.java +++ b/core/tests/coretests/src/android/provider/SettingsProviderTest.java @@ -34,9 +34,10 @@ import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.SmallTest; -import android.test.suitebuilder.annotation.Suppress; + +import androidx.test.filters.MediumTest; +import androidx.test.filters.SmallTest; +import androidx.test.filters.Suppress; import java.util.HashMap; import java.util.List; diff --git a/core/tests/coretests/src/android/provider/SettingsValidatorsTest.java b/core/tests/coretests/src/android/provider/SettingsValidatorsTest.java index b0d29bd1d8f0..08f9de602684 100644 --- a/core/tests/coretests/src/android/provider/SettingsValidatorsTest.java +++ b/core/tests/coretests/src/android/provider/SettingsValidatorsTest.java @@ -22,8 +22,9 @@ import static org.junit.Assert.fail; import android.platform.test.annotations.Presubmit; import android.provider.SettingsValidators.Validator; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/provider/SmsProviderTest.java b/core/tests/coretests/src/android/provider/SmsProviderTest.java index af4d1a66053a..67ac8ea8d49b 100644 --- a/core/tests/coretests/src/android/provider/SmsProviderTest.java +++ b/core/tests/coretests/src/android/provider/SmsProviderTest.java @@ -22,8 +22,9 @@ import android.database.Cursor; import android.net.Uri; import android.provider.Telephony.Sms; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.Suppress; + +import androidx.test.filters.LargeTest; +import androidx.test.filters.Suppress; import java.util.GregorianCalendar; diff --git a/core/tests/coretests/src/android/provider/TestFontsProvider.java b/core/tests/coretests/src/android/provider/TestFontsProvider.java index 46906dfa1284..c3457faf9af5 100644 --- a/core/tests/coretests/src/android/provider/TestFontsProvider.java +++ b/core/tests/coretests/src/android/provider/TestFontsProvider.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.provider; import static android.os.ParcelFileDescriptor.MODE_READ_ONLY; @@ -23,7 +24,6 @@ import android.content.ContentProvider; import android.content.ContentValues; import android.database.Cursor; import android.database.MatrixCursor; -import android.graphics.Typeface; import android.net.Uri; import android.os.ParcelFileDescriptor; diff --git a/core/tests/coretests/src/android/security/keystore/recovery/KeyChainProtectionParamsTest.java b/core/tests/coretests/src/android/security/keystore/recovery/KeyChainProtectionParamsTest.java index 0c9c4c17171c..ce0bf30473f6 100644 --- a/core/tests/coretests/src/android/security/keystore/recovery/KeyChainProtectionParamsTest.java +++ b/core/tests/coretests/src/android/security/keystore/recovery/KeyChainProtectionParamsTest.java @@ -20,8 +20,9 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import android.os.Parcel; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/security/keystore/recovery/KeyChainSnapshotTest.java b/core/tests/coretests/src/android/security/keystore/recovery/KeyChainSnapshotTest.java index 61ab1526abc4..2a962c222371 100644 --- a/core/tests/coretests/src/android/security/keystore/recovery/KeyChainSnapshotTest.java +++ b/core/tests/coretests/src/android/security/keystore/recovery/KeyChainSnapshotTest.java @@ -20,8 +20,9 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import android.os.Parcel; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import com.google.common.collect.Lists; diff --git a/core/tests/coretests/src/android/security/keystore/recovery/KeyDerivationParamsTest.java b/core/tests/coretests/src/android/security/keystore/recovery/KeyDerivationParamsTest.java index b6af9bbd772a..2b37b52c8bf9 100644 --- a/core/tests/coretests/src/android/security/keystore/recovery/KeyDerivationParamsTest.java +++ b/core/tests/coretests/src/android/security/keystore/recovery/KeyDerivationParamsTest.java @@ -20,8 +20,9 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import android.os.Parcel; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/security/keystore/recovery/RecoveryCertPathTest.java b/core/tests/coretests/src/android/security/keystore/recovery/RecoveryCertPathTest.java index dd8cd8dbd0c6..3b8f71585099 100644 --- a/core/tests/coretests/src/android/security/keystore/recovery/RecoveryCertPathTest.java +++ b/core/tests/coretests/src/android/security/keystore/recovery/RecoveryCertPathTest.java @@ -20,8 +20,9 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import android.os.Parcel; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/security/keystore/recovery/TrustedRootCertificatesTest.java b/core/tests/coretests/src/android/security/keystore/recovery/TrustedRootCertificatesTest.java index a5a3ca90d9ac..2b15d73b6f01 100644 --- a/core/tests/coretests/src/android/security/keystore/recovery/TrustedRootCertificatesTest.java +++ b/core/tests/coretests/src/android/security/keystore/recovery/TrustedRootCertificatesTest.java @@ -20,8 +20,8 @@ import static android.security.keystore.recovery.TrustedRootCertificates.getRoot import static org.junit.Assert.assertTrue; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/security/keystore/recovery/WrappedApplicationKeyTest.java b/core/tests/coretests/src/android/security/keystore/recovery/WrappedApplicationKeyTest.java index 15afbddf6f02..8522e6203284 100644 --- a/core/tests/coretests/src/android/security/keystore/recovery/WrappedApplicationKeyTest.java +++ b/core/tests/coretests/src/android/security/keystore/recovery/WrappedApplicationKeyTest.java @@ -20,8 +20,9 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import android.os.Parcel; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Before; diff --git a/core/tests/coretests/src/android/security/keystore/recovery/X509CertificateParsingUtilsTest.java b/core/tests/coretests/src/android/security/keystore/recovery/X509CertificateParsingUtilsTest.java index 7f0eb43f23be..17486d51d1a1 100644 --- a/core/tests/coretests/src/android/security/keystore/recovery/X509CertificateParsingUtilsTest.java +++ b/core/tests/coretests/src/android/security/keystore/recovery/X509CertificateParsingUtilsTest.java @@ -21,8 +21,8 @@ import static android.security.keystore.recovery.X509CertificateParsingUtils.dec import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/service/euicc/EuiccProfileInfoTest.java b/core/tests/coretests/src/android/service/euicc/EuiccProfileInfoTest.java index e69d1e7505d1..d00d052db590 100644 --- a/core/tests/coretests/src/android/service/euicc/EuiccProfileInfoTest.java +++ b/core/tests/coretests/src/android/service/euicc/EuiccProfileInfoTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.service.euicc; import static org.junit.Assert.assertArrayEquals; @@ -23,10 +24,11 @@ import static org.junit.Assert.assertTrue; import android.os.Parcel; import android.service.carrier.CarrierIdentifier; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.telephony.UiccAccessRule; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/service/notification/StatusBarNotificationTest.java b/core/tests/coretests/src/android/service/notification/StatusBarNotificationTest.java index 8a3ba8cc625b..4aa10007bf53 100644 --- a/core/tests/coretests/src/android/service/notification/StatusBarNotificationTest.java +++ b/core/tests/coretests/src/android/service/notification/StatusBarNotificationTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.service.notification; import static junit.framework.Assert.assertEquals; @@ -28,9 +29,10 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.metrics.LogMaker; import android.os.UserHandle; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; diff --git a/core/tests/coretests/src/android/service/settings/suggestions/MockSuggestionService.java b/core/tests/coretests/src/android/service/settings/suggestions/MockSuggestionService.java index ab541a15cdcc..9c8e86834bf6 100644 --- a/core/tests/coretests/src/android/service/settings/suggestions/MockSuggestionService.java +++ b/core/tests/coretests/src/android/service/settings/suggestions/MockSuggestionService.java @@ -16,16 +16,12 @@ package android.service.settings.suggestions; -import android.support.annotation.VisibleForTesting; - import java.util.ArrayList; import java.util.List; public class MockSuggestionService extends SuggestionService { - @VisibleForTesting static boolean sOnSuggestionLaunchedCalled; - @VisibleForTesting static boolean sOnSuggestionDismissedCalled; public static void reset() { diff --git a/core/tests/coretests/src/android/service/settings/suggestions/SuggestionServiceTest.java b/core/tests/coretests/src/android/service/settings/suggestions/SuggestionServiceTest.java index dca8c096dc59..64edda5ee879 100644 --- a/core/tests/coretests/src/android/service/settings/suggestions/SuggestionServiceTest.java +++ b/core/tests/coretests/src/android/service/settings/suggestions/SuggestionServiceTest.java @@ -21,10 +21,11 @@ import static com.google.common.truth.Truth.assertThat; import android.content.Intent; import android.os.IBinder; import android.os.RemoteException; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.rule.ServiceTestRule; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.rule.ServiceTestRule; +import androidx.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Before; diff --git a/core/tests/coretests/src/android/service/settings/suggestions/SuggestionTest.java b/core/tests/coretests/src/android/service/settings/suggestions/SuggestionTest.java index b0ec55d946e2..8c47fcbc8947 100644 --- a/core/tests/coretests/src/android/service/settings/suggestions/SuggestionTest.java +++ b/core/tests/coretests/src/android/service/settings/suggestions/SuggestionTest.java @@ -24,9 +24,10 @@ import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.Icon; import android.os.Parcel; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/android/text/AndroidCharacterTest.java b/core/tests/coretests/src/android/text/AndroidCharacterTest.java index 0c7e730e78e4..1c5986a838fc 100644 --- a/core/tests/coretests/src/android/text/AndroidCharacterTest.java +++ b/core/tests/coretests/src/android/text/AndroidCharacterTest.java @@ -19,7 +19,8 @@ package android.text; import static org.junit.Assert.assertArrayEquals; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; + +import androidx.test.filters.SmallTest; import org.junit.Test; diff --git a/core/tests/coretests/src/android/text/BidiFormatterTest.java b/core/tests/coretests/src/android/text/BidiFormatterTest.java index 1b936c7b1c1d..312fb68bbfc2 100644 --- a/core/tests/coretests/src/android/text/BidiFormatterTest.java +++ b/core/tests/coretests/src/android/text/BidiFormatterTest.java @@ -19,8 +19,9 @@ package android.text; import static org.junit.Assert.assertEquals; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/DynamicLayoutBlocksTest.java b/core/tests/coretests/src/android/text/DynamicLayoutBlocksTest.java index c69f4f58b44e..cca1ad3a6dec 100644 --- a/core/tests/coretests/src/android/text/DynamicLayoutBlocksTest.java +++ b/core/tests/coretests/src/android/text/DynamicLayoutBlocksTest.java @@ -22,8 +22,9 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/DynamicLayoutTest.java b/core/tests/coretests/src/android/text/DynamicLayoutTest.java index ea954f65476d..699243b3f2b9 100644 --- a/core/tests/coretests/src/android/text/DynamicLayoutTest.java +++ b/core/tests/coretests/src/android/text/DynamicLayoutTest.java @@ -27,11 +27,12 @@ import static org.junit.Assert.assertTrue; import android.graphics.Canvas; import android.graphics.Paint; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.text.style.ReplacementSpan; import android.util.ArraySet; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/EmojiTest.java b/core/tests/coretests/src/android/text/EmojiTest.java index 313f1b6a6614..194899415e0d 100644 --- a/core/tests/coretests/src/android/text/EmojiTest.java +++ b/core/tests/coretests/src/android/text/EmojiTest.java @@ -21,8 +21,9 @@ import static org.junit.Assert.assertTrue; import android.icu.lang.UCharacterDirection; import android.icu.text.Bidi; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/FontFallbackSetup.java b/core/tests/coretests/src/android/text/FontFallbackSetup.java index 5592aac5a7c0..cc51ec3da1fd 100644 --- a/core/tests/coretests/src/android/text/FontFallbackSetup.java +++ b/core/tests/coretests/src/android/text/FontFallbackSetup.java @@ -24,9 +24,10 @@ import android.graphics.fonts.Font; import android.graphics.fonts.FontCustomizationParser; import android.graphics.fonts.FontFamily; import android.graphics.fonts.SystemFonts; -import android.support.test.InstrumentationRegistry; import android.util.ArrayMap; +import androidx.test.InstrumentationRegistry; + import java.io.File; import java.io.FileOutputStream; import java.io.IOException; diff --git a/core/tests/coretests/src/android/text/LayoutBidiCursorPathTest.java b/core/tests/coretests/src/android/text/LayoutBidiCursorPathTest.java index 1208d7ca194a..96e7fb9c8b16 100644 --- a/core/tests/coretests/src/android/text/LayoutBidiCursorPathTest.java +++ b/core/tests/coretests/src/android/text/LayoutBidiCursorPathTest.java @@ -22,12 +22,13 @@ import android.content.Context; import android.graphics.Path; import android.graphics.Typeface; import android.platform.test.annotations.Presubmit; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.text.method.MetaKeyKeyListener; import android.view.KeyEvent; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/LayoutTest.java b/core/tests/coretests/src/android/text/LayoutTest.java index 97937a45825e..990161a88c22 100644 --- a/core/tests/coretests/src/android/text/LayoutTest.java +++ b/core/tests/coretests/src/android/text/LayoutTest.java @@ -31,11 +31,12 @@ import android.graphics.Path; import android.graphics.Rect; import android.graphics.RectF; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.text.Layout.Alignment; import android.text.style.StrikethroughSpan; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/MeasuredParagraphTest.java b/core/tests/coretests/src/android/text/MeasuredParagraphTest.java index a0dca2c0dc4f..57bb4349c4fd 100644 --- a/core/tests/coretests/src/android/text/MeasuredParagraphTest.java +++ b/core/tests/coretests/src/android/text/MeasuredParagraphTest.java @@ -23,9 +23,10 @@ import static org.junit.Assert.assertNull; import android.content.Context; import android.graphics.Typeface; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/PackedIntVectorTest.java b/core/tests/coretests/src/android/text/PackedIntVectorTest.java index d9dc6fc44495..ba15b92012a7 100644 --- a/core/tests/coretests/src/android/text/PackedIntVectorTest.java +++ b/core/tests/coretests/src/android/text/PackedIntVectorTest.java @@ -19,8 +19,9 @@ package android.text; import static org.junit.Assert.assertEquals; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/SpannableStringBuilderTest.java b/core/tests/coretests/src/android/text/SpannableStringBuilderTest.java index d0f2d46f9c2b..91b8c6ad0c53 100644 --- a/core/tests/coretests/src/android/text/SpannableStringBuilderTest.java +++ b/core/tests/coretests/src/android/text/SpannableStringBuilderTest.java @@ -16,18 +16,18 @@ package android.text; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.text.style.BulletSpan; import android.text.style.QuoteSpan; import android.text.style.SubscriptSpan; import android.text.style.UnderlineSpan; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/SpannableStringNoCopyTest.java b/core/tests/coretests/src/android/text/SpannableStringNoCopyTest.java index 6c05601a31fd..9149f7b1b216 100644 --- a/core/tests/coretests/src/android/text/SpannableStringNoCopyTest.java +++ b/core/tests/coretests/src/android/text/SpannableStringNoCopyTest.java @@ -21,11 +21,12 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import android.annotation.NonNull; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.text.style.QuoteSpan; import android.text.style.UnderlineSpan; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/SpannableTest.java b/core/tests/coretests/src/android/text/SpannableTest.java index f3684286dbbb..d248a1f69030 100644 --- a/core/tests/coretests/src/android/text/SpannableTest.java +++ b/core/tests/coretests/src/android/text/SpannableTest.java @@ -19,10 +19,11 @@ package android.text; import static org.junit.Assert.assertEquals; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.test.MoreAsserts; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/SpannedStringNoCopyTest.java b/core/tests/coretests/src/android/text/SpannedStringNoCopyTest.java index 380e3153ccda..ca4373361fa5 100644 --- a/core/tests/coretests/src/android/text/SpannedStringNoCopyTest.java +++ b/core/tests/coretests/src/android/text/SpannedStringNoCopyTest.java @@ -21,11 +21,12 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import android.annotation.NonNull; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.text.style.QuoteSpan; import android.text.style.UnderlineSpan; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/SpannedTest.java b/core/tests/coretests/src/android/text/SpannedTest.java index 573757165101..3ab075509373 100644 --- a/core/tests/coretests/src/android/text/SpannedTest.java +++ b/core/tests/coretests/src/android/text/SpannedTest.java @@ -21,13 +21,14 @@ import static org.junit.Assert.assertEquals; import android.graphics.Typeface; import android.os.Parcel; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.text.style.CharacterStyle; import android.text.style.StyleSpan; import android.text.style.TextAppearanceSpan; import android.text.style.TypefaceSpan; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/StaticLayoutBidiTest.java b/core/tests/coretests/src/android/text/StaticLayoutBidiTest.java index bf0d42788b72..32370b3e6e05 100644 --- a/core/tests/coretests/src/android/text/StaticLayoutBidiTest.java +++ b/core/tests/coretests/src/android/text/StaticLayoutBidiTest.java @@ -19,10 +19,11 @@ package android.text; import static org.junit.Assert.assertEquals; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.util.Log; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/StaticLayoutDirectionsTest.java b/core/tests/coretests/src/android/text/StaticLayoutDirectionsTest.java index 5cf54268e004..4221ac208948 100644 --- a/core/tests/coretests/src/android/text/StaticLayoutDirectionsTest.java +++ b/core/tests/coretests/src/android/text/StaticLayoutDirectionsTest.java @@ -19,11 +19,12 @@ package android.text; import static org.junit.Assert.fail; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.text.Layout.Directions; import android.text.StaticLayoutTest.LayoutBuilder; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/StaticLayoutTest.java b/core/tests/coretests/src/android/text/StaticLayoutTest.java index 25217125bbf4..b1c896ec2ce4 100644 --- a/core/tests/coretests/src/android/text/StaticLayoutTest.java +++ b/core/tests/coretests/src/android/text/StaticLayoutTest.java @@ -25,13 +25,14 @@ import android.graphics.Canvas; import android.graphics.Paint.FontMetricsInt; import android.os.LocaleList; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.text.Layout.Alignment; import android.text.method.EditorState; import android.text.style.LocaleSpan; import android.util.Log; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/StaticLayoutTextMeasuringTest.java b/core/tests/coretests/src/android/text/StaticLayoutTextMeasuringTest.java index f6888e3adb75..0d42326d4bdb 100644 --- a/core/tests/coretests/src/android/text/StaticLayoutTextMeasuringTest.java +++ b/core/tests/coretests/src/android/text/StaticLayoutTextMeasuringTest.java @@ -19,10 +19,11 @@ package android.text; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.text.Layout.Alignment; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/TextLayoutTest.java b/core/tests/coretests/src/android/text/TextLayoutTest.java index 24020ceb0cd4..15fbc9e59508 100644 --- a/core/tests/coretests/src/android/text/TextLayoutTest.java +++ b/core/tests/coretests/src/android/text/TextLayoutTest.java @@ -17,8 +17,9 @@ package android.text; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/android/text/TextLineTest.java b/core/tests/coretests/src/android/text/TextLineTest.java index 2fe882c8f9f8..90ce305b3dab 100644 --- a/core/tests/coretests/src/android/text/TextLineTest.java +++ b/core/tests/coretests/src/android/text/TextLineTest.java @@ -25,14 +25,15 @@ import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Typeface; import android.platform.test.annotations.Presubmit; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.filters.Suppress; -import android.support.test.runner.AndroidJUnit4; import android.text.Layout.TabStops; import android.text.style.ReplacementSpan; import android.text.style.TabStopSpan; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.filters.Suppress; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/TextUtilsTest.java b/core/tests/coretests/src/android/text/TextUtilsTest.java index 72290bf10f9d..be6ef195fa96 100644 --- a/core/tests/coretests/src/android/text/TextUtilsTest.java +++ b/core/tests/coretests/src/android/text/TextUtilsTest.java @@ -26,15 +26,16 @@ import static org.junit.Assert.fail; import android.os.Parcel; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.LargeTest; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.test.MoreAsserts; import android.text.style.StyleSpan; import android.text.util.Rfc822Token; import android.text.util.Rfc822Tokenizer; import android.view.View; +import androidx.test.filters.LargeTest; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import com.google.android.collect.Lists; import org.junit.Test; diff --git a/core/tests/coretests/src/android/text/VariationParserTest.java b/core/tests/coretests/src/android/text/VariationParserTest.java index fbd2412a35cc..0afe811f1ad6 100644 --- a/core/tests/coretests/src/android/text/VariationParserTest.java +++ b/core/tests/coretests/src/android/text/VariationParserTest.java @@ -21,8 +21,9 @@ import static org.junit.Assert.fail; import android.graphics.fonts.FontVariationAxis; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/format/DateFormatTest.java b/core/tests/coretests/src/android/text/format/DateFormatTest.java index 9000ed07d606..5a0a84db5905 100644 --- a/core/tests/coretests/src/android/text/format/DateFormatTest.java +++ b/core/tests/coretests/src/android/text/format/DateFormatTest.java @@ -20,8 +20,9 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/format/DateUtilsTest.java b/core/tests/coretests/src/android/text/format/DateUtilsTest.java index 872b71a5faa6..381c0512c532 100644 --- a/core/tests/coretests/src/android/text/format/DateUtilsTest.java +++ b/core/tests/coretests/src/android/text/format/DateUtilsTest.java @@ -22,8 +22,9 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.os.LocaleList; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Before; diff --git a/core/tests/coretests/src/android/text/format/FormatterTest.java b/core/tests/coretests/src/android/text/format/FormatterTest.java index 82e4bff200fd..068d04798858 100644 --- a/core/tests/coretests/src/android/text/format/FormatterTest.java +++ b/core/tests/coretests/src/android/text/format/FormatterTest.java @@ -25,11 +25,12 @@ import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; import android.platform.test.annotations.Presubmit; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.text.format.Formatter.BytesResult; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/android/text/format/TimeTest.java b/core/tests/coretests/src/android/text/format/TimeTest.java index d563f2e2383b..ac0041119640 100644 --- a/core/tests/coretests/src/android/text/format/TimeTest.java +++ b/core/tests/coretests/src/android/text/format/TimeTest.java @@ -21,12 +21,13 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.filters.Suppress; -import android.support.test.runner.AndroidJUnit4; import android.util.Log; import android.util.TimeFormatException; +import androidx.test.filters.SmallTest; +import androidx.test.filters.Suppress; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/method/BackspaceTest.java b/core/tests/coretests/src/android/text/method/BackspaceTest.java index df4609f5a728..ddae652cec05 100644 --- a/core/tests/coretests/src/android/text/method/BackspaceTest.java +++ b/core/tests/coretests/src/android/text/method/BackspaceTest.java @@ -17,15 +17,16 @@ package android.text.method; import android.platform.test.annotations.Presubmit; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.text.InputType; import android.util.KeyUtils; import android.view.KeyEvent; import android.widget.EditText; import android.widget.TextView.BufferType; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/method/EditorState.java b/core/tests/coretests/src/android/text/method/EditorState.java index 12bb8c839e60..4eff7a49ac7b 100644 --- a/core/tests/coretests/src/android/text/method/EditorState.java +++ b/core/tests/coretests/src/android/text/method/EditorState.java @@ -21,8 +21,6 @@ import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import android.graphics.Canvas; -import android.graphics.Paint; import android.text.Editable; import android.text.Spannable; import android.text.SpannableString; diff --git a/core/tests/coretests/src/android/text/method/ForwardDeleteTest.java b/core/tests/coretests/src/android/text/method/ForwardDeleteTest.java index 45a501077128..45b63e03c27e 100644 --- a/core/tests/coretests/src/android/text/method/ForwardDeleteTest.java +++ b/core/tests/coretests/src/android/text/method/ForwardDeleteTest.java @@ -17,15 +17,16 @@ package android.text.method; import android.platform.test.annotations.Presubmit; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.text.InputType; import android.util.KeyUtils; import android.view.KeyEvent; import android.widget.EditText; import android.widget.TextView.BufferType; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/method/WordIteratorTest.java b/core/tests/coretests/src/android/text/method/WordIteratorTest.java index 684586387255..cc345f5785df 100644 --- a/core/tests/coretests/src/android/text/method/WordIteratorTest.java +++ b/core/tests/coretests/src/android/text/method/WordIteratorTest.java @@ -22,8 +22,9 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/style/UnderlineSpanTest.java b/core/tests/coretests/src/android/text/style/UnderlineSpanTest.java index 3d7e5bab15f3..a0d2f856d093 100644 --- a/core/tests/coretests/src/android/text/style/UnderlineSpanTest.java +++ b/core/tests/coretests/src/android/text/style/UnderlineSpanTest.java @@ -16,17 +16,17 @@ package android.text.style; - import static org.junit.Assert.assertEquals; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.text.SpannableString; import android.text.Spanned; import android.text.StaticLayout; import android.text.TextPaint; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/text/util/LinkifyTest.java b/core/tests/coretests/src/android/text/util/LinkifyTest.java index be3a0be079bf..107ecd716b5a 100644 --- a/core/tests/coretests/src/android/text/util/LinkifyTest.java +++ b/core/tests/coretests/src/android/text/util/LinkifyTest.java @@ -23,9 +23,6 @@ import static org.junit.Assert.assertTrue; import android.content.Context; import android.content.res.Configuration; import android.os.LocaleList; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.text.Spannable; import android.text.SpannableString; import android.text.method.LinkMovementMethod; @@ -33,6 +30,10 @@ import android.text.style.URLSpan; import android.util.Patterns; import android.widget.TextView; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/android/transition/AutoTransitionTest.java b/core/tests/coretests/src/android/transition/AutoTransitionTest.java index 834fb7aa72a5..deae967a3e72 100644 --- a/core/tests/coretests/src/android/transition/AutoTransitionTest.java +++ b/core/tests/coretests/src/android/transition/AutoTransitionTest.java @@ -16,16 +16,16 @@ package android.transition; -import android.support.test.runner.AndroidJUnit4; -import android.test.suitebuilder.annotation.SmallTest; - -import org.junit.Test; -import org.junit.runner.RunWith; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + @RunWith(AndroidJUnit4.class) public class AutoTransitionTest { @Test diff --git a/core/tests/coretests/src/android/transition/FadeTransitionTest.java b/core/tests/coretests/src/android/transition/FadeTransitionTest.java index 22365bac64a2..2077d9443e7a 100644 --- a/core/tests/coretests/src/android/transition/FadeTransitionTest.java +++ b/core/tests/coretests/src/android/transition/FadeTransitionTest.java @@ -22,13 +22,14 @@ import android.app.Activity; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.test.ActivityInstrumentationTestCase2; -import android.test.suitebuilder.annotation.SmallTest; import android.transition.Transition.TransitionListener; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageView; +import androidx.test.filters.SmallTest; + import com.android.frameworks.coretests.R; import java.util.concurrent.CountDownLatch; diff --git a/core/tests/coretests/src/android/transition/SlideTransitionTest.java b/core/tests/coretests/src/android/transition/SlideTransitionTest.java index 8b9ec74be8df..046e49dffab1 100644 --- a/core/tests/coretests/src/android/transition/SlideTransitionTest.java +++ b/core/tests/coretests/src/android/transition/SlideTransitionTest.java @@ -19,18 +19,18 @@ package android.transition; import android.animation.AnimatorSetActivity; import android.app.Activity; import android.test.ActivityInstrumentationTestCase2; -import android.test.suitebuilder.annotation.SmallTest; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; +import androidx.test.filters.SmallTest; + import com.android.frameworks.coretests.R; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; - public class SlideTransitionTest extends ActivityInstrumentationTestCase2<AnimatorSetActivity> { Activity mActivity; diff --git a/core/tests/coretests/src/android/transition/TransitionTest.java b/core/tests/coretests/src/android/transition/TransitionTest.java index 7e629f944684..f59c406f7f74 100644 --- a/core/tests/coretests/src/android/transition/TransitionTest.java +++ b/core/tests/coretests/src/android/transition/TransitionTest.java @@ -19,7 +19,6 @@ package android.transition; import android.animation.AnimatorSetActivity; import android.app.Activity; import android.graphics.Rect; -import android.support.test.filters.LargeTest; import android.test.ActivityInstrumentationTestCase2; import android.transition.Transition.EpicenterCallback; import android.util.ArrayMap; @@ -27,6 +26,8 @@ import android.view.View; import android.view.animation.AccelerateInterpolator; import android.widget.TextView; +import androidx.test.filters.LargeTest; + import com.android.frameworks.coretests.R; import java.lang.reflect.Field; diff --git a/core/tests/coretests/src/android/util/ArrayMapTest.java b/core/tests/coretests/src/android/util/ArrayMapTest.java index f0cc7f77fe63..b212cf6b0803 100644 --- a/core/tests/coretests/src/android/util/ArrayMapTest.java +++ b/core/tests/coretests/src/android/util/ArrayMapTest.java @@ -14,10 +14,10 @@ package android.util; -import android.support.test.filters.LargeTest; -import android.util.ArrayMap; +import androidx.test.filters.LargeTest; import junit.framework.TestCase; + import org.junit.Test; import java.util.ConcurrentModificationException; diff --git a/core/tests/coretests/src/android/util/Base64Test.java b/core/tests/coretests/src/android/util/Base64Test.java index af608c3ae259..15c51af0b3e1 100644 --- a/core/tests/coretests/src/android/util/Base64Test.java +++ b/core/tests/coretests/src/android/util/Base64Test.java @@ -16,7 +16,7 @@ package android.util; -import android.support.test.filters.LargeTest; +import androidx.test.filters.LargeTest; import junit.framework.TestCase; diff --git a/core/tests/coretests/src/android/util/DataUnitTest.java b/core/tests/coretests/src/android/util/DataUnitTest.java index 4eae8b45e94b..ec296b76c374 100644 --- a/core/tests/coretests/src/android/util/DataUnitTest.java +++ b/core/tests/coretests/src/android/util/DataUnitTest.java @@ -16,7 +16,7 @@ package android.util; -import android.support.test.filters.SmallTest; +import androidx.test.filters.SmallTest; import junit.framework.TestCase; diff --git a/core/tests/coretests/src/android/util/DayOfMonthCursorTest.java b/core/tests/coretests/src/android/util/DayOfMonthCursorTest.java index 4c5ad76d8193..572e9b062097 100644 --- a/core/tests/coretests/src/android/util/DayOfMonthCursorTest.java +++ b/core/tests/coretests/src/android/util/DayOfMonthCursorTest.java @@ -16,10 +16,11 @@ package android.util; +import androidx.test.filters.SmallTest; + import junit.framework.TestCase; import java.util.Calendar; -import android.test.suitebuilder.annotation.SmallTest; /** * Unit tests for {@link DayOfMonthCursor}. diff --git a/core/tests/coretests/src/android/util/InternalSelectionView.java b/core/tests/coretests/src/android/util/InternalSelectionView.java index a0fb0f18a4fa..4a1baef8077a 100644 --- a/core/tests/coretests/src/android/util/InternalSelectionView.java +++ b/core/tests/coretests/src/android/util/InternalSelectionView.java @@ -16,19 +16,16 @@ package android.util; -import com.android.frameworks.coretests.R; - -import android.view.View; -import android.view.KeyEvent; import android.content.Context; import android.content.res.TypedArray; -import android.graphics.Paint; import android.graphics.Canvas; -import android.graphics.Rect; import android.graphics.Color; -import android.util.AttributeSet; - +import android.graphics.Paint; +import android.graphics.Rect; +import android.view.KeyEvent; +import android.view.View; +import com.android.frameworks.coretests.R; /** * A view that has a known number of selectable rows, and maintains a notion of which diff --git a/core/tests/coretests/src/android/util/KeyUtils.java b/core/tests/coretests/src/android/util/KeyUtils.java index 593f72742ea6..612643e12db0 100644 --- a/core/tests/coretests/src/android/util/KeyUtils.java +++ b/core/tests/coretests/src/android/util/KeyUtils.java @@ -17,16 +17,10 @@ package android.util; import android.app.Instrumentation; -import android.os.SystemClock; import android.test.ActivityInstrumentationTestCase; -import android.test.InstrumentationTestCase; -import android.view.Gravity; import android.view.KeyCharacterMap; import android.view.KeyEvent; -import android.view.MotionEvent; -import android.view.View; import android.view.ViewConfiguration; -import android.view.ViewGroup; /** * Reusable methods for generating key events. diff --git a/core/tests/coretests/src/android/util/KeyValueListParserTest.java b/core/tests/coretests/src/android/util/KeyValueListParserTest.java index 038f0b7efaa3..f65c4c7c0bdf 100644 --- a/core/tests/coretests/src/android/util/KeyValueListParserTest.java +++ b/core/tests/coretests/src/android/util/KeyValueListParserTest.java @@ -19,8 +19,9 @@ package android.util; import static org.junit.Assert.assertEquals; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/android/util/ListUtil.java b/core/tests/coretests/src/android/util/ListUtil.java index 2a7cb96bebfe..3748cf8e1405 100644 --- a/core/tests/coretests/src/android/util/ListUtil.java +++ b/core/tests/coretests/src/android/util/ListUtil.java @@ -20,13 +20,11 @@ import android.app.Instrumentation; import android.view.KeyEvent; import android.widget.ListView; - /** * Various useful stuff for instrumentation testing listview. */ public class ListUtil { - private final ListView mListView; private final Instrumentation mInstrumentation; diff --git a/core/tests/coretests/src/android/util/LocalLogTest.java b/core/tests/coretests/src/android/util/LocalLogTest.java index 5144c85e72a2..6cdcb5e542dc 100644 --- a/core/tests/coretests/src/android/util/LocalLogTest.java +++ b/core/tests/coretests/src/android/util/LocalLogTest.java @@ -16,7 +16,7 @@ package android.util; -import android.support.test.filters.LargeTest; +import androidx.test.filters.LargeTest; import junit.framework.TestCase; diff --git a/core/tests/coretests/src/android/util/LogNullabilityTest.java b/core/tests/coretests/src/android/util/LogNullabilityTest.java index 3f4776d8b4fc..370885d3d4ac 100644 --- a/core/tests/coretests/src/android/util/LogNullabilityTest.java +++ b/core/tests/coretests/src/android/util/LogNullabilityTest.java @@ -19,8 +19,8 @@ package android.util; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; -import android.support.test.runner.AndroidJUnit4; -import android.test.suitebuilder.annotation.SmallTest; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/util/LogTest.java b/core/tests/coretests/src/android/util/LogTest.java index 30c81b0c7228..d783c127d8c4 100644 --- a/core/tests/coretests/src/android/util/LogTest.java +++ b/core/tests/coretests/src/android/util/LogTest.java @@ -16,13 +16,12 @@ package android.util; -import junit.framework.Assert; -import junit.framework.TestCase; - import android.os.SystemProperties; import android.test.PerformanceTestCase; -import android.test.suitebuilder.annotation.Suppress; -import android.util.Log; + +import androidx.test.filters.Suppress; + +import junit.framework.TestCase; //This is an empty TestCase. @Suppress diff --git a/core/tests/coretests/src/android/util/LongSparseLongArrayTest.java b/core/tests/coretests/src/android/util/LongSparseLongArrayTest.java index 3f03db9dc1fb..a1d48e689427 100644 --- a/core/tests/coretests/src/android/util/LongSparseLongArrayTest.java +++ b/core/tests/coretests/src/android/util/LongSparseLongArrayTest.java @@ -16,7 +16,7 @@ package android.util; -import android.support.test.filters.LargeTest; +import androidx.test.filters.LargeTest; import junit.framework.TestCase; diff --git a/core/tests/coretests/src/android/util/LruCacheTest.java b/core/tests/coretests/src/android/util/LruCacheTest.java index 5a97158a85d1..1928bfdfc61d 100644 --- a/core/tests/coretests/src/android/util/LruCacheTest.java +++ b/core/tests/coretests/src/android/util/LruCacheTest.java @@ -16,12 +16,13 @@ package android.util; +import junit.framework.TestCase; + import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; -import junit.framework.TestCase; public final class LruCacheTest extends TestCase { private int expectedCreateCount; diff --git a/core/tests/coretests/src/android/util/MonthDisplayHelperTest.java b/core/tests/coretests/src/android/util/MonthDisplayHelperTest.java index 55da665c7b34..30d5f778e945 100644 --- a/core/tests/coretests/src/android/util/MonthDisplayHelperTest.java +++ b/core/tests/coretests/src/android/util/MonthDisplayHelperTest.java @@ -16,12 +16,12 @@ package android.util; -import android.test.suitebuilder.annotation.SmallTest; - -import java.util.Calendar; +import androidx.test.filters.SmallTest; import junit.framework.TestCase; +import java.util.Calendar; + /** * Unit tests for {@link MonthDisplayHelper}. */ diff --git a/core/tests/coretests/src/android/util/OrientationUtil.java b/core/tests/coretests/src/android/util/OrientationUtil.java index ecdca5d608c4..0361194dad2b 100644 --- a/core/tests/coretests/src/android/util/OrientationUtil.java +++ b/core/tests/coretests/src/android/util/OrientationUtil.java @@ -19,7 +19,6 @@ package android.util; import android.app.Activity; import android.app.Instrumentation; import android.content.pm.ActivityInfo; - import android.test.ActivityInstrumentationTestCase2; import com.android.internal.util.Preconditions; diff --git a/core/tests/coretests/src/android/util/PatternsTest.java b/core/tests/coretests/src/android/util/PatternsTest.java index 360b8756f264..6cea2f3c92bd 100644 --- a/core/tests/coretests/src/android/util/PatternsTest.java +++ b/core/tests/coretests/src/android/util/PatternsTest.java @@ -13,15 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.util; -import android.support.test.filters.SmallTest; +import androidx.test.filters.SmallTest; + +import junit.framework.TestCase; import java.util.regex.Matcher; import java.util.regex.Pattern; -import junit.framework.TestCase; - public class PatternsTest extends TestCase { // Tests for Patterns.TOP_LEVEL_DOMAIN diff --git a/core/tests/coretests/src/android/util/RecurrenceRuleTest.java b/core/tests/coretests/src/android/util/RecurrenceRuleTest.java index 39d492d65415..caa12083fafb 100644 --- a/core/tests/coretests/src/android/util/RecurrenceRuleTest.java +++ b/core/tests/coretests/src/android/util/RecurrenceRuleTest.java @@ -16,7 +16,7 @@ package android.util; -import android.support.test.filters.SmallTest; +import androidx.test.filters.SmallTest; import junit.framework.TestCase; diff --git a/core/tests/coretests/src/android/util/SparseLongArrayTest.java b/core/tests/coretests/src/android/util/SparseLongArrayTest.java index 5a5e893d1472..df2d752e04b9 100644 --- a/core/tests/coretests/src/android/util/SparseLongArrayTest.java +++ b/core/tests/coretests/src/android/util/SparseLongArrayTest.java @@ -19,9 +19,10 @@ package android.util; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import android.support.annotation.NonNull; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; +import android.annotation.NonNull; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/android/util/StateSetTest.java b/core/tests/coretests/src/android/util/StateSetTest.java index e481ce04c82f..b5d62704ba29 100644 --- a/core/tests/coretests/src/android/util/StateSetTest.java +++ b/core/tests/coretests/src/android/util/StateSetTest.java @@ -16,8 +16,9 @@ package android.util; +import androidx.test.filters.SmallTest; + import junit.framework.TestCase; -import android.test.suitebuilder.annotation.SmallTest; /** * Tests for {@link StateSet} diff --git a/core/tests/coretests/src/android/util/TimestampedValueTest.java b/core/tests/coretests/src/android/util/TimestampedValueTest.java index 03b4abd9b7a3..6e3ab796c5d3 100644 --- a/core/tests/coretests/src/android/util/TimestampedValueTest.java +++ b/core/tests/coretests/src/android/util/TimestampedValueTest.java @@ -21,7 +21,8 @@ import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.fail; import android.os.Parcel; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/util/TimingsTraceLogTest.java b/core/tests/coretests/src/android/util/TimingsTraceLogTest.java index 7bb4ab835e4f..77d05524d7cf 100644 --- a/core/tests/coretests/src/android/util/TimingsTraceLogTest.java +++ b/core/tests/coretests/src/android/util/TimingsTraceLogTest.java @@ -19,8 +19,9 @@ package android.util; import static org.junit.Assert.assertTrue; import android.os.Trace; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; @@ -28,7 +29,6 @@ import org.junit.runner.RunWith; import java.util.ArrayList; import java.util.List; - /** * Tests for {@link TimingsTraceLog}. * <p>Usage: bit FrameworksCoreTests:android.util.TimingsTraceLogTest diff --git a/core/tests/coretests/src/android/util/TouchModeFlexibleAsserts.java b/core/tests/coretests/src/android/util/TouchModeFlexibleAsserts.java index ca12a153044d..fc082353fffb 100644 --- a/core/tests/coretests/src/android/util/TouchModeFlexibleAsserts.java +++ b/core/tests/coretests/src/android/util/TouchModeFlexibleAsserts.java @@ -16,12 +16,12 @@ package android.util; -import junit.framework.Assert; - import android.test.InstrumentationTestCase; import android.test.TouchUtils; import android.view.View; +import junit.framework.Assert; + /** * When entering touch mode via touch, the tests can be flaky. These asserts * are more flexible (allowing up to MAX_ATTEMPTS touches to enter touch mode via touch or diff --git a/core/tests/coretests/src/android/view/BigCache.java b/core/tests/coretests/src/android/view/BigCache.java index 21821763456a..6a1bcaaf2d00 100644 --- a/core/tests/coretests/src/android/view/BigCache.java +++ b/core/tests/coretests/src/android/view/BigCache.java @@ -16,16 +16,12 @@ package android.view; -import com.android.frameworks.coretests.R; - -import android.os.Bundle; import android.app.Activity; +import android.os.Bundle; import android.widget.LinearLayout; import android.widget.ScrollView; -import android.view.ViewGroup; -import android.view.View; -import android.view.Display; -import android.view.ViewConfiguration; + +import com.android.frameworks.coretests.R; /** * This activity contains two Views, one as big as the screen, one much larger. The large one diff --git a/core/tests/coretests/src/android/view/BigCacheTest.java b/core/tests/coretests/src/android/view/BigCacheTest.java index 8c2c865201aa..ed4b996b1d08 100644 --- a/core/tests/coretests/src/android/view/BigCacheTest.java +++ b/core/tests/coretests/src/android/view/BigCacheTest.java @@ -16,14 +16,12 @@ package android.view; -import android.view.BigCache; -import com.android.frameworks.coretests.R; - -import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; -import android.view.View; -import android.view.ViewConfiguration; import android.graphics.Bitmap; +import android.test.ActivityInstrumentationTestCase; + +import androidx.test.filters.MediumTest; + +import com.android.frameworks.coretests.R; /** * Builds the drawing cache of two Views, one smaller than the maximum cache size, diff --git a/core/tests/coretests/src/android/view/BitmapDrawable.java b/core/tests/coretests/src/android/view/BitmapDrawable.java index f7bad84d6ddd..42c176f6b676 100644 --- a/core/tests/coretests/src/android/view/BitmapDrawable.java +++ b/core/tests/coretests/src/android/view/BitmapDrawable.java @@ -16,19 +16,10 @@ package android.view; -import com.android.frameworks.coretests.R; - import android.app.Activity; -import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.AbsoluteLayout; -import android.widget.Button; -import android.widget.FrameLayout; -import android.widget.LinearLayout; -import android.widget.RelativeLayout; -import android.widget.TextView; + +import com.android.frameworks.coretests.R; public class BitmapDrawable extends Activity { @Override diff --git a/core/tests/coretests/src/android/view/CreateViewTest.java b/core/tests/coretests/src/android/view/CreateViewTest.java index 16656f688640..520f83f60836 100644 --- a/core/tests/coretests/src/android/view/CreateViewTest.java +++ b/core/tests/coretests/src/android/view/CreateViewTest.java @@ -16,16 +16,17 @@ package android.view; +import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; +import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; + import android.content.Context; import android.test.AndroidTestCase; import android.test.PerformanceTestCase; -import android.test.suitebuilder.annotation.SmallTest; -import android.view.View; -import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; -import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.test.filters.SmallTest; + public class CreateViewTest extends AndroidTestCase implements PerformanceTestCase { public boolean isPerformanceOnly() { diff --git a/core/tests/coretests/src/android/view/Disabled.java b/core/tests/coretests/src/android/view/Disabled.java index d3c7470bd0f9..ce90039f360f 100644 --- a/core/tests/coretests/src/android/view/Disabled.java +++ b/core/tests/coretests/src/android/view/Disabled.java @@ -16,13 +16,12 @@ package android.view; -import com.android.frameworks.coretests.R; - +import android.app.Activity; import android.os.Bundle; -import android.widget.Button; -import android.view.View; import android.view.View.OnClickListener; -import android.app.Activity; +import android.widget.Button; + +import com.android.frameworks.coretests.R; /** * Exercise View's disabled state. diff --git a/core/tests/coretests/src/android/view/DisabledLongpressTest.java b/core/tests/coretests/src/android/view/DisabledLongpressTest.java index faa0865c5a1c..a9fec01c8b34 100644 --- a/core/tests/coretests/src/android/view/DisabledLongpressTest.java +++ b/core/tests/coretests/src/android/view/DisabledLongpressTest.java @@ -18,11 +18,12 @@ package android.view; import android.test.ActivityInstrumentationTestCase; import android.test.TouchUtils; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; import android.util.KeyUtils; import android.view.View.OnLongClickListener; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; + import com.android.frameworks.coretests.R; /** diff --git a/core/tests/coretests/src/android/view/DisabledTest.java b/core/tests/coretests/src/android/view/DisabledTest.java index 291a11c289b7..8922e5fda206 100644 --- a/core/tests/coretests/src/android/view/DisabledTest.java +++ b/core/tests/coretests/src/android/view/DisabledTest.java @@ -18,12 +18,11 @@ package android.view; import android.test.ActivityInstrumentationTestCase; import android.test.TouchUtils; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; -import android.view.KeyEvent; -import android.view.View; import android.widget.Button; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; + import com.android.frameworks.coretests.R; /** diff --git a/core/tests/coretests/src/android/view/DisplayCutoutTest.java b/core/tests/coretests/src/android/view/DisplayCutoutTest.java index 8e4f2cd2fbff..dd50af877bbb 100644 --- a/core/tests/coretests/src/android/view/DisplayCutoutTest.java +++ b/core/tests/coretests/src/android/view/DisplayCutoutTest.java @@ -33,17 +33,17 @@ import android.graphics.Insets; import android.graphics.Rect; import android.os.Parcel; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.view.DisplayCutout.ParcelableWrapper; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; import java.util.Arrays; import java.util.Collections; - @RunWith(AndroidJUnit4.class) @SmallTest @Presubmit diff --git a/core/tests/coretests/src/android/view/DrawableBgMinSize.java b/core/tests/coretests/src/android/view/DrawableBgMinSize.java index 58bfb8a77064..ba9ba008b2ef 100644 --- a/core/tests/coretests/src/android/view/DrawableBgMinSize.java +++ b/core/tests/coretests/src/android/view/DrawableBgMinSize.java @@ -16,12 +16,9 @@ package android.view; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.view.View; import android.view.View.OnClickListener; import android.widget.AbsoluteLayout; import android.widget.Button; @@ -30,6 +27,8 @@ import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; +import com.android.frameworks.coretests.R; + /** * Views should obey their background {@link Drawable}'s minimum size * requirements ({@link Drawable#getMinimumHeight()} and diff --git a/core/tests/coretests/src/android/view/DrawableBgMinSizeTest.java b/core/tests/coretests/src/android/view/DrawableBgMinSizeTest.java index e705c87a6675..1735e8cb037f 100644 --- a/core/tests/coretests/src/android/view/DrawableBgMinSizeTest.java +++ b/core/tests/coretests/src/android/view/DrawableBgMinSizeTest.java @@ -16,14 +16,9 @@ package android.view; -import com.android.frameworks.coretests.R; -import android.view.DrawableBgMinSize; -import android.test.TouchUtils; -import android.test.suitebuilder.annotation.MediumTest; - import android.graphics.drawable.Drawable; import android.test.ActivityInstrumentationTestCase; -import android.view.View; +import android.test.TouchUtils; import android.widget.AbsoluteLayout; import android.widget.Button; import android.widget.FrameLayout; @@ -31,6 +26,10 @@ import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; +import androidx.test.filters.MediumTest; + +import com.android.frameworks.coretests.R; + /** * {@link DrawableBgMinSize} exercises Views to obey their background drawable's * minimum sizes. diff --git a/core/tests/coretests/src/android/view/FocusFinderTest.java b/core/tests/coretests/src/android/view/FocusFinderTest.java index 2732a04b44d5..b35c64a09ade 100644 --- a/core/tests/coretests/src/android/view/FocusFinderTest.java +++ b/core/tests/coretests/src/android/view/FocusFinderTest.java @@ -18,7 +18,8 @@ package android.view; import android.graphics.Rect; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.filters.SmallTest; public class FocusFinderTest extends AndroidTestCase { diff --git a/core/tests/coretests/src/android/view/GlobalFocusChange.java b/core/tests/coretests/src/android/view/GlobalFocusChange.java index 041c0ded366f..ee92b64f3947 100644 --- a/core/tests/coretests/src/android/view/GlobalFocusChange.java +++ b/core/tests/coretests/src/android/view/GlobalFocusChange.java @@ -16,12 +16,10 @@ package android.view; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; -import android.view.ViewTreeObserver; -import android.view.View; + +import com.android.frameworks.coretests.R; public class GlobalFocusChange extends Activity implements ViewTreeObserver.OnGlobalFocusChangeListener { public View mOldFocus; diff --git a/core/tests/coretests/src/android/view/GlobalFocusChangeTest.java b/core/tests/coretests/src/android/view/GlobalFocusChangeTest.java index dab7b90a447d..960654a926ce 100644 --- a/core/tests/coretests/src/android/view/GlobalFocusChangeTest.java +++ b/core/tests/coretests/src/android/view/GlobalFocusChangeTest.java @@ -17,13 +17,13 @@ package android.view; import android.test.ActivityInstrumentationTestCase; -import android.test.FlakyTest; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; import android.test.TouchUtils; -import android.test.suitebuilder.annotation.Suppress; -import android.view.View; -import android.view.KeyEvent; + +import androidx.test.filters.FlakyTest; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; + import com.android.frameworks.coretests.R; @Suppress // Flaky @@ -50,7 +50,7 @@ public class GlobalFocusChangeTest extends ActivityInstrumentationTestCase<Globa super.tearDown(); } - @FlakyTest(tolerance = 4) + @FlakyTest @LargeTest public void testFocusChange() throws Exception { sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT); @@ -62,7 +62,7 @@ public class GlobalFocusChangeTest extends ActivityInstrumentationTestCase<Globa assertSame(mRight, mActivity.mNewFocus); } - @FlakyTest(tolerance = 4) + @FlakyTest @MediumTest public void testEnterTouchMode() throws Exception { assertTrue(mLeft.isFocused()); @@ -73,7 +73,7 @@ public class GlobalFocusChangeTest extends ActivityInstrumentationTestCase<Globa assertSame(null, mActivity.mNewFocus); } - @FlakyTest(tolerance = 4) + @FlakyTest @MediumTest public void testLeaveTouchMode() throws Exception { assertTrue(mLeft.isFocused()); diff --git a/core/tests/coretests/src/android/view/HandlerActionQueueTest.java b/core/tests/coretests/src/android/view/HandlerActionQueueTest.java index fd8f23abc45c..bedb75bb7472 100644 --- a/core/tests/coretests/src/android/view/HandlerActionQueueTest.java +++ b/core/tests/coretests/src/android/view/HandlerActionQueueTest.java @@ -17,7 +17,8 @@ package android.view; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.filters.SmallTest; public class HandlerActionQueueTest extends AndroidTestCase { diff --git a/core/tests/coretests/src/android/view/Include.java b/core/tests/coretests/src/android/view/Include.java index e90c48471c83..4b6aefb112e6 100644 --- a/core/tests/coretests/src/android/view/Include.java +++ b/core/tests/coretests/src/android/view/Include.java @@ -16,10 +16,10 @@ package android.view; -import com.android.frameworks.coretests.R; - -import android.os.Bundle; import android.app.Activity; +import android.os.Bundle; + +import com.android.frameworks.coretests.R; /** * Exercise <include /> tag in XML files. diff --git a/core/tests/coretests/src/android/view/IncludeTest.java b/core/tests/coretests/src/android/view/IncludeTest.java index cdcfa3ce5478..e4905597d16a 100644 --- a/core/tests/coretests/src/android/view/IncludeTest.java +++ b/core/tests/coretests/src/android/view/IncludeTest.java @@ -16,13 +16,11 @@ package android.view; -import android.view.Include; -import com.android.frameworks.coretests.R; - import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; -import android.view.View; -import android.view.ViewGroup; + +import androidx.test.filters.MediumTest; + +import com.android.frameworks.coretests.R; public class IncludeTest extends ActivityInstrumentationTestCase<Include> { public IncludeTest() { diff --git a/core/tests/coretests/src/android/view/InflateTest.java b/core/tests/coretests/src/android/view/InflateTest.java index cb4f8e2399b1..939d6eaba3c9 100644 --- a/core/tests/coretests/src/android/view/InflateTest.java +++ b/core/tests/coretests/src/android/view/InflateTest.java @@ -20,13 +20,11 @@ import android.content.Context; import android.content.res.Resources; import android.test.AndroidTestCase; import android.test.PerformanceTestCase; -import android.test.suitebuilder.annotation.SmallTest; import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import com.android.frameworks.coretests.R; -import java.util.Map; +import androidx.test.filters.SmallTest; + +import com.android.frameworks.coretests.R; public class InflateTest extends AndroidTestCase implements PerformanceTestCase { private LayoutInflater mInflater; diff --git a/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java b/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java index 81ca9109c643..7f00ad9ed2f2 100644 --- a/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java +++ b/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java @@ -18,7 +18,9 @@ package android.view; import static android.view.InsetsState.TYPE_NAVIGATION_BAR; import static android.view.InsetsState.TYPE_TOP_BAR; + import static junit.framework.Assert.assertEquals; + import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -27,12 +29,13 @@ import android.graphics.Matrix; import android.graphics.Rect; import android.graphics.RectF; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.FlakyTest; -import android.support.test.runner.AndroidJUnit4; import android.util.SparseArray; import android.view.SurfaceControl.Transaction; import android.view.SyncRtSurfaceTransactionApplier.SurfaceParams; +import androidx.test.filters.FlakyTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/view/InsetsControllerTest.java b/core/tests/coretests/src/android/view/InsetsControllerTest.java index d3d274a64682..d44745121a22 100644 --- a/core/tests/coretests/src/android/view/InsetsControllerTest.java +++ b/core/tests/coretests/src/android/view/InsetsControllerTest.java @@ -17,18 +17,20 @@ package android.view; import static android.view.InsetsState.TYPE_TOP_BAR; + import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNull; + import static org.mockito.Mockito.mock; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.FlakyTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.FlakyTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Mockito; @Presubmit @FlakyTest(detail = "Promote once confirmed non-flaky") diff --git a/core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java b/core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java index 6d0f98433168..82cd2131ab4e 100644 --- a/core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java +++ b/core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java @@ -17,6 +17,7 @@ package android.view; import static android.view.InsetsState.TYPE_TOP_BAR; + import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.reset; @@ -24,10 +25,11 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.FlakyTest; -import android.support.test.runner.AndroidJUnit4; import android.view.SurfaceControl.Transaction; +import androidx.test.filters.FlakyTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/view/InsetsSourceTest.java b/core/tests/coretests/src/android/view/InsetsSourceTest.java index ed472d2a7f64..98ab3e785d0a 100644 --- a/core/tests/coretests/src/android/view/InsetsSourceTest.java +++ b/core/tests/coretests/src/android/view/InsetsSourceTest.java @@ -17,13 +17,15 @@ package android.view; import static android.view.InsetsState.TYPE_NAVIGATION_BAR; + import static junit.framework.Assert.assertEquals; import android.graphics.Insets; import android.graphics.Rect; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.FlakyTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.FlakyTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/android/view/InsetsStateTest.java b/core/tests/coretests/src/android/view/InsetsStateTest.java index 95af525c3746..9857b7a1e035 100644 --- a/core/tests/coretests/src/android/view/InsetsStateTest.java +++ b/core/tests/coretests/src/android/view/InsetsStateTest.java @@ -24,20 +24,23 @@ import static android.view.InsetsState.TYPE_SIDE_BAR_1; import static android.view.InsetsState.TYPE_SIDE_BAR_2; import static android.view.InsetsState.TYPE_SIDE_BAR_3; import static android.view.InsetsState.TYPE_TOP_BAR; + import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; + import static org.junit.Assert.assertNotEquals; import android.graphics.Insets; import android.graphics.Rect; import android.os.Parcel; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.FlakyTest; -import android.support.test.runner.AndroidJUnit4; import android.util.SparseIntArray; import android.view.WindowInsets.Type; +import androidx.test.filters.FlakyTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/view/KeyEventTest.java b/core/tests/coretests/src/android/view/KeyEventTest.java index b9d95e542f11..88d3bdbe3c92 100644 --- a/core/tests/coretests/src/android/view/KeyEventTest.java +++ b/core/tests/coretests/src/android/view/KeyEventTest.java @@ -20,8 +20,8 @@ import static android.view.Display.INVALID_DISPLAY; import static org.junit.Assert.assertEquals; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/view/ListContextMenu.java b/core/tests/coretests/src/android/view/ListContextMenu.java index 1b4ece6b8eef..e333b9638d25 100644 --- a/core/tests/coretests/src/android/view/ListContextMenu.java +++ b/core/tests/coretests/src/android/view/ListContextMenu.java @@ -16,24 +16,17 @@ package android.view; -import com.android.frameworks.coretests.R; - import android.app.ListActivity; import android.content.Context; import android.os.Bundle; import android.util.Log; -import android.view.ContextMenu; -import android.view.Menu; -import android.view.MenuItem; -import android.view.SubMenu; -import android.view.View; -import android.view.ViewGroup; -import android.view.LayoutInflater; import android.view.ContextMenu.ContextMenuInfo; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.TextView; +import com.android.frameworks.coretests.R; + /** * Exercises context menus in lists */ diff --git a/core/tests/coretests/src/android/view/Longpress.java b/core/tests/coretests/src/android/view/Longpress.java index e8e6f13e30e9..86fa9e54afd3 100644 --- a/core/tests/coretests/src/android/view/Longpress.java +++ b/core/tests/coretests/src/android/view/Longpress.java @@ -16,11 +16,11 @@ package android.view; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; +import com.android.frameworks.coretests.R; + public class Longpress extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { diff --git a/core/tests/coretests/src/android/view/LongpressTest.java b/core/tests/coretests/src/android/view/LongpressTest.java index d3d7589ae641..4dfecd0b2055 100644 --- a/core/tests/coretests/src/android/view/LongpressTest.java +++ b/core/tests/coretests/src/android/view/LongpressTest.java @@ -18,11 +18,12 @@ package android.view; import android.test.ActivityInstrumentationTestCase; import android.test.TouchUtils; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; import android.util.KeyUtils; import android.view.View.OnLongClickListener; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; + import com.android.frameworks.coretests.R; /** diff --git a/core/tests/coretests/src/android/view/MenuTest.java b/core/tests/coretests/src/android/view/MenuTest.java index 116b38a6551b..794769cc032f 100644 --- a/core/tests/coretests/src/android/view/MenuTest.java +++ b/core/tests/coretests/src/android/view/MenuTest.java @@ -17,7 +17,8 @@ package android.view; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.filters.SmallTest; import com.android.frameworks.coretests.R; import com.android.internal.view.menu.MenuBuilder; diff --git a/core/tests/coretests/src/android/view/Merge.java b/core/tests/coretests/src/android/view/Merge.java index bdacd819d2e8..8020e4b07815 100644 --- a/core/tests/coretests/src/android/view/Merge.java +++ b/core/tests/coretests/src/android/view/Merge.java @@ -16,13 +16,11 @@ package android.view; -import com.android.frameworks.coretests.R; - -import android.os.Bundle; import android.app.Activity; +import android.os.Bundle; import android.widget.LinearLayout; -import android.view.ViewGroup; -import android.view.LayoutInflater; + +import com.android.frameworks.coretests.R; /** * Exercise <merge /> tag in XML files. diff --git a/core/tests/coretests/src/android/view/MergeTest.java b/core/tests/coretests/src/android/view/MergeTest.java index acfee7eca036..eccc9cb23e2a 100644 --- a/core/tests/coretests/src/android/view/MergeTest.java +++ b/core/tests/coretests/src/android/view/MergeTest.java @@ -16,11 +16,9 @@ package android.view; -import android.view.Merge; - import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; -import android.view.ViewGroup; + +import androidx.test.filters.MediumTest; public class MergeTest extends ActivityInstrumentationTestCase<Merge> { public MergeTest() { diff --git a/core/tests/coretests/src/android/view/MotionEventTest.java b/core/tests/coretests/src/android/view/MotionEventTest.java index 023526f7e37f..cadf37e0c53c 100644 --- a/core/tests/coretests/src/android/view/MotionEventTest.java +++ b/core/tests/coretests/src/android/view/MotionEventTest.java @@ -22,11 +22,12 @@ import static android.view.MotionEvent.TOOL_TYPE_FINGER; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.view.MotionEvent.PointerCoords; import android.view.MotionEvent.PointerProperties; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/view/MutateDrawable.java b/core/tests/coretests/src/android/view/MutateDrawable.java index 39b57894696f..1ec525d6fe9e 100644 --- a/core/tests/coretests/src/android/view/MutateDrawable.java +++ b/core/tests/coretests/src/android/view/MutateDrawable.java @@ -18,8 +18,9 @@ package android.view; import android.app.Activity; import android.os.Bundle; -import android.widget.LinearLayout; import android.widget.Button; +import android.widget.LinearLayout; + import com.android.frameworks.coretests.R; public class MutateDrawable extends Activity { diff --git a/core/tests/coretests/src/android/view/MutateDrawableTest.java b/core/tests/coretests/src/android/view/MutateDrawableTest.java index 74e011d28508..d63ffb17208f 100644 --- a/core/tests/coretests/src/android/view/MutateDrawableTest.java +++ b/core/tests/coretests/src/android/view/MutateDrawableTest.java @@ -17,9 +17,8 @@ package android.view; import android.test.ActivityInstrumentationTestCase2; -import android.test.suitebuilder.annotation.MediumTest; -import android.view.View; -import android.view.MutateDrawable; + +import androidx.test.filters.MediumTest; public class MutateDrawableTest extends ActivityInstrumentationTestCase2<MutateDrawable> { private View mFirstButton; diff --git a/core/tests/coretests/src/android/view/PinchZoomAction.java b/core/tests/coretests/src/android/view/PinchZoomAction.java index 97fe980e01dc..bec9b557a40d 100644 --- a/core/tests/coretests/src/android/view/PinchZoomAction.java +++ b/core/tests/coretests/src/android/view/PinchZoomAction.java @@ -30,8 +30,6 @@ import android.support.test.espresso.UiController; import android.support.test.espresso.ViewAction; import android.support.test.espresso.action.Swiper; import android.support.test.espresso.util.HumanReadables; -import android.view.MotionEvent; -import android.view.View; import org.hamcrest.Matcher; diff --git a/core/tests/coretests/src/android/view/PopupWindowVisibility.java b/core/tests/coretests/src/android/view/PopupWindowVisibility.java index 85ce04fae71b..e6430d3cea32 100644 --- a/core/tests/coretests/src/android/view/PopupWindowVisibility.java +++ b/core/tests/coretests/src/android/view/PopupWindowVisibility.java @@ -18,7 +18,6 @@ package android.view; import android.app.Activity; import android.os.Bundle; -import android.view.View; import android.view.View.OnClickListener; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; diff --git a/core/tests/coretests/src/android/view/PreDrawListener.java b/core/tests/coretests/src/android/view/PreDrawListener.java index 60bbee483173..77bd36c9001a 100644 --- a/core/tests/coretests/src/android/view/PreDrawListener.java +++ b/core/tests/coretests/src/android/view/PreDrawListener.java @@ -20,15 +20,12 @@ import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.util.AttributeSet; -import android.view.View; -import android.view.ViewTreeObserver; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; import com.android.frameworks.coretests.R; - /** * Tests views with popupWindows becoming invisible */ diff --git a/core/tests/coretests/src/android/view/RenderNodeAnimatorTest.java b/core/tests/coretests/src/android/view/RenderNodeAnimatorTest.java index b52d98c906c4..786c22bf04f6 100644 --- a/core/tests/coretests/src/android/view/RenderNodeAnimatorTest.java +++ b/core/tests/coretests/src/android/view/RenderNodeAnimatorTest.java @@ -21,10 +21,11 @@ import static org.junit.Assert.assertNull; import android.app.Activity; import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.annotation.UiThreadTest; -import android.support.test.filters.MediumTest; -import android.support.test.rule.ActivityTestRule; + +import androidx.test.InstrumentationRegistry; +import androidx.test.annotation.UiThreadTest; +import androidx.test.filters.MediumTest; +import androidx.test.rule.ActivityTestRule; import org.junit.Rule; import org.junit.Test; diff --git a/core/tests/coretests/src/android/view/RunQueue.java b/core/tests/coretests/src/android/view/RunQueue.java index 85dd32e720bd..75444339a1aa 100644 --- a/core/tests/coretests/src/android/view/RunQueue.java +++ b/core/tests/coretests/src/android/view/RunQueue.java @@ -19,8 +19,7 @@ package android.view; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; -import android.view.View; -import android.view.ViewTreeObserver; + import com.android.frameworks.coretests.R; /** diff --git a/core/tests/coretests/src/android/view/RunQueueTest.java b/core/tests/coretests/src/android/view/RunQueueTest.java index d69860beace4..f42f5902a5c3 100644 --- a/core/tests/coretests/src/android/view/RunQueueTest.java +++ b/core/tests/coretests/src/android/view/RunQueueTest.java @@ -17,7 +17,8 @@ package android.view; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; + +import androidx.test.filters.MediumTest; public class RunQueueTest extends ActivityInstrumentationTestCase<RunQueue> { public RunQueueTest() { diff --git a/core/tests/coretests/src/android/view/ScaleGesture.java b/core/tests/coretests/src/android/view/ScaleGesture.java index a954a4a497e2..235b2244e3f8 100644 --- a/core/tests/coretests/src/android/view/ScaleGesture.java +++ b/core/tests/coretests/src/android/view/ScaleGesture.java @@ -16,16 +16,11 @@ package android.view; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; -import android.util.Log; -import android.util.TypedValue; -import android.view.MotionEvent; -import android.view.ScaleGestureDetector; import android.view.ScaleGestureDetector.SimpleOnScaleGestureListener; -import android.widget.TextView; + +import com.android.frameworks.coretests.R; public class ScaleGesture extends Activity { private ScaleGestureDetector mScaleGestureDetector; diff --git a/core/tests/coretests/src/android/view/ScaleGestureDetectorTest.java b/core/tests/coretests/src/android/view/ScaleGestureDetectorTest.java index fba8eae6c3dd..199013513bb3 100644 --- a/core/tests/coretests/src/android/view/ScaleGestureDetectorTest.java +++ b/core/tests/coretests/src/android/view/ScaleGestureDetectorTest.java @@ -16,26 +16,22 @@ package android.view; +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.matcher.ViewMatchers.withId; + import android.content.Context; -import android.support.test.filters.LargeTest; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; import android.test.ActivityInstrumentationTestCase2; import android.util.DisplayMetrics; -import android.view.PinchZoomAction; -import android.view.ScaleGesture; -import android.view.WindowManager; import android.widget.TextView; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.LargeTest; + import com.android.frameworks.coretests.R; import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.junit.runner.RunWith; - -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static android.support.test.espresso.Espresso.onView; @LargeTest public class ScaleGestureDetectorTest extends ActivityInstrumentationTestCase2<ScaleGesture> { diff --git a/core/tests/coretests/src/android/view/SetTagsTest.java b/core/tests/coretests/src/android/view/SetTagsTest.java index 373dce68d495..16997139d83f 100644 --- a/core/tests/coretests/src/android/view/SetTagsTest.java +++ b/core/tests/coretests/src/android/view/SetTagsTest.java @@ -16,12 +16,13 @@ package android.view; -import com.android.frameworks.coretests.R; -import android.test.suitebuilder.annotation.MediumTest; - import android.test.ActivityInstrumentationTestCase2; import android.widget.Button; +import androidx.test.filters.MediumTest; + +import com.android.frameworks.coretests.R; + /** * Exercises {@link android.view.View}'s tags property. */ diff --git a/core/tests/coretests/src/android/view/StubbedView.java b/core/tests/coretests/src/android/view/StubbedView.java index 612095c4e43d..c96b9b704a54 100644 --- a/core/tests/coretests/src/android/view/StubbedView.java +++ b/core/tests/coretests/src/android/view/StubbedView.java @@ -16,11 +16,10 @@ package android.view; -import com.android.frameworks.coretests.R; - -import android.os.Bundle; import android.app.Activity; -import android.view.View; +import android.os.Bundle; + +import com.android.frameworks.coretests.R; /** * Exercise <ViewStub /> tag in XML files. diff --git a/core/tests/coretests/src/android/view/VelocityTest.java b/core/tests/coretests/src/android/view/VelocityTest.java index 7f32208659be..c116f4dc8a43 100644 --- a/core/tests/coretests/src/android/view/VelocityTest.java +++ b/core/tests/coretests/src/android/view/VelocityTest.java @@ -16,16 +16,17 @@ package android.view; -import android.test.suitebuilder.annotation.Suppress; -import junit.framework.Assert; - import android.test.InstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.view.animation.AccelerateInterpolator; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; import android.view.animation.LinearInterpolator; +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; + +import junit.framework.Assert; + /** * Exercises {@link android.view.VelocityTracker} to compute correct velocity.<br> * To launch this test, use :<br> diff --git a/core/tests/coretests/src/android/view/ViewAttachTest.java b/core/tests/coretests/src/android/view/ViewAttachTest.java index aa8f8d82e725..1a8dd9909b03 100644 --- a/core/tests/coretests/src/android/view/ViewAttachTest.java +++ b/core/tests/coretests/src/android/view/ViewAttachTest.java @@ -16,16 +16,13 @@ package android.view; -import android.content.Context; import android.content.pm.ActivityInfo; import android.graphics.PixelFormat; import android.os.SystemClock; -import android.support.test.filters.LargeTest; import android.test.ActivityInstrumentationTestCase2; -import android.test.UiThreadTest; -import android.view.View; -import android.view.ViewGroup; -import android.view.WindowManager; + +import androidx.test.annotation.UiThreadTest; +import androidx.test.filters.LargeTest; import com.android.frameworks.coretests.R; diff --git a/core/tests/coretests/src/android/view/ViewAttachTestActivity.java b/core/tests/coretests/src/android/view/ViewAttachTestActivity.java index 59e25aee7dc5..bcbc8134c226 100644 --- a/core/tests/coretests/src/android/view/ViewAttachTestActivity.java +++ b/core/tests/coretests/src/android/view/ViewAttachTestActivity.java @@ -16,11 +16,11 @@ package android.view; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; +import com.android.frameworks.coretests.R; + public class ViewAttachTestActivity extends Activity { public static final String TAG = "OnAttachedTest"; @Override diff --git a/core/tests/coretests/src/android/view/ViewAttachView.java b/core/tests/coretests/src/android/view/ViewAttachView.java index 5af2d8f33cab..2f3ff8f8769e 100644 --- a/core/tests/coretests/src/android/view/ViewAttachView.java +++ b/core/tests/coretests/src/android/view/ViewAttachView.java @@ -22,7 +22,6 @@ import android.graphics.Color; import android.os.SystemClock; import android.util.AttributeSet; import android.util.Log; -import android.view.View; /** * A View that will throw a RuntimeException if onAttachedToWindow and diff --git a/core/tests/coretests/src/android/view/ViewCaptureTest.java b/core/tests/coretests/src/android/view/ViewCaptureTest.java index 4405934e62e5..218047c5f45e 100644 --- a/core/tests/coretests/src/android/view/ViewCaptureTest.java +++ b/core/tests/coretests/src/android/view/ViewCaptureTest.java @@ -21,14 +21,15 @@ import static org.junit.Assert.assertTrue; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.support.test.filters.SmallTest; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; import android.util.SparseIntArray; import android.view.ViewDebug.CanvasProvider; import android.view.ViewDebug.HardwareCanvasProvider; import android.view.ViewDebug.SoftwareCanvasProvider; +import androidx.test.filters.SmallTest; +import androidx.test.rule.ActivityTestRule; +import androidx.test.runner.AndroidJUnit4; + import com.android.frameworks.coretests.R; import org.junit.Assert; diff --git a/core/tests/coretests/src/android/view/ViewCaptureTestActivity.java b/core/tests/coretests/src/android/view/ViewCaptureTestActivity.java index 20e3eb585435..2f51c2459af9 100644 --- a/core/tests/coretests/src/android/view/ViewCaptureTestActivity.java +++ b/core/tests/coretests/src/android/view/ViewCaptureTestActivity.java @@ -19,6 +19,7 @@ package android.view; import android.annotation.Nullable; import android.app.Activity; import android.os.Bundle; + import com.android.frameworks.coretests.R; public class ViewCaptureTestActivity extends Activity { diff --git a/core/tests/coretests/src/android/view/ViewGroupAttributesTest.java b/core/tests/coretests/src/android/view/ViewGroupAttributesTest.java index b4ef0e7e76bd..c24cd35ff256 100644 --- a/core/tests/coretests/src/android/view/ViewGroupAttributesTest.java +++ b/core/tests/coretests/src/android/view/ViewGroupAttributesTest.java @@ -18,7 +18,8 @@ package android.view; import android.content.Context; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.filters.SmallTest; public class ViewGroupAttributesTest extends AndroidTestCase { diff --git a/core/tests/coretests/src/android/view/ViewGroupChildren.java b/core/tests/coretests/src/android/view/ViewGroupChildren.java index f39720b269b3..d5d98793499e 100644 --- a/core/tests/coretests/src/android/view/ViewGroupChildren.java +++ b/core/tests/coretests/src/android/view/ViewGroupChildren.java @@ -16,12 +16,10 @@ package android.view; -import com.android.frameworks.coretests.R; - -import android.os.Bundle; -import android.widget.Button; -import android.view.View; import android.app.Activity; +import android.os.Bundle; + +import com.android.frameworks.coretests.R; /** * Exercise ViewGroup's ability to add and remove children. diff --git a/core/tests/coretests/src/android/view/ViewGroupChildrenTest.java b/core/tests/coretests/src/android/view/ViewGroupChildrenTest.java index d1665ef8cf14..07cb2a144f32 100644 --- a/core/tests/coretests/src/android/view/ViewGroupChildrenTest.java +++ b/core/tests/coretests/src/android/view/ViewGroupChildrenTest.java @@ -16,18 +16,16 @@ package android.view; -import com.android.frameworks.coretests.R; -import android.view.ViewGroupChildren; - import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.test.ViewAsserts; -import android.test.UiThreadTest; -import android.view.View; -import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.test.annotation.UiThreadTest; +import androidx.test.filters.MediumTest; + +import com.android.frameworks.coretests.R; + /** * Exercises {@link android.view.ViewGroup}'s ability to add/remove children. */ diff --git a/core/tests/coretests/src/android/view/ViewGroupTransientViewTest.java b/core/tests/coretests/src/android/view/ViewGroupTransientViewTest.java index 93ad41f08b06..54524b2c8e70 100644 --- a/core/tests/coretests/src/android/view/ViewGroupTransientViewTest.java +++ b/core/tests/coretests/src/android/view/ViewGroupTransientViewTest.java @@ -22,12 +22,13 @@ import static junit.framework.Assert.fail; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; -import android.support.test.annotation.UiThreadTest; -import android.support.test.filters.MediumTest; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; import android.widget.FrameLayout; +import androidx.test.annotation.UiThreadTest; +import androidx.test.filters.MediumTest; +import androidx.test.rule.ActivityTestRule; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Before; import org.junit.Rule; import org.junit.Test; diff --git a/core/tests/coretests/src/android/view/ViewInvalidateTest.java b/core/tests/coretests/src/android/view/ViewInvalidateTest.java index 115504b50adf..c25a2deb2a05 100644 --- a/core/tests/coretests/src/android/view/ViewInvalidateTest.java +++ b/core/tests/coretests/src/android/view/ViewInvalidateTest.java @@ -21,24 +21,30 @@ import static junit.framework.Assert.assertFalse; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.app.Activity; import android.content.Context; import android.graphics.Rect; -import android.support.test.InstrumentationRegistry; -import android.support.test.annotation.UiThreadTest; -import android.support.test.filters.LargeTest; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; +import android.view.ViewTreeObserver.OnDrawListener; import android.widget.FrameLayout; -import com.android.compatibility.common.util.WidgetTestUtils; +import androidx.test.InstrumentationRegistry; +import androidx.test.annotation.UiThreadTest; +import androidx.test.filters.LargeTest; +import androidx.test.rule.ActivityTestRule; +import androidx.test.runner.AndroidJUnit4; import org.junit.After; +import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + /** * Test of invalidates, drawing, and the flags that support them */ @@ -281,4 +287,42 @@ public class ViewInvalidateTest { View.PFLAG_DRAWN); assertTrue(getViewRoot(mParent).mIsAnimating); } + + /** Copied from cts/common/device-side/util. */ + static class WidgetTestUtils { + public static void runOnMainAndDrawSync(@NonNull final ActivityTestRule activityTestRule, + @NonNull final View view, @Nullable final Runnable runner) throws Throwable { + final CountDownLatch latch = new CountDownLatch(1); + + activityTestRule.runOnUiThread(() -> { + final OnDrawListener listener = new OnDrawListener() { + @Override + public void onDraw() { + // posting so that the sync happens after the draw that's about to happen + view.post(() -> { + activityTestRule.getActivity().getWindow().getDecorView() + .getViewTreeObserver().removeOnDrawListener(this); + latch.countDown(); + }); + } + }; + + activityTestRule.getActivity().getWindow().getDecorView() + .getViewTreeObserver().addOnDrawListener(listener); + + if (runner != null) { + runner.run(); + } + view.invalidate(); + }); + + try { + Assert.assertTrue("Expected draw pass occurred within 5 seconds", + latch.await(5, TimeUnit.SECONDS)); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + } } diff --git a/core/tests/coretests/src/android/view/ViewRootImplTest.java b/core/tests/coretests/src/android/view/ViewRootImplTest.java index ca6d6cfedb76..9a5784774d1c 100644 --- a/core/tests/coretests/src/android/view/ViewRootImplTest.java +++ b/core/tests/coretests/src/android/view/ViewRootImplTest.java @@ -23,9 +23,10 @@ import android.content.Context; import android.graphics.Insets; import android.graphics.Rect; import android.platform.test.annotations.Presubmit; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/android/view/ViewStubTest.java b/core/tests/coretests/src/android/view/ViewStubTest.java index ebd52a6d7774..504a4eca29a2 100644 --- a/core/tests/coretests/src/android/view/ViewStubTest.java +++ b/core/tests/coretests/src/android/view/ViewStubTest.java @@ -16,14 +16,12 @@ package android.view; -import android.view.StubbedView; -import com.android.frameworks.coretests.R; - import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.UiThreadTest; -import android.view.View; -import android.view.ViewStub; + +import androidx.test.annotation.UiThreadTest; +import androidx.test.filters.MediumTest; + +import com.android.frameworks.coretests.R; public class ViewStubTest extends ActivityInstrumentationTestCase<StubbedView> { public ViewStubTest() { diff --git a/core/tests/coretests/src/android/view/ViewTransientStateTest.java b/core/tests/coretests/src/android/view/ViewTransientStateTest.java index 36ea01deea22..3f73b0712d55 100644 --- a/core/tests/coretests/src/android/view/ViewTransientStateTest.java +++ b/core/tests/coretests/src/android/view/ViewTransientStateTest.java @@ -18,12 +18,11 @@ package android.view; import android.app.Activity; import android.test.ActivityInstrumentationTestCase; -import android.test.UiThreadTest; -import android.test.suitebuilder.annotation.MediumTest; -import com.android.frameworks.coretests.R; +import androidx.test.annotation.UiThreadTest; +import androidx.test.filters.MediumTest; -import static org.junit.Assert.assertFalse; +import com.android.frameworks.coretests.R; /** * Exercise set View's transient state diff --git a/core/tests/coretests/src/android/view/Visibility.java b/core/tests/coretests/src/android/view/Visibility.java index 031568c5a446..8e3de4e4a6a3 100644 --- a/core/tests/coretests/src/android/view/Visibility.java +++ b/core/tests/coretests/src/android/view/Visibility.java @@ -16,12 +16,11 @@ package android.view; -import com.android.frameworks.coretests.R; - +import android.app.Activity; import android.os.Bundle; import android.widget.Button; -import android.view.View; -import android.app.Activity; + +import com.android.frameworks.coretests.R; /** * Exercise View's ability to change their visibility: GONE, INVISIBLE and diff --git a/core/tests/coretests/src/android/view/VisibilityCallback.java b/core/tests/coretests/src/android/view/VisibilityCallback.java index f98a0a882764..c9659737e479 100644 --- a/core/tests/coretests/src/android/view/VisibilityCallback.java +++ b/core/tests/coretests/src/android/view/VisibilityCallback.java @@ -16,16 +16,15 @@ package android.view; +import android.app.Activity; import android.content.Context; +import android.os.Bundle; import android.util.AttributeSet; import android.util.Log; +import android.widget.Button; import android.widget.TextView; -import com.android.frameworks.coretests.R; -import android.os.Bundle; -import android.widget.Button; -import android.view.View; -import android.app.Activity; +import com.android.frameworks.coretests.R; /** * Exercise View's ability to change their visibility: GONE, INVISIBLE and diff --git a/core/tests/coretests/src/android/view/VisibilityCallbackTest.java b/core/tests/coretests/src/android/view/VisibilityCallbackTest.java index ec956d24f29c..d7c7b4c0094f 100644 --- a/core/tests/coretests/src/android/view/VisibilityCallbackTest.java +++ b/core/tests/coretests/src/android/view/VisibilityCallbackTest.java @@ -17,12 +17,12 @@ package android.view; import android.test.ActivityInstrumentationTestCase2; -import android.test.UiThreadTest; -import android.test.suitebuilder.annotation.MediumTest; -import android.view.View; -import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; + +import androidx.test.annotation.UiThreadTest; +import androidx.test.filters.MediumTest; + import com.android.frameworks.coretests.R; /** diff --git a/core/tests/coretests/src/android/view/VisibilityTest.java b/core/tests/coretests/src/android/view/VisibilityTest.java index 29c1c8a428e7..83a77024cc43 100644 --- a/core/tests/coretests/src/android/view/VisibilityTest.java +++ b/core/tests/coretests/src/android/view/VisibilityTest.java @@ -20,11 +20,12 @@ import static android.view.KeyEvent.KEYCODE_DPAD_CENTER; import static android.view.KeyEvent.KEYCODE_DPAD_LEFT; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; import android.widget.Button; import android.widget.TextView; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; + import com.android.frameworks.coretests.R; /** diff --git a/core/tests/coretests/src/android/view/WindowInsetsTest.java b/core/tests/coretests/src/android/view/WindowInsetsTest.java index 1513a1a7d222..15a96a144dd5 100644 --- a/core/tests/coretests/src/android/view/WindowInsetsTest.java +++ b/core/tests/coretests/src/android/view/WindowInsetsTest.java @@ -17,18 +17,18 @@ package android.view; import static android.view.WindowInsets.Type.ime; -import static android.view.WindowInsets.Type.indexOf; import static android.view.WindowInsets.Type.sideBars; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import android.graphics.Insets; import android.graphics.Rect; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.view.WindowInsets.Builder; -import android.view.WindowInsets.Type; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/view/ZeroSized.java b/core/tests/coretests/src/android/view/ZeroSized.java index f2a6b3ef3f6d..9e2dfcb8e3d4 100644 --- a/core/tests/coretests/src/android/view/ZeroSized.java +++ b/core/tests/coretests/src/android/view/ZeroSized.java @@ -16,10 +16,10 @@ package android.view; -import com.android.frameworks.coretests.R; - -import android.os.Bundle; import android.app.Activity; +import android.os.Bundle; + +import com.android.frameworks.coretests.R; /** * This activity contains Views with various widths and heights. The goal is to exercise the diff --git a/core/tests/coretests/src/android/view/ZeroSizedTest.java b/core/tests/coretests/src/android/view/ZeroSizedTest.java index 193fc9842e8d..946bf6866d26 100644 --- a/core/tests/coretests/src/android/view/ZeroSizedTest.java +++ b/core/tests/coretests/src/android/view/ZeroSizedTest.java @@ -16,13 +16,12 @@ package android.view; -import android.view.ZeroSized; -import com.android.frameworks.coretests.R; - -import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; -import android.view.View; import android.graphics.Bitmap; +import android.test.ActivityInstrumentationTestCase; + +import androidx.test.filters.MediumTest; + +import com.android.frameworks.coretests.R; /** * Builds the drawing cache of Views of various dimension. The assumption is that diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityCacheTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityCacheTest.java index 7f675ffffee5..a88968bfd089 100644 --- a/core/tests/coretests/src/android/view/accessibility/AccessibilityCacheTest.java +++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityCacheTest.java @@ -28,10 +28,11 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.support.test.filters.LargeTest; -import android.support.test.runner.AndroidJUnit4; import android.view.View; +import androidx.test.filters.LargeTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityEventTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityEventTest.java index 3e03414367bd..46c96c94dc11 100644 --- a/core/tests/coretests/src/android/view/accessibility/AccessibilityEventTest.java +++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityEventTest.java @@ -21,7 +21,8 @@ import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; import android.os.Parcel; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityInteractionClientTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityInteractionClientTest.java index 318d122b3f2f..ab24f89015c7 100644 --- a/core/tests/coretests/src/android/view/accessibility/AccessibilityInteractionClientTest.java +++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityInteractionClientTest.java @@ -22,10 +22,12 @@ import static org.mockito.MockitoAnnotations.initMocks; import android.os.Bundle; import android.os.RemoteException; -import android.support.test.filters.LargeTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.LargeTest; +import androidx.test.runner.AndroidJUnit4; import libcore.util.EmptyArray; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java index 506e5447a239..0ed690ceeef4 100644 --- a/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java +++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java @@ -25,11 +25,12 @@ import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import android.os.Parcel; -import android.support.test.filters.LargeTest; -import android.support.test.runner.AndroidJUnit4; import android.util.ArraySet; import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; +import androidx.test.filters.LargeTest; +import androidx.test.runner.AndroidJUnit4; + import com.android.internal.util.CollectionUtils; import org.junit.Test; diff --git a/core/tests/coretests/src/android/view/accessibility/RecycleAccessibilityEventTest.java b/core/tests/coretests/src/android/view/accessibility/RecycleAccessibilityEventTest.java index 4814c61abe7c..11f4e3cf9304 100644 --- a/core/tests/coretests/src/android/view/accessibility/RecycleAccessibilityEventTest.java +++ b/core/tests/coretests/src/android/view/accessibility/RecycleAccessibilityEventTest.java @@ -14,7 +14,7 @@ package android.view.accessibility; -import android.test.suitebuilder.annotation.SmallTest; +import androidx.test.filters.SmallTest; import junit.framework.TestCase; diff --git a/core/tests/coretests/src/android/view/autofill/AutofillIdTest.java b/core/tests/coretests/src/android/view/autofill/AutofillIdTest.java index 7619af23375f..33bc59349230 100644 --- a/core/tests/coretests/src/android/view/autofill/AutofillIdTest.java +++ b/core/tests/coretests/src/android/view/autofill/AutofillIdTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.view.autofill; import static com.google.common.truth.Truth.assertThat; diff --git a/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java b/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java index 4d3302404d87..6ecb63abf586 100644 --- a/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java +++ b/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.view.contentcapture; import static com.google.common.truth.Truth.assertThat; diff --git a/core/tests/coretests/src/android/view/contentcapture/ViewNodeTest.java b/core/tests/coretests/src/android/view/contentcapture/ViewNodeTest.java index bbfe01c379f1..099f41d10e27 100644 --- a/core/tests/coretests/src/android/view/contentcapture/ViewNodeTest.java +++ b/core/tests/coretests/src/android/view/contentcapture/ViewNodeTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.view.contentcapture; import static com.google.common.truth.Truth.assertThat; @@ -24,7 +25,6 @@ import android.graphics.Matrix; import android.os.Bundle; import android.os.LocaleList; import android.os.Parcel; -import android.support.test.InstrumentationRegistry; import android.view.View; import android.view.ViewStructure.HtmlInfo; import android.view.autofill.AutofillId; @@ -32,6 +32,8 @@ import android.view.autofill.AutofillValue; import android.view.contentcapture.ViewNode.ViewStructureImpl; import android.widget.FrameLayout; +import androidx.test.InstrumentationRegistry; + import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; diff --git a/core/tests/coretests/src/android/view/inputmethod/CursorAnchorInfoTest.java b/core/tests/coretests/src/android/view/inputmethod/CursorAnchorInfoTest.java index 0fd0136a85ed..ace6611a52c5 100644 --- a/core/tests/coretests/src/android/view/inputmethod/CursorAnchorInfoTest.java +++ b/core/tests/coretests/src/android/view/inputmethod/CursorAnchorInfoTest.java @@ -28,11 +28,12 @@ import static org.junit.Assert.assertTrue; import android.graphics.Matrix; import android.graphics.RectF; import android.os.Parcel; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.text.TextUtils; import android.view.inputmethod.CursorAnchorInfo.Builder; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java b/core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java index 1b00e0939688..f24e232765c4 100644 --- a/core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java +++ b/core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java @@ -26,9 +26,10 @@ import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.os.Bundle; import android.os.Parcel; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import com.android.frameworks.coretests.R; diff --git a/core/tests/coretests/src/android/view/inputmethod/InputMethodManagerTest.java b/core/tests/coretests/src/android/view/inputmethod/InputMethodManagerTest.java index 55e5e3698f33..9f259a841319 100644 --- a/core/tests/coretests/src/android/view/inputmethod/InputMethodManagerTest.java +++ b/core/tests/coretests/src/android/view/inputmethod/InputMethodManagerTest.java @@ -20,11 +20,12 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.view.WindowManager; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/view/inputmethod/InputMethodSubtypeArrayTest.java b/core/tests/coretests/src/android/view/inputmethod/InputMethodSubtypeArrayTest.java index 8df18480ed5a..e2fb46af5b64 100644 --- a/core/tests/coretests/src/android/view/inputmethod/InputMethodSubtypeArrayTest.java +++ b/core/tests/coretests/src/android/view/inputmethod/InputMethodSubtypeArrayTest.java @@ -19,10 +19,11 @@ package android.view.inputmethod; import static org.junit.Assert.assertEquals; import android.os.Parcel; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/view/inputmethod/InputMethodSubtypeTest.java b/core/tests/coretests/src/android/view/inputmethod/InputMethodSubtypeTest.java index c76359ee39bc..1e0e1235161c 100644 --- a/core/tests/coretests/src/android/view/inputmethod/InputMethodSubtypeTest.java +++ b/core/tests/coretests/src/android/view/inputmethod/InputMethodSubtypeTest.java @@ -23,10 +23,11 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import android.os.Parcel; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/view/inputmethod/SparseRectFArrayTest.java b/core/tests/coretests/src/android/view/inputmethod/SparseRectFArrayTest.java index 8c96b588d08f..453ad72b64dc 100644 --- a/core/tests/coretests/src/android/view/inputmethod/SparseRectFArrayTest.java +++ b/core/tests/coretests/src/android/view/inputmethod/SparseRectFArrayTest.java @@ -23,10 +23,11 @@ import static org.junit.Assert.assertTrue; import android.graphics.RectF; import android.os.Parcel; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.view.inputmethod.SparseRectFArray.SparseRectFArrayBuilder; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/view/menu/ContextMenuTest.java b/core/tests/coretests/src/android/view/menu/ContextMenuTest.java index 657a7fc7b798..ba85d765ceda 100644 --- a/core/tests/coretests/src/android/view/menu/ContextMenuTest.java +++ b/core/tests/coretests/src/android/view/menu/ContextMenuTest.java @@ -18,7 +18,6 @@ package android.view.menu; import android.content.Context; import android.graphics.Point; -import android.support.test.filters.MediumTest; import android.test.ActivityInstrumentationTestCase; import android.util.PollingCheck; import android.view.Display; @@ -26,6 +25,8 @@ import android.view.View; import android.view.WindowManager; import android.widget.espresso.ContextMenuUtils; +import androidx.test.filters.MediumTest; + @MediumTest public class ContextMenuTest extends ActivityInstrumentationTestCase<ContextMenuActivity> { diff --git a/core/tests/coretests/src/android/view/menu/MenuLayout.java b/core/tests/coretests/src/android/view/menu/MenuLayout.java index 356c9482de41..33ee5158bc12 100644 --- a/core/tests/coretests/src/android/view/menu/MenuLayout.java +++ b/core/tests/coretests/src/android/view/menu/MenuLayout.java @@ -16,8 +16,6 @@ package android.view.menu; -import android.view.menu.MenuScenario.Params; - import android.os.Bundle; import android.view.Menu; import android.widget.Button; diff --git a/core/tests/coretests/src/android/view/menu/MenuLayoutLandscapeTest.java b/core/tests/coretests/src/android/view/menu/MenuLayoutLandscapeTest.java index 8ed0d86d850d..ff9f166afb5f 100644 --- a/core/tests/coretests/src/android/view/menu/MenuLayoutLandscapeTest.java +++ b/core/tests/coretests/src/android/view/menu/MenuLayoutLandscapeTest.java @@ -16,13 +16,10 @@ package android.view.menu; +import android.test.ActivityInstrumentationTestCase; import android.util.KeyUtils; -import com.android.internal.view.menu.IconMenuView; -import com.android.internal.view.menu.MenuBuilder; -import android.content.pm.ActivityInfo; -import android.support.test.filters.LargeTest; -import android.test.ActivityInstrumentationTestCase; +import androidx.test.filters.LargeTest; @LargeTest public class MenuLayoutLandscapeTest extends ActivityInstrumentationTestCase<MenuLayoutLandscape> { diff --git a/core/tests/coretests/src/android/view/menu/MenuLayoutPortraitTest.java b/core/tests/coretests/src/android/view/menu/MenuLayoutPortraitTest.java index ccf12643593b..360be5343a2b 100644 --- a/core/tests/coretests/src/android/view/menu/MenuLayoutPortraitTest.java +++ b/core/tests/coretests/src/android/view/menu/MenuLayoutPortraitTest.java @@ -16,11 +16,11 @@ package android.view.menu; -import android.content.pm.ActivityInfo; -import android.support.test.filters.LargeTest; import android.test.ActivityInstrumentationTestCase; import android.util.KeyUtils; +import androidx.test.filters.LargeTest; + @LargeTest public class MenuLayoutPortraitTest extends ActivityInstrumentationTestCase<MenuLayoutPortrait> { private static final String LONG_TITLE = "Really really really really really really really really really really long title"; diff --git a/core/tests/coretests/src/android/view/menu/MenuWith1ItemTest.java b/core/tests/coretests/src/android/view/menu/MenuWith1ItemTest.java index 82ad858ba3a9..c18e36136990 100644 --- a/core/tests/coretests/src/android/view/menu/MenuWith1ItemTest.java +++ b/core/tests/coretests/src/android/view/menu/MenuWith1ItemTest.java @@ -16,17 +16,12 @@ package android.view.menu; -import android.view.menu.MenuWith1Item; -import android.util.KeyUtils; -import com.android.internal.view.menu.MenuBuilder; - -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.TouchUtils; - import android.test.ActivityInstrumentationTestCase; +import android.util.KeyUtils; import android.view.KeyEvent; -import android.view.View; + +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; public class MenuWith1ItemTest extends ActivityInstrumentationTestCase<MenuWith1Item> { private MenuWith1Item mActivity; diff --git a/core/tests/coretests/src/android/view/textclassifier/ActionsSuggestionsHelperTest.java b/core/tests/coretests/src/android/view/textclassifier/ActionsSuggestionsHelperTest.java index 4a6c093e3bd1..780e15ab885e 100644 --- a/core/tests/coretests/src/android/view/textclassifier/ActionsSuggestionsHelperTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/ActionsSuggestionsHelperTest.java @@ -22,8 +22,9 @@ import static android.view.textclassifier.ConversationActions.Message.PERSON_USE import static com.google.common.truth.Truth.assertThat; import android.app.Person; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import com.google.android.textclassifier.ActionsSuggestionsModel; diff --git a/core/tests/coretests/src/android/view/textclassifier/FakeContextBuilder.java b/core/tests/coretests/src/android/view/textclassifier/FakeContextBuilder.java index 018085698d0c..fef6583f4f98 100644 --- a/core/tests/coretests/src/android/view/textclassifier/FakeContextBuilder.java +++ b/core/tests/coretests/src/android/view/textclassifier/FakeContextBuilder.java @@ -21,6 +21,7 @@ import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import android.annotation.Nullable; import android.content.ComponentName; import android.content.Context; import android.content.ContextWrapper; @@ -29,9 +30,8 @@ import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; -import android.support.test.InstrumentationRegistry; -import androidx.annotation.Nullable; +import androidx.test.InstrumentationRegistry; import com.google.common.base.Preconditions; diff --git a/core/tests/coretests/src/android/view/textclassifier/IntentFactoryTest.java b/core/tests/coretests/src/android/view/textclassifier/IntentFactoryTest.java index aaadefb90ece..3fc8e4c2eecd 100644 --- a/core/tests/coretests/src/android/view/textclassifier/IntentFactoryTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/IntentFactoryTest.java @@ -13,14 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.view.textclassifier; import static com.google.common.truth.Truth.assertThat; import android.content.Intent; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import com.google.android.textclassifier.AnnotatorModel; diff --git a/core/tests/coretests/src/android/view/textclassifier/ModelFileManagerTest.java b/core/tests/coretests/src/android/view/textclassifier/ModelFileManagerTest.java index 88d162b34144..74b8e3b49f7b 100644 --- a/core/tests/coretests/src/android/view/textclassifier/ModelFileManagerTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/ModelFileManagerTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.view.textclassifier; import static com.google.common.truth.Truth.assertThat; @@ -20,9 +21,10 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.when; import android.os.LocaleList; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Before; diff --git a/core/tests/coretests/src/android/view/textclassifier/SelectionEventTest.java b/core/tests/coretests/src/android/view/textclassifier/SelectionEventTest.java index a3c6179792b1..46e3a4c26dde 100644 --- a/core/tests/coretests/src/android/view/textclassifier/SelectionEventTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/SelectionEventTest.java @@ -19,8 +19,9 @@ package android.view.textclassifier; import static org.junit.Assert.assertEquals; import android.os.Parcel; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassificationConstantsTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassificationConstantsTest.java index 54007fb98e67..9662182b8cf8 100644 --- a/core/tests/coretests/src/android/view/textclassifier/TextClassificationConstantsTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/TextClassificationConstantsTest.java @@ -20,8 +20,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java index a3f69d93ad44..4fcd51c9be1d 100644 --- a/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java @@ -26,9 +26,10 @@ import android.content.Context; import android.content.Intent; import android.os.LocaleList; import android.service.textclassifier.TextClassifierService; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java index aaf7312fe0e6..99c959ef57e4 100644 --- a/core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java @@ -32,11 +32,12 @@ import android.graphics.drawable.Icon; import android.os.Bundle; import android.os.LocaleList; import android.os.Parcel; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.view.View; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java index ec6101c09b7b..7009fb2ea758 100644 --- a/core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java @@ -24,11 +24,12 @@ import static org.junit.Assert.assertTrue; import android.content.Context; import android.content.Intent; import android.os.LocaleList; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; import android.text.Spannable; import android.text.SpannableString; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; + import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.hamcrest.Matcher; diff --git a/core/tests/coretests/src/android/view/textclassifier/TextLanguageTest.java b/core/tests/coretests/src/android/view/textclassifier/TextLanguageTest.java index 1dcaed6f6a1e..d0d32e3a507a 100644 --- a/core/tests/coretests/src/android/view/textclassifier/TextLanguageTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/TextLanguageTest.java @@ -21,8 +21,9 @@ import static org.junit.Assert.assertEquals; import android.icu.util.ULocale; import android.os.Bundle; import android.os.Parcel; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java b/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java index f022d040246b..b9cc8f4ba4a0 100644 --- a/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java @@ -21,10 +21,11 @@ import static org.junit.Assert.assertEquals; import android.os.Bundle; import android.os.LocaleList; import android.os.Parcel; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.util.ArrayMap; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/view/textclassifier/TextSelectionTest.java b/core/tests/coretests/src/android/view/textclassifier/TextSelectionTest.java index 2ea49f7d21be..30cc4e8990e0 100644 --- a/core/tests/coretests/src/android/view/textclassifier/TextSelectionTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/TextSelectionTest.java @@ -21,8 +21,9 @@ import static org.junit.Assert.assertEquals; import android.os.Bundle; import android.os.LocaleList; import android.os.Parcel; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/view/textclassifier/logging/GenerateLinksLoggerTest.java b/core/tests/coretests/src/android/view/textclassifier/logging/GenerateLinksLoggerTest.java index 8e4f02c668b7..5e8e5823eefa 100644 --- a/core/tests/coretests/src/android/view/textclassifier/logging/GenerateLinksLoggerTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/logging/GenerateLinksLoggerTest.java @@ -23,13 +23,14 @@ import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.mock; import android.metrics.LogMaker; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.util.ArrayMap; import android.view.textclassifier.GenerateLinksLogger; import android.view.textclassifier.TextClassifier; import android.view.textclassifier.TextLinks; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; diff --git a/core/tests/coretests/src/android/view/textclassifier/logging/TextClassifierEventTronLoggerTest.java b/core/tests/coretests/src/android/view/textclassifier/logging/TextClassifierEventTronLoggerTest.java index 0597a89e87d4..b1b74160ecd5 100644 --- a/core/tests/coretests/src/android/view/textclassifier/logging/TextClassifierEventTronLoggerTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/logging/TextClassifierEventTronLoggerTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.view.textclassifier.logging; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_TEXT_SELECTION_SMART_SHARE; @@ -24,13 +25,14 @@ import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ import static com.google.common.truth.Truth.assertThat; import android.metrics.LogMaker; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.view.textclassifier.ConversationAction; import android.view.textclassifier.TextClassificationContext; import android.view.textclassifier.TextClassifierEvent; import android.view.textclassifier.TextClassifierEventTronLogger; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import com.android.internal.logging.MetricsLogger; import org.junit.Before; diff --git a/core/tests/coretests/src/android/view/textservice/SpellCheckerSubtypeTest.java b/core/tests/coretests/src/android/view/textservice/SpellCheckerSubtypeTest.java index 4a1c414234bd..638d894b114a 100644 --- a/core/tests/coretests/src/android/view/textservice/SpellCheckerSubtypeTest.java +++ b/core/tests/coretests/src/android/view/textservice/SpellCheckerSubtypeTest.java @@ -16,15 +16,16 @@ package android.view.textservice; +import static android.test.MoreAsserts.assertNotEqual; + import android.os.Parcel; import android.test.InstrumentationTestCase; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.filters.SmallTest; import java.util.Arrays; import java.util.Locale; -import static android.test.MoreAsserts.assertNotEqual; - /** * TODO: Most of part can be, and probably should be, moved to CTS. */ diff --git a/core/tests/coretests/src/android/widget/AppWidgetHostViewTest.java b/core/tests/coretests/src/android/widget/AppWidgetHostViewTest.java index 4f31c4ee72a4..6edc1628b163 100644 --- a/core/tests/coretests/src/android/widget/AppWidgetHostViewTest.java +++ b/core/tests/coretests/src/android/widget/AppWidgetHostViewTest.java @@ -24,18 +24,14 @@ import static org.junit.Assert.assertTrue; import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetManager; import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.view.View; import android.view.ViewGroup.OnHierarchyChangeListener; -import com.android.frameworks.coretests.R; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; -import java.util.ArrayList; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.Executor; -import java.util.concurrent.Future; +import com.android.frameworks.coretests.R; import org.junit.Before; import org.junit.Rule; @@ -43,6 +39,11 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; +import java.util.ArrayList; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.Executor; +import java.util.concurrent.Future; + /** * Tests for AppWidgetHostView */ diff --git a/core/tests/coretests/src/android/widget/AutoCompleteTextViewCallbacks.java b/core/tests/coretests/src/android/widget/AutoCompleteTextViewCallbacks.java index 8e73b521cdfc..01e82a5a9f7f 100644 --- a/core/tests/coretests/src/android/widget/AutoCompleteTextViewCallbacks.java +++ b/core/tests/coretests/src/android/widget/AutoCompleteTextViewCallbacks.java @@ -18,7 +18,8 @@ package android.widget; import android.app.Instrumentation; import android.test.ActivityInstrumentationTestCase2; -import android.test.FlakyTest; + +import androidx.test.filters.FlakyTest; // TODO: tests fail intermittently. Add back MediumTest annotation when fixed public class AutoCompleteTextViewCallbacks @@ -32,7 +33,7 @@ public class AutoCompleteTextViewCallbacks /** Test that the initial popup of the suggestions does not select anything. */ - @FlakyTest(tolerance=3) + @FlakyTest public void testPopupNoSelection() throws Exception { AutoCompleteTextViewSimple theActivity = getActivity(); AutoCompleteTextView textView = theActivity.getTextView(); @@ -57,7 +58,7 @@ public class AutoCompleteTextViewCallbacks } /** Test that arrow-down into the popup calls the onSelected callback. */ - @FlakyTest(tolerance=3) + @FlakyTest public void testPopupEnterSelection() throws Exception { final AutoCompleteTextViewSimple theActivity = getActivity(); AutoCompleteTextView textView = theActivity.getTextView(); @@ -106,7 +107,7 @@ public class AutoCompleteTextViewCallbacks } /** Test that arrow-up out of the popup calls the onNothingSelected callback */ - @FlakyTest(tolerance=3) + @FlakyTest public void testPopupLeaveSelection() { final AutoCompleteTextViewSimple theActivity = getActivity(); AutoCompleteTextView textView = theActivity.getTextView(); diff --git a/core/tests/coretests/src/android/widget/AutoCompleteTextViewPopup.java b/core/tests/coretests/src/android/widget/AutoCompleteTextViewPopup.java index ee0abaea027a..21e4184e8e4d 100644 --- a/core/tests/coretests/src/android/widget/AutoCompleteTextViewPopup.java +++ b/core/tests/coretests/src/android/widget/AutoCompleteTextViewPopup.java @@ -18,8 +18,8 @@ package android.widget; import android.app.Instrumentation; import android.test.ActivityInstrumentationTestCase2; -import android.test.FlakyTest; -import android.test.suitebuilder.annotation.MediumTest; + +import androidx.test.filters.FlakyTest; /** * A collection of tests on aspects of the AutoCompleteTextView's popup @@ -41,7 +41,7 @@ public class AutoCompleteTextViewPopup } /** Test that we can move the selection and it responds as expected */ - @FlakyTest(tolerance=3) + @FlakyTest public void testPopupSetListSelection() throws Throwable { AutoCompleteTextViewSimple theActivity = getActivity(); final AutoCompleteTextView textView = theActivity.getTextView(); @@ -73,7 +73,7 @@ public class AutoCompleteTextViewPopup } /** Test that we can look at the selection as we move around */ - @FlakyTest(tolerance=3) + @FlakyTest public void testPopupGetListSelection() throws Throwable { AutoCompleteTextViewSimple theActivity = getActivity(); final AutoCompleteTextView textView = theActivity.getTextView(); @@ -100,7 +100,7 @@ public class AutoCompleteTextViewPopup } /** Test that we can clear the selection */ - @FlakyTest(tolerance=3) + @FlakyTest public void testPopupClearListSelection() throws Throwable { AutoCompleteTextViewSimple theActivity = getActivity(); final AutoCompleteTextView textView = theActivity.getTextView(); @@ -133,7 +133,7 @@ public class AutoCompleteTextViewPopup } /** Make sure we handle an empty adapter properly */ - @FlakyTest(tolerance=3) + @FlakyTest public void testPopupNavigateNoAdapter() throws Throwable { AutoCompleteTextViewSimple theActivity = getActivity(); final AutoCompleteTextView textView = theActivity.getTextView(); @@ -167,7 +167,7 @@ public class AutoCompleteTextViewPopup } /** Test the show/hide behavior of the drop-down. */ - @FlakyTest(tolerance=3) + @FlakyTest public void testPopupShow() throws Throwable { AutoCompleteTextViewSimple theActivity = getActivity(); final AutoCompleteTextView textView = theActivity.getTextView(); diff --git a/core/tests/coretests/src/android/widget/AutoCompleteTextViewSimple.java b/core/tests/coretests/src/android/widget/AutoCompleteTextViewSimple.java index b4e05aa26de7..063bec5fa7cc 100644 --- a/core/tests/coretests/src/android/widget/AutoCompleteTextViewSimple.java +++ b/core/tests/coretests/src/android/widget/AutoCompleteTextViewSimple.java @@ -16,8 +16,6 @@ package android.widget; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; import android.util.Log; @@ -25,6 +23,8 @@ import android.view.View; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemSelectedListener; +import com.android.frameworks.coretests.R; + public class AutoCompleteTextViewSimple extends Activity implements OnItemClickListener, OnItemSelectedListener { diff --git a/core/tests/coretests/src/android/widget/DatePickerActivity.java b/core/tests/coretests/src/android/widget/DatePickerActivity.java index c3b25a1a5a8c..9e455b223865 100644 --- a/core/tests/coretests/src/android/widget/DatePickerActivity.java +++ b/core/tests/coretests/src/android/widget/DatePickerActivity.java @@ -18,6 +18,7 @@ package android.widget; import android.app.Activity; import android.os.Bundle; + import com.android.frameworks.coretests.R; /** diff --git a/core/tests/coretests/src/android/widget/DatePickerFocusTest.java b/core/tests/coretests/src/android/widget/DatePickerFocusTest.java index be85450be429..f0672304d90e 100644 --- a/core/tests/coretests/src/android/widget/DatePickerFocusTest.java +++ b/core/tests/coretests/src/android/widget/DatePickerFocusTest.java @@ -19,11 +19,12 @@ package android.widget; import android.app.Activity; import android.app.Instrumentation; import android.os.SystemClock; -import android.support.test.filters.LargeTest; import android.test.ActivityInstrumentationTestCase2; import android.view.KeyEvent; import android.view.View; +import androidx.test.filters.LargeTest; + import com.android.frameworks.coretests.R; /** diff --git a/core/tests/coretests/src/android/widget/DateTimeViewTest.java b/core/tests/coretests/src/android/widget/DateTimeViewTest.java index 40a6b7a43f53..d0bd4b8b0bd5 100644 --- a/core/tests/coretests/src/android/widget/DateTimeViewTest.java +++ b/core/tests/coretests/src/android/widget/DateTimeViewTest.java @@ -16,10 +16,10 @@ package android.widget; -import android.support.test.InstrumentationRegistry; -import android.support.test.annotation.UiThreadTest; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.InstrumentationRegistry; +import androidx.test.annotation.UiThreadTest; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/widget/EditorCursorTest.java b/core/tests/coretests/src/android/widget/EditorCursorTest.java index 9186827b38f3..e4f55df6f683 100644 --- a/core/tests/coretests/src/android/widget/EditorCursorTest.java +++ b/core/tests/coretests/src/android/widget/EditorCursorTest.java @@ -31,10 +31,11 @@ import static org.hamcrest.Matchers.sameInstance; import android.app.Activity; import android.app.Instrumentation; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.MediumTest; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.MediumTest; +import androidx.test.rule.ActivityTestRule; +import androidx.test.runner.AndroidJUnit4; import com.android.frameworks.coretests.R; diff --git a/core/tests/coretests/src/android/widget/ListViewTest.java b/core/tests/coretests/src/android/widget/ListViewTest.java index 449b696fb008..254af2aed768 100644 --- a/core/tests/coretests/src/android/widget/ListViewTest.java +++ b/core/tests/coretests/src/android/widget/ListViewTest.java @@ -16,20 +16,19 @@ package android.widget; -import android.test.suitebuilder.annotation.Suppress; -import com.google.android.collect.Lists; - -import junit.framework.Assert; - import android.content.Context; import android.content.res.Resources; import android.test.InstrumentationTestCase; import android.test.mock.MockContext; -import android.test.suitebuilder.annotation.MediumTest; import android.view.View; import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.ListView; + +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; + +import com.google.android.collect.Lists; + +import junit.framework.Assert; import java.util.List; diff --git a/core/tests/coretests/src/android/widget/RadioGroupActivity.java b/core/tests/coretests/src/android/widget/RadioGroupActivity.java index c87aa3ad609d..dd3b30a7b326 100644 --- a/core/tests/coretests/src/android/widget/RadioGroupActivity.java +++ b/core/tests/coretests/src/android/widget/RadioGroupActivity.java @@ -17,11 +17,11 @@ package android.widget; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; +import com.android.frameworks.coretests.R; + public class RadioGroupActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { diff --git a/core/tests/coretests/src/android/widget/RadioGroupPreCheckedTest.java b/core/tests/coretests/src/android/widget/RadioGroupPreCheckedTest.java index 1ab362835bbe..18c1ea164ebb 100644 --- a/core/tests/coretests/src/android/widget/RadioGroupPreCheckedTest.java +++ b/core/tests/coretests/src/android/widget/RadioGroupPreCheckedTest.java @@ -16,12 +16,13 @@ package android.widget; -import com.android.frameworks.coretests.R; - import android.test.ActivityInstrumentationTestCase2; import android.test.TouchUtils; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; + +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; + +import com.android.frameworks.coretests.R; /** * Exercises {@link android.widget.RadioGroup}'s check feature. diff --git a/core/tests/coretests/src/android/widget/RemoteViewsAdapterTest.java b/core/tests/coretests/src/android/widget/RemoteViewsAdapterTest.java index 06b860a96117..da53f6d94f49 100644 --- a/core/tests/coretests/src/android/widget/RemoteViewsAdapterTest.java +++ b/core/tests/coretests/src/android/widget/RemoteViewsAdapterTest.java @@ -38,11 +38,12 @@ import android.database.DataSetObserver; import android.os.Handler; import android.os.Looper; import android.os.RemoteException; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.view.View; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import com.android.frameworks.coretests.R; import com.android.internal.widget.IRemoteViewsFactory; diff --git a/core/tests/coretests/src/android/widget/RemoteViewsTest.java b/core/tests/coretests/src/android/widget/RemoteViewsTest.java index 36792bbf6fb6..8cb7e1b95245 100644 --- a/core/tests/coretests/src/android/widget/RemoteViewsTest.java +++ b/core/tests/coretests/src/android/widget/RemoteViewsTest.java @@ -32,12 +32,13 @@ import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Binder; import android.os.Parcel; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.view.View; import android.view.ViewGroup; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import com.android.frameworks.coretests.R; import org.junit.Before; diff --git a/core/tests/coretests/src/android/widget/SelectionActionModeHelperTest.java b/core/tests/coretests/src/android/widget/SelectionActionModeHelperTest.java index 2add22105681..74aad9afa359 100644 --- a/core/tests/coretests/src/android/widget/SelectionActionModeHelperTest.java +++ b/core/tests/coretests/src/android/widget/SelectionActionModeHelperTest.java @@ -22,7 +22,8 @@ import static java.util.function.Function.identity; import android.graphics.PointF; import android.graphics.RectF; -import android.support.test.filters.LargeTest; + +import androidx.test.filters.LargeTest; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/widget/SimpleCursorAdapterTest.java b/core/tests/coretests/src/android/widget/SimpleCursorAdapterTest.java index 1731c08df018..a79b30dbbe1a 100644 --- a/core/tests/coretests/src/android/widget/SimpleCursorAdapterTest.java +++ b/core/tests/coretests/src/android/widget/SimpleCursorAdapterTest.java @@ -16,14 +16,15 @@ package android.widget; -import android.test.suitebuilder.annotation.Suppress; -import com.google.android.collect.Lists; - import android.content.Context; import android.database.Cursor; import android.database.MatrixCursor; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; + +import androidx.test.filters.SmallTest; +import androidx.test.filters.Suppress; + +import com.google.android.collect.Lists; import java.util.ArrayList; import java.util.Random; diff --git a/core/tests/coretests/src/android/widget/SuggestionsPopupWindowTest.java b/core/tests/coretests/src/android/widget/SuggestionsPopupWindowTest.java index eafe42723780..483270e1f9ab 100644 --- a/core/tests/coretests/src/android/widget/SuggestionsPopupWindowTest.java +++ b/core/tests/coretests/src/android/widget/SuggestionsPopupWindowTest.java @@ -36,13 +36,13 @@ import static android.widget.espresso.SuggestionsPopupwindowUtils.clickSuggestio import static android.widget.espresso.SuggestionsPopupwindowUtils.onSuggestionsPopup; import static android.widget.espresso.TextViewActions.clickOnTextAtIndex; import static android.widget.espresso.TextViewActions.longPressOnTextAtIndex; + import static org.hamcrest.Matchers.is; + import android.content.res.TypedArray; import android.support.test.espresso.NoMatchingViewException; import android.support.test.espresso.ViewAssertion; import android.test.ActivityInstrumentationTestCase2; -import android.test.suitebuilder.annotation.SmallTest; -import android.test.suitebuilder.annotation.Suppress; import android.text.Selection; import android.text.Spannable; import android.text.Spanned; @@ -51,6 +51,8 @@ import android.text.style.SuggestionSpan; import android.text.style.TextAppearanceSpan; import android.view.View; +import androidx.test.filters.SmallTest; + import com.android.frameworks.coretests.R; /** diff --git a/core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java b/core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java index ff4a7dafc627..41fa08b7e0e2 100644 --- a/core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java +++ b/core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java @@ -43,14 +43,15 @@ import static android.widget.espresso.TextViewAssertions.hasInsertionPointerAtIn import static android.widget.espresso.TextViewAssertions.hasSelection; import android.app.Activity; -import android.support.test.filters.MediumTest; -import android.support.test.filters.Suppress; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; import android.view.MotionEvent; import android.view.textclassifier.TextClassificationManager; import android.view.textclassifier.TextClassifier; +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; +import androidx.test.rule.ActivityTestRule; +import androidx.test.runner.AndroidJUnit4; + import com.android.frameworks.coretests.R; import org.junit.Before; diff --git a/core/tests/coretests/src/android/widget/TextViewActivityTest.java b/core/tests/coretests/src/android/widget/TextViewActivityTest.java index 90758ba7c418..9d93421b1783 100644 --- a/core/tests/coretests/src/android/widget/TextViewActivityTest.java +++ b/core/tests/coretests/src/android/widget/TextViewActivityTest.java @@ -27,10 +27,8 @@ import static android.support.test.espresso.matcher.ViewMatchers.withId; import static android.support.test.espresso.matcher.ViewMatchers.withText; import static android.widget.espresso.CustomViewActions.longPressAtRelativeCoordinates; import static android.widget.espresso.DragHandleUtils.onHandleView; -import static android.widget.espresso.FloatingToolbarEspressoUtils - .assertFloatingToolbarContainsItem; -import static android.widget.espresso.FloatingToolbarEspressoUtils - .assertFloatingToolbarDoesNotContainItem; +import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarContainsItem; +import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarDoesNotContainItem; import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarIsDisplayed; import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarItemIndex; import static android.widget.espresso.FloatingToolbarEspressoUtils.clickFloatingToolbarItem; @@ -62,13 +60,8 @@ import android.app.Activity; import android.app.Instrumentation; import android.content.ClipData; import android.content.ClipboardManager; -import android.support.test.InstrumentationRegistry; import android.support.test.espresso.action.EspressoKey; -import android.support.test.filters.MediumTest; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; import android.support.test.uiautomator.UiDevice; -import android.test.suitebuilder.annotation.Suppress; import android.text.InputType; import android.text.Selection; import android.text.Spannable; @@ -85,6 +78,12 @@ import android.view.textclassifier.TextLinks; import android.view.textclassifier.TextLinksParams; import android.widget.espresso.CustomViewActions.RelativeCoordinatesProvider; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; +import androidx.test.rule.ActivityTestRule; +import androidx.test.runner.AndroidJUnit4; + import com.android.frameworks.coretests.R; import org.junit.Before; diff --git a/core/tests/coretests/src/android/widget/TextViewFallbackLineSpacingTest.java b/core/tests/coretests/src/android/widget/TextViewFallbackLineSpacingTest.java index e9d1d3e00e8a..113db9d7a2b7 100644 --- a/core/tests/coretests/src/android/widget/TextViewFallbackLineSpacingTest.java +++ b/core/tests/coretests/src/android/widget/TextViewFallbackLineSpacingTest.java @@ -21,8 +21,6 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import android.app.Activity; -import android.support.test.filters.MediumTest; -import android.support.test.rule.ActivityTestRule; import android.text.DynamicLayout; import android.text.FontFallbackSetup; import android.text.Layout; @@ -31,6 +29,9 @@ import android.util.TypedValue; import android.view.View; import android.widget.TextView.BufferType; +import androidx.test.filters.MediumTest; +import androidx.test.rule.ActivityTestRule; + import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/widget/TextViewPerformanceTest.java b/core/tests/coretests/src/android/widget/TextViewPerformanceTest.java index cf173fb78a32..a769ea40b4f2 100644 --- a/core/tests/coretests/src/android/widget/TextViewPerformanceTest.java +++ b/core/tests/coretests/src/android/widget/TextViewPerformanceTest.java @@ -20,14 +20,15 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.MediumTest; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.text.SpannedString; import android.view.View; import android.view.ViewGroup; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.MediumTest; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/android/widget/TextViewTest.java b/core/tests/coretests/src/android/widget/TextViewTest.java index 1c5610b1bc7d..585360fdd2f3 100644 --- a/core/tests/coretests/src/android/widget/TextViewTest.java +++ b/core/tests/coretests/src/android/widget/TextViewTest.java @@ -27,11 +27,6 @@ import android.content.Context; import android.content.Intent; import android.graphics.Paint; import android.platform.test.annotations.Presubmit; -import android.support.test.InstrumentationRegistry; -import android.support.test.annotation.UiThreadTest; -import android.support.test.filters.MediumTest; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; import android.text.GetChars; import android.text.Layout; import android.text.PrecomputedText; @@ -40,6 +35,12 @@ import android.text.Spannable; import android.view.View; import android.widget.TextView.BufferType; +import androidx.test.InstrumentationRegistry; +import androidx.test.annotation.UiThreadTest; +import androidx.test.filters.MediumTest; +import androidx.test.rule.ActivityTestRule; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Before; import org.junit.Rule; import org.junit.Test; diff --git a/core/tests/coretests/src/android/widget/focus/AdjacentVerticalRectLists.java b/core/tests/coretests/src/android/widget/focus/AdjacentVerticalRectLists.java index 75da6fef46ff..85a4509c18a3 100644 --- a/core/tests/coretests/src/android/widget/focus/AdjacentVerticalRectLists.java +++ b/core/tests/coretests/src/android/widget/focus/AdjacentVerticalRectLists.java @@ -16,12 +16,11 @@ package android.widget.focus; -import android.util.InternalSelectionView; - import android.app.Activity; import android.os.Bundle; -import android.widget.LinearLayout; +import android.util.InternalSelectionView; import android.view.ViewGroup; +import android.widget.LinearLayout; /** * {@link android.view.FocusFinder#findNextFocus(android.view.ViewGroup, android.view.View, int)} diff --git a/core/tests/coretests/src/android/widget/focus/DescendantFocusability.java b/core/tests/coretests/src/android/widget/focus/DescendantFocusability.java index f6b0520fbadb..fe6d3c8393f1 100644 --- a/core/tests/coretests/src/android/widget/focus/DescendantFocusability.java +++ b/core/tests/coretests/src/android/widget/focus/DescendantFocusability.java @@ -16,13 +16,13 @@ package android.widget.focus; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; import android.view.ViewGroup; import android.widget.Button; +import com.android.frameworks.coretests.R; + public class DescendantFocusability extends Activity { public ViewGroup beforeDescendants; diff --git a/core/tests/coretests/src/android/widget/focus/DescendantFocusabilityTest.java b/core/tests/coretests/src/android/widget/focus/DescendantFocusabilityTest.java index 2af42ac193c0..1c570df94f59 100644 --- a/core/tests/coretests/src/android/widget/focus/DescendantFocusabilityTest.java +++ b/core/tests/coretests/src/android/widget/focus/DescendantFocusabilityTest.java @@ -16,15 +16,14 @@ package android.widget.focus; -import android.widget.focus.DescendantFocusability; - import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.UiThreadTest; import android.test.TouchUtils; import android.view.ViewGroup; +import androidx.test.annotation.UiThreadTest; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; + public class DescendantFocusabilityTest extends ActivityInstrumentationTestCase<DescendantFocusability> { private DescendantFocusability a; diff --git a/core/tests/coretests/src/android/widget/focus/FocusAfterRemoval.java b/core/tests/coretests/src/android/widget/focus/FocusAfterRemoval.java index b3d5ec5e5099..0cb80cebffc7 100644 --- a/core/tests/coretests/src/android/widget/focus/FocusAfterRemoval.java +++ b/core/tests/coretests/src/android/widget/focus/FocusAfterRemoval.java @@ -16,13 +16,13 @@ package android.widget.focus; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; -import android.widget.LinearLayout; -import android.widget.Button; import android.view.View; +import android.widget.Button; +import android.widget.LinearLayout; + +import com.android.frameworks.coretests.R; /** * Exercises cases where elements of the UI are removed (and diff --git a/core/tests/coretests/src/android/widget/focus/FocusAfterRemovalTest.java b/core/tests/coretests/src/android/widget/focus/FocusAfterRemovalTest.java index a1b7bcbf6487..6c46d08bc223 100644 --- a/core/tests/coretests/src/android/widget/focus/FocusAfterRemovalTest.java +++ b/core/tests/coretests/src/android/widget/focus/FocusAfterRemovalTest.java @@ -16,15 +16,15 @@ package android.widget.focus; -import android.widget.focus.FocusAfterRemoval; -import com.android.frameworks.coretests.R; - import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; -import android.widget.Button; -import android.widget.LinearLayout; import android.view.KeyEvent; import android.view.View; +import android.widget.Button; +import android.widget.LinearLayout; + +import androidx.test.filters.MediumTest; + +import com.android.frameworks.coretests.R; /** * {@link FocusAfterRemoval} is set up to exercise cases where the views that diff --git a/core/tests/coretests/src/android/widget/focus/FocusChangeWithInterestingRectHintTest.java b/core/tests/coretests/src/android/widget/focus/FocusChangeWithInterestingRectHintTest.java index 8f8f184a0c9c..26dc23398366 100644 --- a/core/tests/coretests/src/android/widget/focus/FocusChangeWithInterestingRectHintTest.java +++ b/core/tests/coretests/src/android/widget/focus/FocusChangeWithInterestingRectHintTest.java @@ -16,14 +16,13 @@ package android.widget.focus; -import android.widget.focus.AdjacentVerticalRectLists; -import android.util.InternalSelectionView; - import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; +import android.util.InternalSelectionView; import android.view.KeyEvent; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; + /** * {@link android.view.FocusFinder#findNextFocus(android.view.ViewGroup, android.view.View, int)} * and diff --git a/core/tests/coretests/src/android/widget/focus/GoneParentFocusedChildTest.java b/core/tests/coretests/src/android/widget/focus/GoneParentFocusedChildTest.java index dcbddefef870..b7974e38555a 100644 --- a/core/tests/coretests/src/android/widget/focus/GoneParentFocusedChildTest.java +++ b/core/tests/coretests/src/android/widget/focus/GoneParentFocusedChildTest.java @@ -17,10 +17,10 @@ package android.widget.focus; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.view.KeyEvent; import android.view.View; -import android.widget.focus.GoneParentFocusedChild; + +import androidx.test.filters.MediumTest; /** * When a parent is GONE, key events shouldn't go to its children, even if they diff --git a/core/tests/coretests/src/android/widget/focus/HorizontalFocusSearch.java b/core/tests/coretests/src/android/widget/focus/HorizontalFocusSearch.java index 11cac1e5b1ea..aab91194cfd7 100644 --- a/core/tests/coretests/src/android/widget/focus/HorizontalFocusSearch.java +++ b/core/tests/coretests/src/android/widget/focus/HorizontalFocusSearch.java @@ -17,12 +17,12 @@ package android.widget.focus; import android.app.Activity; -import android.widget.LinearLayout; -import android.widget.Button; -import android.widget.TextView; +import android.content.Context; import android.os.Bundle; import android.view.ViewGroup; -import android.content.Context; +import android.widget.Button; +import android.widget.LinearLayout; +import android.widget.TextView; public class HorizontalFocusSearch extends Activity { diff --git a/core/tests/coretests/src/android/widget/focus/HorizontalFocusSearchTest.java b/core/tests/coretests/src/android/widget/focus/HorizontalFocusSearchTest.java index 43986eed9b14..855a32192555 100644 --- a/core/tests/coretests/src/android/widget/focus/HorizontalFocusSearchTest.java +++ b/core/tests/coretests/src/android/widget/focus/HorizontalFocusSearchTest.java @@ -16,17 +16,16 @@ package android.widget.focus; -import android.widget.focus.HorizontalFocusSearch; +import static android.widget.focus.VerticalFocusSearchTest.FocusSearchAlg; +import static android.widget.focus.VerticalFocusSearchTest.NewFocusSearchAlg; -import android.support.test.filters.LargeTest; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.Suppress; -import android.widget.LinearLayout; -import android.widget.Button; import android.view.View; +import android.widget.Button; +import android.widget.LinearLayout; -import static android.widget.focus.VerticalFocusSearchTest.FocusSearchAlg; -import static android.widget.focus.VerticalFocusSearchTest.NewFocusSearchAlg; +import androidx.test.filters.LargeTest; +import androidx.test.filters.Suppress; /** * Tests that focus searching works on a horizontal linear layout of buttons of diff --git a/core/tests/coretests/src/android/widget/focus/LinearLayoutGrid.java b/core/tests/coretests/src/android/widget/focus/LinearLayoutGrid.java index acd632f3402b..ec234bc616df 100644 --- a/core/tests/coretests/src/android/widget/focus/LinearLayoutGrid.java +++ b/core/tests/coretests/src/android/widget/focus/LinearLayoutGrid.java @@ -21,6 +21,7 @@ import android.os.Bundle; import android.view.ViewGroup; import android.widget.Button; import android.widget.LinearLayout; + import com.android.frameworks.coretests.R; public class LinearLayoutGrid extends Activity { diff --git a/core/tests/coretests/src/android/widget/focus/LinearLayoutGridTest.java b/core/tests/coretests/src/android/widget/focus/LinearLayoutGridTest.java index 89cb8bb6943e..c81317c003b4 100644 --- a/core/tests/coretests/src/android/widget/focus/LinearLayoutGridTest.java +++ b/core/tests/coretests/src/android/widget/focus/LinearLayoutGridTest.java @@ -17,11 +17,11 @@ package android.widget.focus; import android.test.SingleLaunchActivityTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.view.FocusFinder; import android.view.View; import android.view.ViewGroup; -import android.widget.focus.LinearLayoutGrid; + +import androidx.test.filters.MediumTest; /** * Tests focus searching between buttons within a grid that are touching, for example, diff --git a/core/tests/coretests/src/android/widget/focus/ListOfButtons.java b/core/tests/coretests/src/android/widget/focus/ListOfButtons.java index 308861d3d9df..5663ed2094f7 100644 --- a/core/tests/coretests/src/android/widget/focus/ListOfButtons.java +++ b/core/tests/coretests/src/android/widget/focus/ListOfButtons.java @@ -16,8 +16,6 @@ package android.widget.focus; -import com.android.frameworks.coretests.R; - import android.app.ListActivity; import android.content.Context; import android.os.Bundle; @@ -26,6 +24,8 @@ import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Button; +import com.android.frameworks.coretests.R; + /** * A layout with a ListView containing buttons. */ diff --git a/core/tests/coretests/src/android/widget/focus/ListOfButtonsTest.java b/core/tests/coretests/src/android/widget/focus/ListOfButtonsTest.java index bec6f80ddbce..4cf4a3abeb68 100644 --- a/core/tests/coretests/src/android/widget/focus/ListOfButtonsTest.java +++ b/core/tests/coretests/src/android/widget/focus/ListOfButtonsTest.java @@ -16,17 +16,17 @@ package android.widget.focus; -import android.test.suitebuilder.annotation.Suppress; -import android.widget.focus.ListOfButtons; -import com.android.frameworks.coretests.R; - import android.test.ActivityInstrumentationTestCase2; -import android.test.suitebuilder.annotation.MediumTest; -import android.widget.ListAdapter; -import android.widget.Button; -import android.widget.ListView; import android.view.KeyEvent; import android.view.View; +import android.widget.Button; +import android.widget.ListAdapter; +import android.widget.ListView; + +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; + +import com.android.frameworks.coretests.R; /** * Tests that focus works as expected when navigating into and out of diff --git a/core/tests/coretests/src/android/widget/focus/ListOfEditTexts.java b/core/tests/coretests/src/android/widget/focus/ListOfEditTexts.java index c2e7a26b5909..936c9999e7f8 100644 --- a/core/tests/coretests/src/android/widget/focus/ListOfEditTexts.java +++ b/core/tests/coretests/src/android/widget/focus/ListOfEditTexts.java @@ -21,7 +21,12 @@ import android.content.Context; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; -import android.widget.*; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.ListView; + import com.google.android.collect.Lists; import java.util.List; diff --git a/core/tests/coretests/src/android/widget/focus/ListOfInternalSelectionViews.java b/core/tests/coretests/src/android/widget/focus/ListOfInternalSelectionViews.java index 53b866c92ef8..73e4ea8f718d 100644 --- a/core/tests/coretests/src/android/widget/focus/ListOfInternalSelectionViews.java +++ b/core/tests/coretests/src/android/widget/focus/ListOfInternalSelectionViews.java @@ -19,11 +19,11 @@ package android.widget.focus; import android.app.Activity; import android.graphics.Point; import android.os.Bundle; +import android.util.InternalSelectionView; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListView; -import android.util.InternalSelectionView; /** * A list of {@link InternalSelectionView}s paramatarized by the number of items, diff --git a/core/tests/coretests/src/android/widget/focus/ListWithFooterViewAndNewLabels.java b/core/tests/coretests/src/android/widget/focus/ListWithFooterViewAndNewLabels.java index b9082011f8b4..8accf21c2adc 100644 --- a/core/tests/coretests/src/android/widget/focus/ListWithFooterViewAndNewLabels.java +++ b/core/tests/coretests/src/android/widget/focus/ListWithFooterViewAndNewLabels.java @@ -27,9 +27,10 @@ import android.widget.BaseAdapter; import android.widget.Button; import android.widget.TextView; -import com.google.android.collect.Lists; import com.android.frameworks.coretests.R; +import com.google.android.collect.Lists; + import java.util.List; public class ListWithFooterViewAndNewLabels extends ListActivity { diff --git a/core/tests/coretests/src/android/widget/focus/ListWithFooterViewAndNewLabelsTest.java b/core/tests/coretests/src/android/widget/focus/ListWithFooterViewAndNewLabelsTest.java index 57dbb78cbcfd..d0fcde5fd49c 100644 --- a/core/tests/coretests/src/android/widget/focus/ListWithFooterViewAndNewLabelsTest.java +++ b/core/tests/coretests/src/android/widget/focus/ListWithFooterViewAndNewLabelsTest.java @@ -16,14 +16,13 @@ package android.widget.focus; -import android.widget.focus.ListWithFooterViewAndNewLabels; -import com.android.frameworks.coretests.R; - import android.test.ActivityInstrumentationTestCase; import android.widget.Button; import android.widget.ListAdapter; import android.widget.ListView; +import com.android.frameworks.coretests.R; + public class ListWithFooterViewAndNewLabelsTest extends ActivityInstrumentationTestCase<ListWithFooterViewAndNewLabels> { diff --git a/core/tests/coretests/src/android/widget/focus/ListWithMailMessages.java b/core/tests/coretests/src/android/widget/focus/ListWithMailMessages.java index 5c891f90bc2f..50a8614a1992 100644 --- a/core/tests/coretests/src/android/widget/focus/ListWithMailMessages.java +++ b/core/tests/coretests/src/android/widget/focus/ListWithMailMessages.java @@ -16,19 +16,20 @@ package android.widget.focus; -import com.android.frameworks.coretests.R; -import com.google.android.collect.Lists; - import android.app.ListActivity; -import android.os.Bundle; -import android.widget.ArrayAdapter; -import android.widget.LinearLayout; -import android.widget.TextView; import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.view.LayoutInflater; import android.webkit.WebView; +import android.widget.ArrayAdapter; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.android.frameworks.coretests.R; + +import com.google.android.collect.Lists; import java.util.List; diff --git a/core/tests/coretests/src/android/widget/focus/RequestFocus.java b/core/tests/coretests/src/android/widget/focus/RequestFocus.java index 4daf0b4206b0..5042efd371e5 100644 --- a/core/tests/coretests/src/android/widget/focus/RequestFocus.java +++ b/core/tests/coretests/src/android/widget/focus/RequestFocus.java @@ -16,13 +16,13 @@ package android.widget.focus; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.widget.Button; +import com.android.frameworks.coretests.R; + /** * Exercises cases where elements of the UI are requestFocus()ed. */ diff --git a/core/tests/coretests/src/android/widget/focus/RequestFocusTest.java b/core/tests/coretests/src/android/widget/focus/RequestFocusTest.java index cdfa21755344..bc770c502a2b 100644 --- a/core/tests/coretests/src/android/widget/focus/RequestFocusTest.java +++ b/core/tests/coretests/src/android/widget/focus/RequestFocusTest.java @@ -21,16 +21,18 @@ import static org.mockito.Mockito.mock; import android.os.Handler; import android.test.ActivityInstrumentationTestCase2; -import android.test.UiThreadTest; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; import android.util.AndroidRuntimeException; import android.view.View; import android.view.View.OnFocusChangeListener; import android.view.ViewTreeObserver.OnGlobalFocusChangeListener; import android.widget.Button; +import androidx.test.annotation.UiThreadTest; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; + import com.android.frameworks.coretests.R; + import org.mockito.InOrder; /** diff --git a/core/tests/coretests/src/android/widget/focus/ScrollingThroughListOfFocusablesTest.java b/core/tests/coretests/src/android/widget/focus/ScrollingThroughListOfFocusablesTest.java index 06cb75db28c2..e6e76ccc2caf 100644 --- a/core/tests/coretests/src/android/widget/focus/ScrollingThroughListOfFocusablesTest.java +++ b/core/tests/coretests/src/android/widget/focus/ScrollingThroughListOfFocusablesTest.java @@ -18,12 +18,12 @@ package android.widget.focus; import android.graphics.Rect; import android.test.InstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; import android.util.InternalSelectionView; import android.view.KeyEvent; import android.widget.ListView; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; /** * TODO: extract base test case that launches {@link ListOfInternalSelectionViews} with diff --git a/core/tests/coretests/src/android/widget/focus/VerticalFocusSearch.java b/core/tests/coretests/src/android/widget/focus/VerticalFocusSearch.java index 4a809e0cc881..2ca9f6da6404 100644 --- a/core/tests/coretests/src/android/widget/focus/VerticalFocusSearch.java +++ b/core/tests/coretests/src/android/widget/focus/VerticalFocusSearch.java @@ -17,13 +17,13 @@ package android.widget.focus; import android.app.Activity; +import android.content.Context; import android.os.Bundle; -import android.widget.LinearLayout; -import android.widget.Button; -import android.widget.TextView; import android.view.Gravity; import android.view.ViewGroup; -import android.content.Context; +import android.widget.Button; +import android.widget.LinearLayout; +import android.widget.TextView; /** * Holds a few buttons of various sizes and horizontal placements in a diff --git a/core/tests/coretests/src/android/widget/focus/VerticalFocusSearchTest.java b/core/tests/coretests/src/android/widget/focus/VerticalFocusSearchTest.java index f01422ebfc52..319756cc5876 100644 --- a/core/tests/coretests/src/android/widget/focus/VerticalFocusSearchTest.java +++ b/core/tests/coretests/src/android/widget/focus/VerticalFocusSearchTest.java @@ -16,17 +16,16 @@ package android.widget.focus; -import android.widget.focus.VerticalFocusSearch; - -import android.support.test.filters.LargeTest; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.Suppress; import android.view.FocusFinder; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.LinearLayout; +import androidx.test.filters.LargeTest; +import androidx.test.filters.Suppress; + /** * Tests that focus searching works on a vertical linear layout of buttons of * various widths and horizontal placements. diff --git a/core/tests/coretests/src/android/widget/gridview/GridDelete.java b/core/tests/coretests/src/android/widget/gridview/GridDelete.java index 57ae8f39fa09..b040f69545f1 100644 --- a/core/tests/coretests/src/android/widget/gridview/GridDelete.java +++ b/core/tests/coretests/src/android/widget/gridview/GridDelete.java @@ -16,6 +16,7 @@ package android.widget.gridview; +import android.util.GridScenario; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; @@ -23,8 +24,6 @@ import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.ListAdapter; -import android.util.GridScenario; - import java.util.ArrayList; /** diff --git a/core/tests/coretests/src/android/widget/gridview/GridInHorizontalTest.java b/core/tests/coretests/src/android/widget/gridview/GridInHorizontalTest.java index 21ca655390a7..5247009e693b 100644 --- a/core/tests/coretests/src/android/widget/gridview/GridInHorizontalTest.java +++ b/core/tests/coretests/src/android/widget/gridview/GridInHorizontalTest.java @@ -17,10 +17,9 @@ package android.widget.gridview; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.widget.GridView; -import android.widget.gridview.GridInHorizontal; +import androidx.test.filters.MediumTest; public class GridInHorizontalTest extends ActivityInstrumentationTestCase<GridInHorizontal> { diff --git a/core/tests/coretests/src/android/widget/gridview/GridInVerticalTest.java b/core/tests/coretests/src/android/widget/gridview/GridInVerticalTest.java index a674db25f708..290f70ee639b 100644 --- a/core/tests/coretests/src/android/widget/gridview/GridInVerticalTest.java +++ b/core/tests/coretests/src/android/widget/gridview/GridInVerticalTest.java @@ -17,10 +17,9 @@ package android.widget.gridview; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.widget.GridView; -import android.widget.gridview.GridInVertical; +import androidx.test.filters.MediumTest; public class GridInVerticalTest extends ActivityInstrumentationTestCase<GridInVertical> { diff --git a/core/tests/coretests/src/android/widget/gridview/GridPaddingTest.java b/core/tests/coretests/src/android/widget/gridview/GridPaddingTest.java index ecd4b1cbbad3..d2ae7cfc6b25 100644 --- a/core/tests/coretests/src/android/widget/gridview/GridPaddingTest.java +++ b/core/tests/coretests/src/android/widget/gridview/GridPaddingTest.java @@ -17,9 +17,10 @@ package android.widget.gridview; import android.test.ActivityInstrumentationTestCase2; -import android.test.suitebuilder.annotation.MediumTest; import android.widget.GridView; +import androidx.test.filters.MediumTest; + public class GridPaddingTest extends ActivityInstrumentationTestCase2<GridPadding> { private GridView mGridView; diff --git a/core/tests/coretests/src/android/widget/gridview/GridScrollListenerTest.java b/core/tests/coretests/src/android/widget/gridview/GridScrollListenerTest.java index 53eeb48212ce..466c55f8117c 100644 --- a/core/tests/coretests/src/android/widget/gridview/GridScrollListenerTest.java +++ b/core/tests/coretests/src/android/widget/gridview/GridScrollListenerTest.java @@ -19,12 +19,13 @@ package android.widget.gridview; import android.app.Instrumentation; import android.test.ActivityInstrumentationTestCase; import android.test.TouchUtils; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; import android.view.KeyEvent; import android.widget.AbsListView; import android.widget.GridView; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; + public class GridScrollListenerTest extends ActivityInstrumentationTestCase<GridScrollListener> implements AbsListView.OnScrollListener { private GridScrollListener mActivity; diff --git a/core/tests/coretests/src/android/widget/gridview/GridSetSelectionBaseTest.java b/core/tests/coretests/src/android/widget/gridview/GridSetSelectionBaseTest.java index 0e362b69b057..db4f2dc224fc 100644 --- a/core/tests/coretests/src/android/widget/gridview/GridSetSelectionBaseTest.java +++ b/core/tests/coretests/src/android/widget/gridview/GridSetSelectionBaseTest.java @@ -16,13 +16,13 @@ package android.widget.gridview; -import android.util.GridScenario; - import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.test.ViewAsserts; +import android.util.GridScenario; import android.widget.GridView; +import androidx.test.filters.MediumTest; + public class GridSetSelectionBaseTest<T extends GridScenario> extends ActivityInstrumentationTestCase<T> { private T mActivity; private GridView mGridView; diff --git a/core/tests/coretests/src/android/widget/gridview/GridSetSelectionManyTest.java b/core/tests/coretests/src/android/widget/gridview/GridSetSelectionManyTest.java index 67396451898c..17a60449e766 100644 --- a/core/tests/coretests/src/android/widget/gridview/GridSetSelectionManyTest.java +++ b/core/tests/coretests/src/android/widget/gridview/GridSetSelectionManyTest.java @@ -16,8 +16,6 @@ package android.widget.gridview; -import android.widget.gridview.GridSetSelectionMany; - public class GridSetSelectionManyTest extends GridSetSelectionBaseTest<GridSetSelectionMany> { public GridSetSelectionManyTest() { super(GridSetSelectionMany.class); diff --git a/core/tests/coretests/src/android/widget/gridview/GridSetSelectionStackFromBottomManyTest.java b/core/tests/coretests/src/android/widget/gridview/GridSetSelectionStackFromBottomManyTest.java index 46922b97f6fd..a71f732c207f 100644 --- a/core/tests/coretests/src/android/widget/gridview/GridSetSelectionStackFromBottomManyTest.java +++ b/core/tests/coretests/src/android/widget/gridview/GridSetSelectionStackFromBottomManyTest.java @@ -16,8 +16,6 @@ package android.widget.gridview; -import android.widget.gridview.GridSetSelectionStackFromBottomMany; - public class GridSetSelectionStackFromBottomManyTest extends GridSetSelectionBaseTest<GridSetSelectionStackFromBottomMany> { public GridSetSelectionStackFromBottomManyTest() { super(GridSetSelectionStackFromBottomMany.class); diff --git a/core/tests/coretests/src/android/widget/gridview/GridSetSelectionStackFromBottomTest.java b/core/tests/coretests/src/android/widget/gridview/GridSetSelectionStackFromBottomTest.java index 67dd6f10a86e..4e6e8aa58912 100644 --- a/core/tests/coretests/src/android/widget/gridview/GridSetSelectionStackFromBottomTest.java +++ b/core/tests/coretests/src/android/widget/gridview/GridSetSelectionStackFromBottomTest.java @@ -16,8 +16,6 @@ package android.widget.gridview; -import android.widget.gridview.GridSetSelectionStackFromBottom; - public class GridSetSelectionStackFromBottomTest extends GridSetSelectionBaseTest<GridSetSelectionStackFromBottom> { public GridSetSelectionStackFromBottomTest() { super(GridSetSelectionStackFromBottom.class); diff --git a/core/tests/coretests/src/android/widget/gridview/GridSetSelectionTest.java b/core/tests/coretests/src/android/widget/gridview/GridSetSelectionTest.java index 2127b3cd4f1a..68802fe22f95 100644 --- a/core/tests/coretests/src/android/widget/gridview/GridSetSelectionTest.java +++ b/core/tests/coretests/src/android/widget/gridview/GridSetSelectionTest.java @@ -16,8 +16,6 @@ package android.widget.gridview; -import android.widget.gridview.GridSetSelection; - public class GridSetSelectionTest extends GridSetSelectionBaseTest<GridSetSelection> { public GridSetSelectionTest() { super(GridSetSelection.class); diff --git a/core/tests/coretests/src/android/widget/gridview/GridSimple.java b/core/tests/coretests/src/android/widget/gridview/GridSimple.java index 7c2c696f2b56..67bb7511122a 100644 --- a/core/tests/coretests/src/android/widget/gridview/GridSimple.java +++ b/core/tests/coretests/src/android/widget/gridview/GridSimple.java @@ -18,12 +18,11 @@ package android.widget.gridview; import android.graphics.drawable.PaintDrawable; import android.os.Bundle; +import android.util.GridScenario; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; -import android.util.GridScenario; - public class GridSimple extends GridScenario { @Override protected void init(Params params) { diff --git a/core/tests/coretests/src/android/widget/gridview/GridSingleColumnTest.java b/core/tests/coretests/src/android/widget/gridview/GridSingleColumnTest.java index 3b2504ebe3be..0f67522894cc 100644 --- a/core/tests/coretests/src/android/widget/gridview/GridSingleColumnTest.java +++ b/core/tests/coretests/src/android/widget/gridview/GridSingleColumnTest.java @@ -17,10 +17,9 @@ package android.widget.gridview; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.widget.GridView; -import android.widget.gridview.GridSingleColumn; +import androidx.test.filters.MediumTest; public class GridSingleColumnTest extends ActivityInstrumentationTestCase<GridSingleColumn> { private GridSingleColumn mActivity; diff --git a/core/tests/coretests/src/android/widget/gridview/GridStackFromBottomManyTest.java b/core/tests/coretests/src/android/widget/gridview/GridStackFromBottomManyTest.java index 640737ec1c85..a3696164526e 100644 --- a/core/tests/coretests/src/android/widget/gridview/GridStackFromBottomManyTest.java +++ b/core/tests/coretests/src/android/widget/gridview/GridStackFromBottomManyTest.java @@ -16,11 +16,10 @@ package android.widget.gridview; -import android.widget.gridview.GridStackFromBottomMany; - -import android.test.suitebuilder.annotation.MediumTest; -import android.widget.GridView; import android.test.ActivityInstrumentationTestCase; +import android.widget.GridView; + +import androidx.test.filters.MediumTest; public class GridStackFromBottomManyTest extends ActivityInstrumentationTestCase<GridStackFromBottomMany> { private GridStackFromBottomMany mActivity; diff --git a/core/tests/coretests/src/android/widget/gridview/GridStackFromBottomTest.java b/core/tests/coretests/src/android/widget/gridview/GridStackFromBottomTest.java index 8fec241dd304..da1b6384d212 100644 --- a/core/tests/coretests/src/android/widget/gridview/GridStackFromBottomTest.java +++ b/core/tests/coretests/src/android/widget/gridview/GridStackFromBottomTest.java @@ -16,12 +16,11 @@ package android.widget.gridview; -import android.widget.gridview.GridStackFromBottom; - import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.widget.GridView; +import androidx.test.filters.MediumTest; + public class GridStackFromBottomTest extends ActivityInstrumentationTestCase<GridStackFromBottom> { private GridStackFromBottom mActivity; private GridView mGridView; diff --git a/core/tests/coretests/src/android/widget/gridview/GridThrasher.java b/core/tests/coretests/src/android/widget/gridview/GridThrasher.java index ad89bb6ab90c..34c19c37b702 100644 --- a/core/tests/coretests/src/android/widget/gridview/GridThrasher.java +++ b/core/tests/coretests/src/android/widget/gridview/GridThrasher.java @@ -16,20 +16,20 @@ package android.widget.gridview; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.os.Handler; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.view.LayoutInflater; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.TextView; +import com.android.frameworks.coretests.R; + import java.util.Random; /** diff --git a/core/tests/coretests/src/android/widget/gridview/touch/GridTouchSetSelectionTest.java b/core/tests/coretests/src/android/widget/gridview/touch/GridTouchSetSelectionTest.java index ca789aff672e..ab5fcfaf29ad 100644 --- a/core/tests/coretests/src/android/widget/gridview/touch/GridTouchSetSelectionTest.java +++ b/core/tests/coretests/src/android/widget/gridview/touch/GridTouchSetSelectionTest.java @@ -17,14 +17,14 @@ package android.widget.gridview.touch; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; import android.test.TouchUtils; import android.view.View; import android.widget.GridView; - import android.widget.gridview.GridSimple; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; + /** * Tests setting the selection in touch mode */ diff --git a/core/tests/coretests/src/android/widget/gridview/touch/GridTouchStackFromBottomManyTest.java b/core/tests/coretests/src/android/widget/gridview/touch/GridTouchStackFromBottomManyTest.java index 9a8d3074890b..e312873d4ae1 100644 --- a/core/tests/coretests/src/android/widget/gridview/touch/GridTouchStackFromBottomManyTest.java +++ b/core/tests/coretests/src/android/widget/gridview/touch/GridTouchStackFromBottomManyTest.java @@ -16,14 +16,14 @@ package android.widget.gridview.touch; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; +import android.test.ActivityInstrumentationTestCase; import android.test.TouchUtils; +import android.view.View; +import android.widget.GridView; import android.widget.gridview.GridStackFromBottomMany; -import android.widget.GridView; -import android.view.View; -import android.test.ActivityInstrumentationTestCase; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; public class GridTouchStackFromBottomManyTest extends ActivityInstrumentationTestCase<GridStackFromBottomMany> { private GridStackFromBottomMany mActivity; diff --git a/core/tests/coretests/src/android/widget/gridview/touch/GridTouchStackFromBottomTest.java b/core/tests/coretests/src/android/widget/gridview/touch/GridTouchStackFromBottomTest.java index d8d4e435d2c7..c98c10a603f4 100644 --- a/core/tests/coretests/src/android/widget/gridview/touch/GridTouchStackFromBottomTest.java +++ b/core/tests/coretests/src/android/widget/gridview/touch/GridTouchStackFromBottomTest.java @@ -16,13 +16,13 @@ package android.widget.gridview.touch; -import android.widget.gridview.GridStackFromBottom; -import android.test.TouchUtils; -import android.test.suitebuilder.annotation.MediumTest; - import android.test.ActivityInstrumentationTestCase; -import android.widget.GridView; +import android.test.TouchUtils; import android.view.View; +import android.widget.GridView; +import android.widget.gridview.GridStackFromBottom; + +import androidx.test.filters.MediumTest; public class GridTouchStackFromBottomTest extends ActivityInstrumentationTestCase<GridStackFromBottom> { private GridStackFromBottom mActivity; diff --git a/core/tests/coretests/src/android/widget/gridview/touch/GridTouchVerticalSpacingStackFromBottomTest.java b/core/tests/coretests/src/android/widget/gridview/touch/GridTouchVerticalSpacingStackFromBottomTest.java index 55a66d9c2af2..0d3092cbc2f3 100644 --- a/core/tests/coretests/src/android/widget/gridview/touch/GridTouchVerticalSpacingStackFromBottomTest.java +++ b/core/tests/coretests/src/android/widget/gridview/touch/GridTouchVerticalSpacingStackFromBottomTest.java @@ -18,16 +18,16 @@ package android.widget.gridview.touch; import android.content.Context; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; import android.test.TouchUtils; import android.view.Gravity; import android.view.View; import android.view.ViewConfiguration; import android.widget.GridView; - import android.widget.gridview.GridVerticalSpacingStackFromBottom; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; + public class GridTouchVerticalSpacingStackFromBottomTest extends ActivityInstrumentationTestCase<GridVerticalSpacingStackFromBottom> { private GridVerticalSpacingStackFromBottom mActivity; private GridView mGridView; diff --git a/core/tests/coretests/src/android/widget/gridview/touch/GridTouchVerticalSpacingTest.java b/core/tests/coretests/src/android/widget/gridview/touch/GridTouchVerticalSpacingTest.java index bae4ee7293e6..e831e62be179 100644 --- a/core/tests/coretests/src/android/widget/gridview/touch/GridTouchVerticalSpacingTest.java +++ b/core/tests/coretests/src/android/widget/gridview/touch/GridTouchVerticalSpacingTest.java @@ -17,16 +17,16 @@ package android.widget.gridview.touch; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; import android.test.TouchUtils; import android.view.Gravity; import android.view.View; import android.view.ViewConfiguration; import android.widget.GridView; - import android.widget.gridview.GridVerticalSpacing; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; + public class GridTouchVerticalSpacingTest extends ActivityInstrumentationTestCase<GridVerticalSpacing> { private GridVerticalSpacing mActivity; private GridView mGridView; diff --git a/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutGravity.java b/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutGravity.java index 9791e36f038d..d159be865372 100644 --- a/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutGravity.java +++ b/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutGravity.java @@ -16,11 +16,10 @@ package android.widget.layout.frame; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; -import android.view.View; + +import com.android.frameworks.coretests.R; public class FrameLayoutGravity extends Activity { @Override diff --git a/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutGravityTest.java b/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutGravityTest.java index fe4e93286bc5..0cab660f68d6 100644 --- a/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutGravityTest.java +++ b/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutGravityTest.java @@ -16,12 +16,13 @@ package android.widget.layout.frame; +import android.app.Activity; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.test.ViewAsserts; -import android.app.Activity; import android.view.View; -import android.widget.layout.frame.FrameLayoutGravity; + +import androidx.test.filters.MediumTest; + import com.android.frameworks.coretests.R; public class FrameLayoutGravityTest extends ActivityInstrumentationTestCase<FrameLayoutGravity> { diff --git a/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutMargin.java b/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutMargin.java index 81b3ea13fc6b..8c54557819d0 100644 --- a/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutMargin.java +++ b/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutMargin.java @@ -16,11 +16,10 @@ package android.widget.layout.frame; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; -import android.view.View; + +import com.android.frameworks.coretests.R; public class FrameLayoutMargin extends Activity { @Override diff --git a/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutMarginTest.java b/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutMarginTest.java index c052d659c0f2..4973078f9752 100644 --- a/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutMarginTest.java +++ b/core/tests/coretests/src/android/widget/layout/frame/FrameLayoutMarginTest.java @@ -16,13 +16,14 @@ package android.widget.layout.frame; +import android.app.Activity; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.test.ViewAsserts; -import android.app.Activity; import android.view.View; import android.view.ViewGroup; -import android.widget.layout.frame.FrameLayoutMargin; + +import androidx.test.filters.MediumTest; + import com.android.frameworks.coretests.R; public class FrameLayoutMarginTest extends ActivityInstrumentationTestCase<FrameLayoutMargin> { diff --git a/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentCenterGravity.java b/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentCenterGravity.java index 766dd0a76366..79a34e5d1f5e 100644 --- a/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentCenterGravity.java +++ b/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentCenterGravity.java @@ -16,11 +16,10 @@ package android.widget.layout.linear; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; -import android.view.View; + +import com.android.frameworks.coretests.R; public class BaselineAlignmentCenterGravity extends Activity { @Override diff --git a/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentCenterGravityTest.java b/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentCenterGravityTest.java index 079e9d079ee5..60b7c2f5e8df 100644 --- a/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentCenterGravityTest.java +++ b/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentCenterGravityTest.java @@ -18,13 +18,13 @@ package android.widget.layout.linear; import android.app.Activity; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.test.ViewAsserts; import android.view.View; import android.widget.Button; +import androidx.test.filters.MediumTest; + import com.android.frameworks.coretests.R; -import android.widget.layout.linear.BaselineAlignmentCenterGravity; public class BaselineAlignmentCenterGravityTest extends ActivityInstrumentationTestCase<BaselineAlignmentCenterGravity> { private Button mButton1; diff --git a/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentSpinnerButton.java b/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentSpinnerButton.java index c3bfe3a30ee8..a429b758d748 100644 --- a/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentSpinnerButton.java +++ b/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentSpinnerButton.java @@ -18,12 +18,12 @@ package android.widget.layout.linear; import android.app.Activity; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.test.ViewAsserts; import android.view.View; +import androidx.test.filters.MediumTest; + import com.android.frameworks.coretests.R; -import android.widget.layout.linear.HorizontalOrientationVerticalAlignment; public class BaselineAlignmentSpinnerButton extends ActivityInstrumentationTestCase<HorizontalOrientationVerticalAlignment> { private View mSpinner; diff --git a/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentZeroWidthAndWeight.java b/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentZeroWidthAndWeight.java index 5ed5e71d65a7..f33feb0c91a8 100644 --- a/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentZeroWidthAndWeight.java +++ b/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentZeroWidthAndWeight.java @@ -16,12 +16,12 @@ package android.widget.layout.linear; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; import android.view.View; +import com.android.frameworks.coretests.R; + public class BaselineAlignmentZeroWidthAndWeight extends Activity { @Override protected void onCreate(Bundle icicle) { diff --git a/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentZeroWidthAndWeightTest.java b/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentZeroWidthAndWeightTest.java index 2dd2bb8aa382..443b0f7d6ef0 100644 --- a/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentZeroWidthAndWeightTest.java +++ b/core/tests/coretests/src/android/widget/layout/linear/BaselineAlignmentZeroWidthAndWeightTest.java @@ -16,16 +16,15 @@ package android.widget.layout.linear; -import com.android.frameworks.coretests.R; -import android.widget.layout.linear.BaselineAlignmentZeroWidthAndWeight; -import android.widget.layout.linear.ExceptionTextView; - import android.app.Activity; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.view.KeyEvent; import android.widget.Button; +import androidx.test.filters.MediumTest; + +import com.android.frameworks.coretests.R; + public class BaselineAlignmentZeroWidthAndWeightTest extends ActivityInstrumentationTestCase<BaselineAlignmentZeroWidthAndWeight> { private Button mShowButton; diff --git a/core/tests/coretests/src/android/widget/layout/linear/BaselineButtons.java b/core/tests/coretests/src/android/widget/layout/linear/BaselineButtons.java index c9ad83174e63..9d9131675004 100644 --- a/core/tests/coretests/src/android/widget/layout/linear/BaselineButtons.java +++ b/core/tests/coretests/src/android/widget/layout/linear/BaselineButtons.java @@ -16,11 +16,10 @@ package android.widget.layout.linear; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; -import android.view.View; + +import com.android.frameworks.coretests.R; public class BaselineButtons extends Activity { @Override diff --git a/core/tests/coretests/src/android/widget/layout/linear/BaselineButtonsTest.java b/core/tests/coretests/src/android/widget/layout/linear/BaselineButtonsTest.java index 6f1fc90c001b..ac3c5d8de53c 100644 --- a/core/tests/coretests/src/android/widget/layout/linear/BaselineButtonsTest.java +++ b/core/tests/coretests/src/android/widget/layout/linear/BaselineButtonsTest.java @@ -18,12 +18,12 @@ package android.widget.layout.linear; import android.app.Activity; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.view.View; import android.widget.ImageButton; +import androidx.test.filters.MediumTest; + import com.android.frameworks.coretests.R; -import android.widget.layout.linear.BaselineButtons; public class BaselineButtonsTest extends ActivityInstrumentationTestCase<BaselineButtons> { private View mCurrentTime; diff --git a/core/tests/coretests/src/android/widget/layout/linear/ExceptionTextView.java b/core/tests/coretests/src/android/widget/layout/linear/ExceptionTextView.java index 6129b5b4c7e9..c68450188456 100644 --- a/core/tests/coretests/src/android/widget/layout/linear/ExceptionTextView.java +++ b/core/tests/coretests/src/android/widget/layout/linear/ExceptionTextView.java @@ -21,7 +21,6 @@ import android.text.BoringLayout; import android.util.AttributeSet; import android.widget.EditText; - /** * A special EditText that sets {@link #isFailed()} to true as its internal makeNewLayout() method is called * with a width lower than 0. This is used to fail the unit test in diff --git a/core/tests/coretests/src/android/widget/layout/linear/FillInWrap.java b/core/tests/coretests/src/android/widget/layout/linear/FillInWrap.java index 50aa5b721eca..c8a5f3451d17 100644 --- a/core/tests/coretests/src/android/widget/layout/linear/FillInWrap.java +++ b/core/tests/coretests/src/android/widget/layout/linear/FillInWrap.java @@ -16,12 +16,12 @@ package android.widget.layout.linear; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; import android.widget.TextView; +import com.android.frameworks.coretests.R; + public class FillInWrap extends Activity { @Override protected void onCreate(Bundle icicle) { diff --git a/core/tests/coretests/src/android/widget/layout/linear/FillInWrapTest.java b/core/tests/coretests/src/android/widget/layout/linear/FillInWrapTest.java index f16180248a5e..0e69efc1349e 100644 --- a/core/tests/coretests/src/android/widget/layout/linear/FillInWrapTest.java +++ b/core/tests/coretests/src/android/widget/layout/linear/FillInWrapTest.java @@ -18,9 +18,10 @@ package android.widget.layout.linear; import android.app.Activity; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.view.View; +import androidx.test.filters.MediumTest; + import com.android.frameworks.coretests.R; public class FillInWrapTest extends ActivityInstrumentationTestCase<FillInWrap> { diff --git a/core/tests/coretests/src/android/widget/layout/linear/HorizontalOrientationVerticalAlignment.java b/core/tests/coretests/src/android/widget/layout/linear/HorizontalOrientationVerticalAlignment.java index 9f937a97b5a6..255f7b37dba6 100644 --- a/core/tests/coretests/src/android/widget/layout/linear/HorizontalOrientationVerticalAlignment.java +++ b/core/tests/coretests/src/android/widget/layout/linear/HorizontalOrientationVerticalAlignment.java @@ -16,11 +16,10 @@ package android.widget.layout.linear; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; -import android.view.View; + +import com.android.frameworks.coretests.R; public class HorizontalOrientationVerticalAlignment extends Activity { @Override diff --git a/core/tests/coretests/src/android/widget/layout/linear/LLEditTextThenButton.java b/core/tests/coretests/src/android/widget/layout/linear/LLEditTextThenButton.java index 83331caa6069..a0745dd1aa45 100644 --- a/core/tests/coretests/src/android/widget/layout/linear/LLEditTextThenButton.java +++ b/core/tests/coretests/src/android/widget/layout/linear/LLEditTextThenButton.java @@ -16,14 +16,14 @@ package android.widget.layout.linear; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; +import com.android.frameworks.coretests.R; + public class LLEditTextThenButton extends Activity { private EditText mEditText; private Button mButton; diff --git a/core/tests/coretests/src/android/widget/layout/linear/LLOfButtons1.java b/core/tests/coretests/src/android/widget/layout/linear/LLOfButtons1.java index ab2f060eafc2..115306225e75 100644 --- a/core/tests/coretests/src/android/widget/layout/linear/LLOfButtons1.java +++ b/core/tests/coretests/src/android/widget/layout/linear/LLOfButtons1.java @@ -18,10 +18,10 @@ package android.widget.layout.linear; import android.app.Activity; import android.os.Bundle; -import android.os.RemoteException; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; + import com.android.frameworks.coretests.R; /** diff --git a/core/tests/coretests/src/android/widget/layout/linear/LLOfButtons2.java b/core/tests/coretests/src/android/widget/layout/linear/LLOfButtons2.java index 77f564db0ef6..0aca699e3c83 100644 --- a/core/tests/coretests/src/android/widget/layout/linear/LLOfButtons2.java +++ b/core/tests/coretests/src/android/widget/layout/linear/LLOfButtons2.java @@ -22,5 +22,4 @@ package android.widget.layout.linear; */ public class LLOfButtons2 extends LLOfButtons1 { - } diff --git a/core/tests/coretests/src/android/widget/layout/linear/LinearLayoutEditTexts.java b/core/tests/coretests/src/android/widget/layout/linear/LinearLayoutEditTexts.java index 90db788e45eb..5d372450f5ac 100644 --- a/core/tests/coretests/src/android/widget/layout/linear/LinearLayoutEditTexts.java +++ b/core/tests/coretests/src/android/widget/layout/linear/LinearLayoutEditTexts.java @@ -16,11 +16,11 @@ package android.widget.layout.linear; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; +import com.android.frameworks.coretests.R; + public class LinearLayoutEditTexts extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { diff --git a/core/tests/coretests/src/android/widget/layout/linear/LinearLayoutEditTextsTest.java b/core/tests/coretests/src/android/widget/layout/linear/LinearLayoutEditTextsTest.java index d5998b7c954d..966ed6dab8b9 100644 --- a/core/tests/coretests/src/android/widget/layout/linear/LinearLayoutEditTextsTest.java +++ b/core/tests/coretests/src/android/widget/layout/linear/LinearLayoutEditTextsTest.java @@ -16,13 +16,13 @@ package android.widget.layout.linear; -import android.widget.layout.linear.LinearLayoutEditTexts; -import com.android.frameworks.coretests.R; - +import android.app.Activity; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.view.View; -import android.app.Activity; + +import androidx.test.filters.MediumTest; + +import com.android.frameworks.coretests.R; public class LinearLayoutEditTextsTest extends ActivityInstrumentationTestCase<LinearLayoutEditTexts> { private View mChild; diff --git a/core/tests/coretests/src/android/widget/layout/linear/Weight.java b/core/tests/coretests/src/android/widget/layout/linear/Weight.java index 20edd7c7e31d..3722a14f86fe 100644 --- a/core/tests/coretests/src/android/widget/layout/linear/Weight.java +++ b/core/tests/coretests/src/android/widget/layout/linear/Weight.java @@ -16,11 +16,11 @@ package android.widget.layout.linear; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; +import com.android.frameworks.coretests.R; + public class Weight extends Activity { @Override protected void onCreate(Bundle icicle) { diff --git a/core/tests/coretests/src/android/widget/layout/linear/WeightSum.java b/core/tests/coretests/src/android/widget/layout/linear/WeightSum.java index 2e421daeaf1c..144600beddf6 100644 --- a/core/tests/coretests/src/android/widget/layout/linear/WeightSum.java +++ b/core/tests/coretests/src/android/widget/layout/linear/WeightSum.java @@ -16,11 +16,10 @@ package android.widget.layout.linear; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; -import android.view.View; + +import com.android.frameworks.coretests.R; public class WeightSum extends Activity { @Override diff --git a/core/tests/coretests/src/android/widget/layout/linear/WeightSumTest.java b/core/tests/coretests/src/android/widget/layout/linear/WeightSumTest.java index f9a94cedd4a2..1d07db236436 100644 --- a/core/tests/coretests/src/android/widget/layout/linear/WeightSumTest.java +++ b/core/tests/coretests/src/android/widget/layout/linear/WeightSumTest.java @@ -18,11 +18,11 @@ package android.widget.layout.linear; import android.app.Activity; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.view.View; +import androidx.test.filters.MediumTest; + import com.android.frameworks.coretests.R; -import android.widget.layout.linear.WeightSum; public class WeightSumTest extends ActivityInstrumentationTestCase<WeightSum> { private View mChild; diff --git a/core/tests/coretests/src/android/widget/layout/linear/WeightTest.java b/core/tests/coretests/src/android/widget/layout/linear/WeightTest.java index 1c42e7ccb9be..db524958db47 100644 --- a/core/tests/coretests/src/android/widget/layout/linear/WeightTest.java +++ b/core/tests/coretests/src/android/widget/layout/linear/WeightTest.java @@ -18,13 +18,13 @@ package android.widget.layout.linear; import android.app.Activity; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.test.ViewAsserts; -import android.test.suitebuilder.annotation.Suppress; import android.view.View; +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; + import com.android.frameworks.coretests.R; -import android.widget.layout.linear.Weight; @Suppress // Failing. public class WeightTest extends ActivityInstrumentationTestCase<Weight> { diff --git a/core/tests/coretests/src/android/widget/layout/table/AddColumn.java b/core/tests/coretests/src/android/widget/layout/table/AddColumn.java index 400c32c0fed5..b407941b411c 100644 --- a/core/tests/coretests/src/android/widget/layout/table/AddColumn.java +++ b/core/tests/coretests/src/android/widget/layout/table/AddColumn.java @@ -16,8 +16,6 @@ package android.widget.layout.table; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; import android.view.View; @@ -26,6 +24,8 @@ import android.widget.TableLayout; import android.widget.TableRow; import android.widget.TextView; +import com.android.frameworks.coretests.R; + /** * This test adds an extra row with an extra column in the table. */ diff --git a/core/tests/coretests/src/android/widget/layout/table/AddColumnTest.java b/core/tests/coretests/src/android/widget/layout/table/AddColumnTest.java index bfb4d172f6c3..08ae0301da13 100644 --- a/core/tests/coretests/src/android/widget/layout/table/AddColumnTest.java +++ b/core/tests/coretests/src/android/widget/layout/table/AddColumnTest.java @@ -16,16 +16,16 @@ package android.widget.layout.table; -import android.widget.layout.table.AddColumn; -import com.android.frameworks.coretests.R; - import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.view.KeyEvent; import android.widget.Button; import android.widget.TableLayout; import android.widget.TableRow; +import androidx.test.filters.MediumTest; + +import com.android.frameworks.coretests.R; + /** * {@link android.widget.layout.table.AddColumn} is * setup to exercise the case of adding row programmatically in a table. diff --git a/core/tests/coretests/src/android/widget/layout/table/CellSpan.java b/core/tests/coretests/src/android/widget/layout/table/CellSpan.java index d91cf56eba2e..3102ac1f109d 100644 --- a/core/tests/coretests/src/android/widget/layout/table/CellSpan.java +++ b/core/tests/coretests/src/android/widget/layout/table/CellSpan.java @@ -16,11 +16,11 @@ package android.widget.layout.table; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; +import com.android.frameworks.coretests.R; + /** * Exercise table layout with cells spanning. */ diff --git a/core/tests/coretests/src/android/widget/layout/table/CellSpanTest.java b/core/tests/coretests/src/android/widget/layout/table/CellSpanTest.java index 331ec4575395..aa8e66cb0c67 100644 --- a/core/tests/coretests/src/android/widget/layout/table/CellSpanTest.java +++ b/core/tests/coretests/src/android/widget/layout/table/CellSpanTest.java @@ -16,13 +16,13 @@ package android.widget.layout.table; -import android.widget.layout.table.CellSpan; -import com.android.frameworks.coretests.R; - import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.view.View; +import androidx.test.filters.MediumTest; + +import com.android.frameworks.coretests.R; + /** * {@link android.widget.layout.table.CellSpan} is * setup to exercise tables in which cells use spanning. diff --git a/core/tests/coretests/src/android/widget/layout/table/FixedWidth.java b/core/tests/coretests/src/android/widget/layout/table/FixedWidth.java index 435815a40d06..c587f74e97f2 100644 --- a/core/tests/coretests/src/android/widget/layout/table/FixedWidth.java +++ b/core/tests/coretests/src/android/widget/layout/table/FixedWidth.java @@ -16,11 +16,11 @@ package android.widget.layout.table; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; +import com.android.frameworks.coretests.R; + /** * Exercise table layout with cells having a fixed width and height. */ diff --git a/core/tests/coretests/src/android/widget/layout/table/FixedWidthTest.java b/core/tests/coretests/src/android/widget/layout/table/FixedWidthTest.java index b20ec84ba8aa..7d02453d4e54 100644 --- a/core/tests/coretests/src/android/widget/layout/table/FixedWidthTest.java +++ b/core/tests/coretests/src/android/widget/layout/table/FixedWidthTest.java @@ -16,13 +16,13 @@ package android.widget.layout.table; -import android.widget.layout.table.FixedWidth; -import com.android.frameworks.coretests.R; - import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.view.View; +import androidx.test.filters.MediumTest; + +import com.android.frameworks.coretests.R; + /** * {@link android.widget.layout.table.FixedWidth} is * setup to exercise tables in which cells use fixed width and height. diff --git a/core/tests/coretests/src/android/widget/layout/table/HorizontalGravity.java b/core/tests/coretests/src/android/widget/layout/table/HorizontalGravity.java index 1444f60f4aa9..6f5148be98b7 100644 --- a/core/tests/coretests/src/android/widget/layout/table/HorizontalGravity.java +++ b/core/tests/coretests/src/android/widget/layout/table/HorizontalGravity.java @@ -16,11 +16,11 @@ package android.widget.layout.table; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; +import com.android.frameworks.coretests.R; + /** * Exercise table layout with cells using a horizontal gravity. */ diff --git a/core/tests/coretests/src/android/widget/layout/table/HorizontalGravityTest.java b/core/tests/coretests/src/android/widget/layout/table/HorizontalGravityTest.java index 964df823fd55..73e8334e5224 100644 --- a/core/tests/coretests/src/android/widget/layout/table/HorizontalGravityTest.java +++ b/core/tests/coretests/src/android/widget/layout/table/HorizontalGravityTest.java @@ -16,14 +16,14 @@ package android.widget.layout.table; -import android.widget.layout.table.HorizontalGravity; -import com.android.frameworks.coretests.R; - import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.test.ViewAsserts; import android.view.View; +import androidx.test.filters.MediumTest; + +import com.android.frameworks.coretests.R; + /** * {@link android.widget.layout.table.HorizontalGravity} is * setup to exercise tables in which cells use horizontal gravity. diff --git a/core/tests/coretests/src/android/widget/layout/table/VerticalGravity.java b/core/tests/coretests/src/android/widget/layout/table/VerticalGravity.java index 4fdb37894cb8..9055b329a2a6 100644 --- a/core/tests/coretests/src/android/widget/layout/table/VerticalGravity.java +++ b/core/tests/coretests/src/android/widget/layout/table/VerticalGravity.java @@ -16,11 +16,11 @@ package android.widget.layout.table; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; +import com.android.frameworks.coretests.R; + /** * Exercise table layout with cells using a vertical gravity. */ diff --git a/core/tests/coretests/src/android/widget/layout/table/VerticalGravityTest.java b/core/tests/coretests/src/android/widget/layout/table/VerticalGravityTest.java index 1d6be3f01c79..f14fa1c2d7da 100644 --- a/core/tests/coretests/src/android/widget/layout/table/VerticalGravityTest.java +++ b/core/tests/coretests/src/android/widget/layout/table/VerticalGravityTest.java @@ -16,15 +16,15 @@ package android.widget.layout.table; -import android.widget.layout.table.VerticalGravity; -import com.android.frameworks.coretests.R; - import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.Suppress; import android.test.ViewAsserts; import android.view.View; +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; + +import com.android.frameworks.coretests.R; + /** * {@link android.widget.layout.table.VerticalGravity} is * setup to exercise tables in which cells use vertical gravity. diff --git a/core/tests/coretests/src/android/widget/layout/table/Weight.java b/core/tests/coretests/src/android/widget/layout/table/Weight.java index 6d4d51d93a8f..5c0824769d7a 100644 --- a/core/tests/coretests/src/android/widget/layout/table/Weight.java +++ b/core/tests/coretests/src/android/widget/layout/table/Weight.java @@ -16,11 +16,11 @@ package android.widget.layout.table; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; +import com.android.frameworks.coretests.R; + /** * Exercise table layout with cells having a weight. */ diff --git a/core/tests/coretests/src/android/widget/layout/table/WeightTest.java b/core/tests/coretests/src/android/widget/layout/table/WeightTest.java index b6655735d38c..fcf3de20e1d8 100644 --- a/core/tests/coretests/src/android/widget/layout/table/WeightTest.java +++ b/core/tests/coretests/src/android/widget/layout/table/WeightTest.java @@ -16,13 +16,13 @@ package android.widget.layout.table; -import android.widget.layout.table.Weight; -import com.android.frameworks.coretests.R; - import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.view.View; +import androidx.test.filters.MediumTest; + +import com.android.frameworks.coretests.R; + /** * {@link android.widget.layout.table.Weight} is * setup to exercise tables in which cells use a weight. diff --git a/core/tests/coretests/src/android/widget/listview/ListBottomGravity.java b/core/tests/coretests/src/android/widget/listview/ListBottomGravity.java index a386ebd3d941..cd76d70acdaf 100644 --- a/core/tests/coretests/src/android/widget/listview/ListBottomGravity.java +++ b/core/tests/coretests/src/android/widget/listview/ListBottomGravity.java @@ -16,8 +16,6 @@ package android.widget.listview; -import android.view.Gravity; - import android.util.ListScenario; /** diff --git a/core/tests/coretests/src/android/widget/listview/ListBottomGravityMany.java b/core/tests/coretests/src/android/widget/listview/ListBottomGravityMany.java index 519816c731a5..e048e3eb98a0 100644 --- a/core/tests/coretests/src/android/widget/listview/ListBottomGravityMany.java +++ b/core/tests/coretests/src/android/widget/listview/ListBottomGravityMany.java @@ -16,8 +16,6 @@ package android.widget.listview; -import android.view.Gravity; - import android.util.ListScenario; /** diff --git a/core/tests/coretests/src/android/widget/listview/ListBottomGravityManyTest.java b/core/tests/coretests/src/android/widget/listview/ListBottomGravityManyTest.java index e1171eb0982e..bd8dbe43947b 100644 --- a/core/tests/coretests/src/android/widget/listview/ListBottomGravityManyTest.java +++ b/core/tests/coretests/src/android/widget/listview/ListBottomGravityManyTest.java @@ -17,10 +17,9 @@ package android.widget.listview; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.widget.ListView; -import android.widget.listview.ListBottomGravityMany; +import androidx.test.filters.MediumTest; public class ListBottomGravityManyTest extends ActivityInstrumentationTestCase<ListBottomGravityMany> { private ListBottomGravityMany mActivity; diff --git a/core/tests/coretests/src/android/widget/listview/ListBottomGravityTest.java b/core/tests/coretests/src/android/widget/listview/ListBottomGravityTest.java index c595f62bd858..8da7358c04f6 100644 --- a/core/tests/coretests/src/android/widget/listview/ListBottomGravityTest.java +++ b/core/tests/coretests/src/android/widget/listview/ListBottomGravityTest.java @@ -17,10 +17,9 @@ package android.widget.listview; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.widget.ListView; -import android.widget.listview.ListBottomGravity; +import androidx.test.filters.MediumTest; public class ListBottomGravityTest extends ActivityInstrumentationTestCase<ListBottomGravity> { private ListBottomGravity mActivity; diff --git a/core/tests/coretests/src/android/widget/listview/ListButtonsDiagonalAcrossItems.java b/core/tests/coretests/src/android/widget/listview/ListButtonsDiagonalAcrossItems.java index bbed73c65af2..86407411c2d0 100644 --- a/core/tests/coretests/src/android/widget/listview/ListButtonsDiagonalAcrossItems.java +++ b/core/tests/coretests/src/android/widget/listview/ListButtonsDiagonalAcrossItems.java @@ -16,10 +16,10 @@ package android.widget.listview; -import android.util.ListItemFactory; import static android.util.ListItemFactory.Slot; -import android.util.ListScenario; +import android.util.ListItemFactory; +import android.util.ListScenario; import android.view.View; import android.view.ViewGroup; import android.widget.Button; diff --git a/core/tests/coretests/src/android/widget/listview/ListEmptyViewTest.java b/core/tests/coretests/src/android/widget/listview/ListEmptyViewTest.java index 258d3efc0c01..81d71a91edc3 100644 --- a/core/tests/coretests/src/android/widget/listview/ListEmptyViewTest.java +++ b/core/tests/coretests/src/android/widget/listview/ListEmptyViewTest.java @@ -19,12 +19,13 @@ package android.widget.listview; import android.app.Instrumentation; import android.content.Intent; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; import android.view.KeyEvent; import android.view.View; import android.widget.ListView; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; + public class ListEmptyViewTest extends ActivityInstrumentationTestCase<ListWithEmptyView> { private ListWithEmptyView mActivity; private ListView mListView; diff --git a/core/tests/coretests/src/android/widget/listview/ListFilter.java b/core/tests/coretests/src/android/widget/listview/ListFilter.java index c2ac90e7c47c..1cda71714ca5 100644 --- a/core/tests/coretests/src/android/widget/listview/ListFilter.java +++ b/core/tests/coretests/src/android/widget/listview/ListFilter.java @@ -25,7 +25,6 @@ import android.widget.Button; import com.android.frameworks.coretests.R; - /** * Tests hiding and showing the list filter by hiding and showing an ancestor of the * ListView diff --git a/core/tests/coretests/src/android/widget/listview/ListFocusableTest.java b/core/tests/coretests/src/android/widget/listview/ListFocusableTest.java index bf18a13dc4f1..10b4a79f40aa 100644 --- a/core/tests/coretests/src/android/widget/listview/ListFocusableTest.java +++ b/core/tests/coretests/src/android/widget/listview/ListFocusableTest.java @@ -17,10 +17,11 @@ package android.widget.listview; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; -import android.widget.ListView; -import android.widget.ListAdapter; import android.widget.ArrayAdapter; +import android.widget.ListAdapter; +import android.widget.ListView; + +import androidx.test.filters.MediumTest; public class ListFocusableTest extends ActivityInstrumentationTestCase<ListTopGravity> { private ListTopGravity mActivity; diff --git a/core/tests/coretests/src/android/widget/listview/ListGetCheckItemIdsTest.java b/core/tests/coretests/src/android/widget/listview/ListGetCheckItemIdsTest.java index 33d61a093ad4..c691ed753301 100644 --- a/core/tests/coretests/src/android/widget/listview/ListGetCheckItemIdsTest.java +++ b/core/tests/coretests/src/android/widget/listview/ListGetCheckItemIdsTest.java @@ -17,10 +17,11 @@ package android.widget.listview; import android.test.ActivityInstrumentationTestCase2; -import android.test.UiThreadTest; -import android.test.suitebuilder.annotation.MediumTest; import android.widget.ListView; +import androidx.test.annotation.UiThreadTest; +import androidx.test.filters.MediumTest; + import java.util.Arrays; /** diff --git a/core/tests/coretests/src/android/widget/listview/ListHeterogeneous.java b/core/tests/coretests/src/android/widget/listview/ListHeterogeneous.java index 1f59c30f20b8..74eda3b850b9 100644 --- a/core/tests/coretests/src/android/widget/listview/ListHeterogeneous.java +++ b/core/tests/coretests/src/android/widget/listview/ListHeterogeneous.java @@ -16,11 +16,10 @@ package android.widget.listview; -import android.view.View; -import android.view.ViewGroup; - import android.util.ListItemFactory; import android.util.ListScenario; +import android.view.View; +import android.view.ViewGroup; /** * List that has different view types diff --git a/core/tests/coretests/src/android/widget/listview/ListHeterogeneousTest.java b/core/tests/coretests/src/android/widget/listview/ListHeterogeneousTest.java index 01b39db92a7d..dbd58d7363a8 100644 --- a/core/tests/coretests/src/android/widget/listview/ListHeterogeneousTest.java +++ b/core/tests/coretests/src/android/widget/listview/ListHeterogeneousTest.java @@ -18,12 +18,11 @@ package android.widget.listview; import android.app.Instrumentation; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; import android.view.KeyEvent; import android.widget.ListView; -import android.widget.listview.ListHeterogeneous; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; public class ListHeterogeneousTest extends ActivityInstrumentationTestCase<ListHeterogeneous> { private ListHeterogeneous mActivity; diff --git a/core/tests/coretests/src/android/widget/listview/ListHorizontalFocusWithinItemWins.java b/core/tests/coretests/src/android/widget/listview/ListHorizontalFocusWithinItemWins.java index 2ff65de9d523..e98de9c1204c 100644 --- a/core/tests/coretests/src/android/widget/listview/ListHorizontalFocusWithinItemWins.java +++ b/core/tests/coretests/src/android/widget/listview/ListHorizontalFocusWithinItemWins.java @@ -16,11 +16,11 @@ package android.widget.listview; -import android.util.ListItemFactory; import static android.util.ListItemFactory.Slot; -import android.util.ListScenario; import android.content.Context; +import android.util.ListItemFactory; +import android.util.ListScenario; import android.view.View; import android.view.ViewGroup; import android.widget.Button; diff --git a/core/tests/coretests/src/android/widget/listview/ListInHorizontal.java b/core/tests/coretests/src/android/widget/listview/ListInHorizontal.java index a373a5b19be3..6622c0d21eb2 100644 --- a/core/tests/coretests/src/android/widget/listview/ListInHorizontal.java +++ b/core/tests/coretests/src/android/widget/listview/ListInHorizontal.java @@ -18,10 +18,7 @@ package android.widget.listview; import android.app.Activity; import android.os.Bundle; -import android.os.Handler; import android.widget.ArrayAdapter; -import android.widget.GridView; -import android.widget.TextView; import android.widget.ListView; import com.android.frameworks.coretests.R; diff --git a/core/tests/coretests/src/android/widget/listview/ListInHorizontalTest.java b/core/tests/coretests/src/android/widget/listview/ListInHorizontalTest.java index 3643f794effd..d8508ecafee5 100644 --- a/core/tests/coretests/src/android/widget/listview/ListInHorizontalTest.java +++ b/core/tests/coretests/src/android/widget/listview/ListInHorizontalTest.java @@ -16,8 +16,6 @@ package android.widget.listview; -import android.widget.listview.ListInHorizontal; - public class ListInHorizontalTest extends ListUnspecifiedMeasure<ListInHorizontal> { public ListInHorizontalTest() { super(ListInHorizontal.class); diff --git a/core/tests/coretests/src/android/widget/listview/ListInVertical.java b/core/tests/coretests/src/android/widget/listview/ListInVertical.java index 3b4885a9589d..4ecf25d6a818 100644 --- a/core/tests/coretests/src/android/widget/listview/ListInVertical.java +++ b/core/tests/coretests/src/android/widget/listview/ListInVertical.java @@ -18,10 +18,7 @@ package android.widget.listview; import android.app.Activity; import android.os.Bundle; -import android.os.Handler; import android.widget.ArrayAdapter; -import android.widget.GridView; -import android.widget.TextView; import android.widget.ListView; import com.android.frameworks.coretests.R; diff --git a/core/tests/coretests/src/android/widget/listview/ListInVerticalTest.java b/core/tests/coretests/src/android/widget/listview/ListInVerticalTest.java index 85864294573f..5e385a33b057 100644 --- a/core/tests/coretests/src/android/widget/listview/ListInVerticalTest.java +++ b/core/tests/coretests/src/android/widget/listview/ListInVerticalTest.java @@ -16,8 +16,6 @@ package android.widget.listview; -import android.widget.listview.ListInVertical; - public class ListInVerticalTest extends ListUnspecifiedMeasure<ListInVertical> { public ListInVerticalTest() { super(ListInVertical.class); diff --git a/core/tests/coretests/src/android/widget/listview/ListInterleaveFocusables.java b/core/tests/coretests/src/android/widget/listview/ListInterleaveFocusables.java index d5da28e75c4a..0ec7a2431b93 100644 --- a/core/tests/coretests/src/android/widget/listview/ListInterleaveFocusables.java +++ b/core/tests/coretests/src/android/widget/listview/ListInterleaveFocusables.java @@ -16,13 +16,14 @@ package android.widget.listview; +import android.util.ListItemFactory; +import android.util.ListScenario; import android.view.View; - import android.view.ViewGroup; - import com.google.android.collect.Sets; - import android.util.ListScenario; - import android.util.ListItemFactory; +import android.view.ViewGroup; - import java.util.Set; +import com.google.android.collect.Sets; + +import java.util.Set; /** * List that interleaves focusable items. diff --git a/core/tests/coretests/src/android/widget/listview/ListItemFocusableAboveUnfocusable.java b/core/tests/coretests/src/android/widget/listview/ListItemFocusableAboveUnfocusable.java index f7c01b1ea975..3159e53eabc5 100644 --- a/core/tests/coretests/src/android/widget/listview/ListItemFocusableAboveUnfocusable.java +++ b/core/tests/coretests/src/android/widget/listview/ListItemFocusableAboveUnfocusable.java @@ -16,12 +16,10 @@ package android.widget.listview; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.TextView; import android.util.ListItemFactory; import android.util.ListScenario; +import android.view.View; +import android.view.ViewGroup; /** * A list where the items may befocusable, but the second item isn't actually focusabe. diff --git a/core/tests/coretests/src/android/widget/listview/ListItemFocusablesClose.java b/core/tests/coretests/src/android/widget/listview/ListItemFocusablesClose.java index b529b2e7b0e8..861e2a919052 100644 --- a/core/tests/coretests/src/android/widget/listview/ListItemFocusablesClose.java +++ b/core/tests/coretests/src/android/widget/listview/ListItemFocusablesClose.java @@ -16,8 +16,8 @@ package android.widget.listview; -import android.util.ListScenario; import android.util.ListItemFactory; +import android.util.ListScenario; import android.view.View; import android.view.ViewGroup; diff --git a/core/tests/coretests/src/android/widget/listview/ListItemFocusablesFarApart.java b/core/tests/coretests/src/android/widget/listview/ListItemFocusablesFarApart.java index 59987ec4702b..e9c9c1dd586c 100644 --- a/core/tests/coretests/src/android/widget/listview/ListItemFocusablesFarApart.java +++ b/core/tests/coretests/src/android/widget/listview/ListItemFocusablesFarApart.java @@ -16,10 +16,10 @@ package android.widget.listview; -import android.view.View; -import android.view.ViewGroup; import android.util.ListItemFactory; import android.util.ListScenario; +import android.view.View; +import android.view.ViewGroup; /** * A list where each item is tall with buttons that are farther apart than the screen diff --git a/core/tests/coretests/src/android/widget/listview/ListItemISVAndButton.java b/core/tests/coretests/src/android/widget/listview/ListItemISVAndButton.java index ea2c5f2caf13..2a0e013be616 100644 --- a/core/tests/coretests/src/android/widget/listview/ListItemISVAndButton.java +++ b/core/tests/coretests/src/android/widget/listview/ListItemISVAndButton.java @@ -17,13 +17,13 @@ package android.widget.listview; import android.content.Context; +import android.util.InternalSelectionView; +import android.util.ListScenario; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; -import android.util.InternalSelectionView; -import android.util.ListScenario; /** * Each item is an internal selection view, a button, and some filler diff --git a/core/tests/coretests/src/android/widget/listview/ListItemRequestRectAboveThinFirstItemTest.java b/core/tests/coretests/src/android/widget/listview/ListItemRequestRectAboveThinFirstItemTest.java index 73eb0a8f8e63..91ff06b3f670 100644 --- a/core/tests/coretests/src/android/widget/listview/ListItemRequestRectAboveThinFirstItemTest.java +++ b/core/tests/coretests/src/android/widget/listview/ListItemRequestRectAboveThinFirstItemTest.java @@ -18,13 +18,13 @@ package android.widget.listview; import android.graphics.Rect; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.Suppress; -import android.view.View; import android.view.KeyEvent; +import android.view.View; import android.widget.ListView; -import android.widget.listview.ListOfThinItems; + +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; public class ListItemRequestRectAboveThinFirstItemTest extends ActivityInstrumentationTestCase<ListOfThinItems> { diff --git a/core/tests/coretests/src/android/widget/listview/ListItemsExpandOnSelection.java b/core/tests/coretests/src/android/widget/listview/ListItemsExpandOnSelection.java index a5fe17ac7603..d80fd90de53e 100644 --- a/core/tests/coretests/src/android/widget/listview/ListItemsExpandOnSelection.java +++ b/core/tests/coretests/src/android/widget/listview/ListItemsExpandOnSelection.java @@ -17,13 +17,12 @@ package android.widget.listview; import android.content.Context; +import android.util.ListScenario; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.TextView; -import android.util.ListScenario; - /** * A list where each item expands by 1.5 when selected. */ diff --git a/core/tests/coretests/src/android/widget/listview/ListManagedCursor.java b/core/tests/coretests/src/android/widget/listview/ListManagedCursor.java index 12b5ef4067ed..54f302c8178c 100644 --- a/core/tests/coretests/src/android/widget/listview/ListManagedCursor.java +++ b/core/tests/coretests/src/android/widget/listview/ListManagedCursor.java @@ -20,14 +20,13 @@ import android.app.ListActivity; import android.content.Intent; import android.database.Cursor; import android.os.Bundle; -import android.provider.Settings; import android.provider.Contacts.People; +import android.provider.Settings; import android.view.View; import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; import android.widget.ListAdapter; import android.widget.SimpleCursorAdapter; -import android.widget.AdapterView.OnItemClickListener; - public class ListManagedCursor extends ListActivity implements OnItemClickListener { diff --git a/core/tests/coretests/src/android/widget/listview/ListManagedCursorTest.java b/core/tests/coretests/src/android/widget/listview/ListManagedCursorTest.java index bc3776cfb02e..8e0b6fe7ef55 100644 --- a/core/tests/coretests/src/android/widget/listview/ListManagedCursorTest.java +++ b/core/tests/coretests/src/android/widget/listview/ListManagedCursorTest.java @@ -18,11 +18,12 @@ package android.widget.listview; import android.app.Instrumentation; import android.test.ActivityInstrumentationTestCase2; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; +import android.test.TouchUtils; import android.view.KeyEvent; import android.widget.ListView; -import android.test.TouchUtils; + +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; /** * Tests restoring the scroll position in a list with a managed cursor. diff --git a/core/tests/coretests/src/android/widget/listview/ListOfTouchables.java b/core/tests/coretests/src/android/widget/listview/ListOfTouchables.java index 919ef69fc8a2..70b9081128a0 100644 --- a/core/tests/coretests/src/android/widget/listview/ListOfTouchables.java +++ b/core/tests/coretests/src/android/widget/listview/ListOfTouchables.java @@ -16,12 +16,11 @@ package android.widget.listview; +import android.util.ListScenario; import android.view.View; import android.view.ViewGroup; import android.widget.Button; -import android.util.ListScenario; - /** * Each list item has two focusables that are close enough together that * it shouldn't require panning to move focus. diff --git a/core/tests/coretests/src/android/widget/listview/ListRecyclerProfiling.java b/core/tests/coretests/src/android/widget/listview/ListRecyclerProfiling.java index 76814fb480cd..075712efe64a 100644 --- a/core/tests/coretests/src/android/widget/listview/ListRecyclerProfiling.java +++ b/core/tests/coretests/src/android/widget/listview/ListRecyclerProfiling.java @@ -18,11 +18,11 @@ package android.widget.listview; import android.app.Activity; import android.os.Bundle; +import android.view.View; +import android.view.ViewDebug; import android.widget.ArrayAdapter; -import android.widget.ListView; import android.widget.ImageButton; -import android.view.ViewDebug; -import android.view.View; +import android.widget.ListView; import com.android.frameworks.coretests.R; diff --git a/core/tests/coretests/src/android/widget/listview/ListRetainsFocusAcrossLayoutsTest.java b/core/tests/coretests/src/android/widget/listview/ListRetainsFocusAcrossLayoutsTest.java index 896bd19d311f..be14de8986d8 100644 --- a/core/tests/coretests/src/android/widget/listview/ListRetainsFocusAcrossLayoutsTest.java +++ b/core/tests/coretests/src/android/widget/listview/ListRetainsFocusAcrossLayoutsTest.java @@ -16,12 +16,11 @@ package android.widget.listview; -import android.widget.listview.ListItemFocusablesClose; - import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.view.KeyEvent; +import androidx.test.filters.MediumTest; + public class ListRetainsFocusAcrossLayoutsTest extends ActivityInstrumentationTestCase<ListItemFocusablesClose> { public ListRetainsFocusAcrossLayoutsTest() { diff --git a/core/tests/coretests/src/android/widget/listview/ListScrollListenerTest.java b/core/tests/coretests/src/android/widget/listview/ListScrollListenerTest.java index 7b29a66c22fa..28addd6431ae 100644 --- a/core/tests/coretests/src/android/widget/listview/ListScrollListenerTest.java +++ b/core/tests/coretests/src/android/widget/listview/ListScrollListenerTest.java @@ -19,12 +19,13 @@ package android.widget.listview; import android.app.Instrumentation; import android.test.ActivityInstrumentationTestCase; import android.test.TouchUtils; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; import android.view.KeyEvent; import android.widget.AbsListView; import android.widget.ListView; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; + public class ListScrollListenerTest extends ActivityInstrumentationTestCase<ListScrollListener> implements AbsListView.OnScrollListener { private ListScrollListener mActivity; diff --git a/core/tests/coretests/src/android/widget/listview/ListSetSelection.java b/core/tests/coretests/src/android/widget/listview/ListSetSelection.java index 6c2e26401eed..af8e899a867a 100644 --- a/core/tests/coretests/src/android/widget/listview/ListSetSelection.java +++ b/core/tests/coretests/src/android/widget/listview/ListSetSelection.java @@ -16,12 +16,12 @@ package android.widget.listview; +import android.os.Bundle; import android.util.ListScenario; import android.view.KeyEvent; import android.view.View; -import android.os.Bundle; -import android.widget.LinearLayout; import android.widget.Button; +import android.widget.LinearLayout; /** * List of 1,000 items used to test calls to setSelection() in touch mode. diff --git a/core/tests/coretests/src/android/widget/listview/ListSetSelectionTest.java b/core/tests/coretests/src/android/widget/listview/ListSetSelectionTest.java index 4cef16470609..2caca1309d0c 100644 --- a/core/tests/coretests/src/android/widget/listview/ListSetSelectionTest.java +++ b/core/tests/coretests/src/android/widget/listview/ListSetSelectionTest.java @@ -17,10 +17,11 @@ package android.widget.listview; import android.test.ActivityInstrumentationTestCase2; -import android.test.UiThreadTest; -import android.test.suitebuilder.annotation.MediumTest; import android.widget.ListView; +import androidx.test.annotation.UiThreadTest; +import androidx.test.filters.MediumTest; + /** * Basic tests of setting & clearing the selection */ diff --git a/core/tests/coretests/src/android/widget/listview/ListSimple.java b/core/tests/coretests/src/android/widget/listview/ListSimple.java index 6accae1c3ef1..f53638eb8ff1 100644 --- a/core/tests/coretests/src/android/widget/listview/ListSimple.java +++ b/core/tests/coretests/src/android/widget/listview/ListSimple.java @@ -16,11 +16,10 @@ package android.widget.listview; +import android.os.Bundle; import android.util.ListScenario; - import android.view.View; import android.view.ViewGroup; -import android.os.Bundle; import android.widget.TextView; public class ListSimple extends ListScenario { diff --git a/core/tests/coretests/src/android/widget/listview/ListTakeFocusFromSide.java b/core/tests/coretests/src/android/widget/listview/ListTakeFocusFromSide.java index 95f09f6e78bc..c4e9fe941b72 100644 --- a/core/tests/coretests/src/android/widget/listview/ListTakeFocusFromSide.java +++ b/core/tests/coretests/src/android/widget/listview/ListTakeFocusFromSide.java @@ -16,17 +16,17 @@ package android.widget.listview; -import com.android.frameworks.coretests.R; - import android.app.ListActivity; import android.content.Context; import android.os.Bundle; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.view.LayoutInflater; import android.widget.BaseAdapter; import android.widget.TextView; +import com.android.frameworks.coretests.R; + /** * Exercises moving focus into the list from the side */ diff --git a/core/tests/coretests/src/android/widget/listview/ListThrasher.java b/core/tests/coretests/src/android/widget/listview/ListThrasher.java index 0237a9551ce5..d82f68d11c92 100644 --- a/core/tests/coretests/src/android/widget/listview/ListThrasher.java +++ b/core/tests/coretests/src/android/widget/listview/ListThrasher.java @@ -16,19 +16,19 @@ package android.widget.listview; -import com.android.frameworks.coretests.R; - import android.app.ListActivity; import android.content.Context; import android.os.Bundle; import android.os.Handler; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.view.LayoutInflater; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.TextView; +import com.android.frameworks.coretests.R; + import java.util.Random; /** diff --git a/core/tests/coretests/src/android/widget/listview/ListTopGravity.java b/core/tests/coretests/src/android/widget/listview/ListTopGravity.java index 986cc5713db0..31339e9ee9c2 100644 --- a/core/tests/coretests/src/android/widget/listview/ListTopGravity.java +++ b/core/tests/coretests/src/android/widget/listview/ListTopGravity.java @@ -16,8 +16,6 @@ package android.widget.listview; -import android.view.Gravity; - import android.util.ListScenario; /** diff --git a/core/tests/coretests/src/android/widget/listview/ListUnspecifiedMeasure.java b/core/tests/coretests/src/android/widget/listview/ListUnspecifiedMeasure.java index 199d069e16ef..0fc87ea063ed 100644 --- a/core/tests/coretests/src/android/widget/listview/ListUnspecifiedMeasure.java +++ b/core/tests/coretests/src/android/widget/listview/ListUnspecifiedMeasure.java @@ -16,13 +16,14 @@ package android.widget.listview; -import com.android.frameworks.coretests.R; - -import android.test.ActivityInstrumentationTestCase; import android.app.Activity; -import android.test.suitebuilder.annotation.MediumTest; +import android.test.ActivityInstrumentationTestCase; import android.widget.ListView; +import androidx.test.filters.MediumTest; + +import com.android.frameworks.coretests.R; + public class ListUnspecifiedMeasure<T extends Activity> extends ActivityInstrumentationTestCase<T> { private T mActivity; private ListView mListView; diff --git a/core/tests/coretests/src/android/widget/listview/ListViewHeightTest.java b/core/tests/coretests/src/android/widget/listview/ListViewHeightTest.java index 5ab2757deae7..63941f1c967d 100644 --- a/core/tests/coretests/src/android/widget/listview/ListViewHeightTest.java +++ b/core/tests/coretests/src/android/widget/listview/ListViewHeightTest.java @@ -18,12 +18,12 @@ package android.widget.listview; import android.app.Instrumentation; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.widget.Button; import android.widget.ListView; +import androidx.test.filters.MediumTest; + import com.android.frameworks.coretests.R; -import android.widget.listview.ListViewHeight; public class ListViewHeightTest extends ActivityInstrumentationTestCase<ListViewHeight> { private ListViewHeight mActivity; diff --git a/core/tests/coretests/src/android/widget/listview/ListWithDisappearingItemBug.java b/core/tests/coretests/src/android/widget/listview/ListWithDisappearingItemBug.java index 348ea1b75578..10ba8b73cd02 100644 --- a/core/tests/coretests/src/android/widget/listview/ListWithDisappearingItemBug.java +++ b/core/tests/coretests/src/android/widget/listview/ListWithDisappearingItemBug.java @@ -16,8 +16,6 @@ package android.widget.listview; -import com.android.frameworks.coretests.R; - import android.app.ListActivity; import android.database.Cursor; import android.os.Bundle; @@ -32,6 +30,8 @@ import android.widget.ListView; import android.widget.SimpleCursorAdapter; import android.widget.Toast; +import com.android.frameworks.coretests.R; + /** * See 1080989. You need some contacts for this adapter. */ diff --git a/core/tests/coretests/src/android/widget/listview/ListWithEmptyView.java b/core/tests/coretests/src/android/widget/listview/ListWithEmptyView.java index 74dd06c1ba71..52273fdc98a0 100644 --- a/core/tests/coretests/src/android/widget/listview/ListWithEmptyView.java +++ b/core/tests/coretests/src/android/widget/listview/ListWithEmptyView.java @@ -16,8 +16,6 @@ package android.widget.listview; -import com.android.frameworks.coretests.R; - import android.app.ListActivity; import android.content.Context; import android.os.Bundle; @@ -26,6 +24,8 @@ import android.view.MenuItem; import android.view.View; import android.widget.ArrayAdapter; +import com.android.frameworks.coretests.R; + /** * Tests using an empty view with a list */ diff --git a/core/tests/coretests/src/android/widget/listview/ListWithHeaders.java b/core/tests/coretests/src/android/widget/listview/ListWithHeaders.java index aea091ae9cf3..6030582a2445 100644 --- a/core/tests/coretests/src/android/widget/listview/ListWithHeaders.java +++ b/core/tests/coretests/src/android/widget/listview/ListWithHeaders.java @@ -16,9 +16,8 @@ package android.widget.listview; -import android.util.ListScenario; - import android.os.Bundle; +import android.util.ListScenario; import android.widget.Button; import android.widget.ListAdapter; import android.widget.ListView; diff --git a/core/tests/coretests/src/android/widget/listview/ListWithOnItemSelectedAction.java b/core/tests/coretests/src/android/widget/listview/ListWithOnItemSelectedAction.java index 26e1d5d88e1e..13e770cd4e47 100644 --- a/core/tests/coretests/src/android/widget/listview/ListWithOnItemSelectedAction.java +++ b/core/tests/coretests/src/android/widget/listview/ListWithOnItemSelectedAction.java @@ -16,8 +16,8 @@ package android.widget.listview; -import android.widget.TextView; import android.util.ListScenario; +import android.widget.TextView; /** * The header text view echos the value of the selected item by using (indirectly) diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListInterleaveFocusablesTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListInterleaveFocusablesTest.java index ec8ab7e77357..22c28c29b322 100644 --- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListInterleaveFocusablesTest.java +++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListInterleaveFocusablesTest.java @@ -17,13 +17,14 @@ package android.widget.listview.arrowscroll; import android.test.ActivityInstrumentationTestCase2; -import android.test.suitebuilder.annotation.MediumTest; import android.util.ListUtil; import android.view.KeyEvent; import android.view.View; import android.widget.ListView; import android.widget.listview.ListInterleaveFocusables; +import androidx.test.filters.MediumTest; + public class ListInterleaveFocusablesTest extends ActivityInstrumentationTestCase2<ListInterleaveFocusables> { private ListView mListView; private ListUtil mListUtil; diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusableAboveUnfocusableTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusableAboveUnfocusableTest.java index 82f48801111e..c645b7c5b767 100644 --- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusableAboveUnfocusableTest.java +++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusableAboveUnfocusableTest.java @@ -17,11 +17,12 @@ package android.widget.listview.arrowscroll; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; -import android.widget.ListView; import android.view.KeyEvent; +import android.widget.ListView; import android.widget.listview.ListItemFocusableAboveUnfocusable; +import androidx.test.filters.MediumTest; + public class ListItemFocusableAboveUnfocusableTest extends ActivityInstrumentationTestCase<ListItemFocusableAboveUnfocusable> { private ListView mListView; diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusablesCloseTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusablesCloseTest.java index 3b30ebe766cb..c7525b33d6de 100644 --- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusablesCloseTest.java +++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusablesCloseTest.java @@ -17,12 +17,13 @@ package android.widget.listview.arrowscroll; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.view.KeyEvent; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.listview.ListItemFocusablesClose; +import androidx.test.filters.MediumTest; + public class ListItemFocusablesCloseTest extends ActivityInstrumentationTestCase<ListItemFocusablesClose> { private ListView mListView; private int mListTop; diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusablesFarApartTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusablesFarApartTest.java index 475930df37e3..4bb2206984da 100644 --- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusablesFarApartTest.java +++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemFocusablesFarApartTest.java @@ -17,7 +17,6 @@ package android.widget.listview.arrowscroll; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; @@ -25,6 +24,8 @@ import android.widget.Button; import android.widget.ListView; import android.widget.listview.ListItemFocusablesFarApart; +import androidx.test.filters.MediumTest; + public class ListItemFocusablesFarApartTest extends ActivityInstrumentationTestCase<ListItemFocusablesFarApart> { private ListView mListView; private int mListTop; diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemsExpandOnSelectionTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemsExpandOnSelectionTest.java index 91a1eba124de..76052914e027 100644 --- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemsExpandOnSelectionTest.java +++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListItemsExpandOnSelectionTest.java @@ -17,13 +17,14 @@ package android.widget.listview.arrowscroll; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.Suppress; -import android.widget.ListView; import android.view.KeyEvent; +import android.widget.ListView; import android.widget.listview.ListItemsExpandOnSelection; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; + public class ListItemsExpandOnSelectionTest extends ActivityInstrumentationTestCase<ListItemsExpandOnSelection> { private ListView mListView; private int mListTop; diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListLastItemPartiallyVisibleTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListLastItemPartiallyVisibleTest.java index 5bc121a907ae..fdae4833532a 100644 --- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListLastItemPartiallyVisibleTest.java +++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListLastItemPartiallyVisibleTest.java @@ -17,12 +17,13 @@ package android.widget.listview.arrowscroll; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; -import android.widget.ListView; -import android.view.View; import android.view.KeyEvent; +import android.view.View; +import android.widget.ListView; import android.widget.listview.ListLastItemPartiallyVisible; +import androidx.test.filters.MediumTest; + public class ListLastItemPartiallyVisibleTest extends ActivityInstrumentationTestCase<ListLastItemPartiallyVisible> { private ListView mListView; private int mListBottom; diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfItemsShorterThanScreenTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfItemsShorterThanScreenTest.java index bda71d0d3fe6..d44b130164f2 100644 --- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfItemsShorterThanScreenTest.java +++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfItemsShorterThanScreenTest.java @@ -17,14 +17,15 @@ package android.widget.listview.arrowscroll; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.Suppress; import android.view.KeyEvent; import android.view.View; import android.widget.ListView; import android.widget.TextView; import android.widget.listview.ListOfItemsShorterThanScreen; +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; + public class ListOfItemsShorterThanScreenTest extends ActivityInstrumentationTestCase<ListOfItemsShorterThanScreen> { private ListView mListView; diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfItemsTallerThanScreenTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfItemsTallerThanScreenTest.java index 213544526170..1decdadd7fb8 100644 --- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfItemsTallerThanScreenTest.java +++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfItemsTallerThanScreenTest.java @@ -17,13 +17,14 @@ package android.widget.listview.arrowscroll; import android.test.ActivityInstrumentationTestCase2; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.Suppress; import android.view.KeyEvent; import android.view.View; import android.widget.ListView; import android.widget.listview.ListOfItemsTallerThanScreen; +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; + public class ListOfItemsTallerThanScreenTest extends ActivityInstrumentationTestCase2<ListOfItemsTallerThanScreen> { diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfShortShortTallShortShortTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfShortShortTallShortShortTest.java index ef70b5ae46a5..67808f1945f9 100644 --- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfShortShortTallShortShortTest.java +++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfShortShortTallShortShortTest.java @@ -17,13 +17,14 @@ package android.widget.listview.arrowscroll; import android.test.ActivityInstrumentationTestCase2; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.Suppress; import android.util.ListUtil; import android.view.KeyEvent; import android.widget.ListView; import android.widget.listview.ListOfShortShortTallShortShort; +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; + public class ListOfShortShortTallShortShortTest extends ActivityInstrumentationTestCase2<ListOfShortShortTallShortShort> { private ListView mListView; private ListUtil mListUtil; diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfShortTallShortTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfShortTallShortTest.java index c958591e8c2e..f9aa6dc13b6c 100644 --- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfShortTallShortTest.java +++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfShortTallShortTest.java @@ -17,11 +17,12 @@ package android.widget.listview.arrowscroll; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; -import android.widget.ListView; import android.view.KeyEvent; +import android.widget.ListView; import android.widget.listview.ListOfShortTallShort; +import androidx.test.filters.MediumTest; + public class ListOfShortTallShortTest extends ActivityInstrumentationTestCase<ListOfShortTallShort> { private ListView mListView; diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfThinItemsTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfThinItemsTest.java index c191d71aaf6e..6bd1cb5557a6 100644 --- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfThinItemsTest.java +++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListOfThinItemsTest.java @@ -17,14 +17,15 @@ package android.widget.listview.arrowscroll; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.Suppress; import android.view.KeyEvent; import android.view.View; import android.widget.ListView; import android.widget.listview.ListOfThinItems; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; + public class ListOfThinItemsTest extends ActivityInstrumentationTestCase<ListOfThinItems> { private ListView mListView; diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithFirstScreenUnSelectableTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithFirstScreenUnSelectableTest.java index 9a8e63421d61..60bc1155bc00 100644 --- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithFirstScreenUnSelectableTest.java +++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithFirstScreenUnSelectableTest.java @@ -16,12 +16,13 @@ package android.widget.listview.arrowscroll; -import android.support.test.filters.LargeTest; import android.test.ActivityInstrumentationTestCase2; import android.view.KeyEvent; +import android.widget.AdapterView; import android.widget.ListView; import android.widget.listview.ListWithFirstScreenUnSelectable; -import android.widget.AdapterView; + +import androidx.test.filters.LargeTest; @LargeTest public class ListWithFirstScreenUnSelectableTest diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithNoFadingEdgeTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithNoFadingEdgeTest.java index 56ca00987dc2..a60054e2e821 100644 --- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithNoFadingEdgeTest.java +++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithNoFadingEdgeTest.java @@ -17,12 +17,13 @@ package android.widget.listview.arrowscroll; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; import android.view.KeyEvent; import android.widget.ListView; import android.widget.listview.ListWithNoFadingEdge; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; + public class ListWithNoFadingEdgeTest extends ActivityInstrumentationTestCase<ListWithNoFadingEdge> { private ListView mListView; diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithOffScreenNextSelectableTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithOffScreenNextSelectableTest.java index cf319d11ea88..80e70c6e4cac 100644 --- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithOffScreenNextSelectableTest.java +++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithOffScreenNextSelectableTest.java @@ -17,14 +17,15 @@ package android.widget.listview.arrowscroll; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.Suppress; import android.view.KeyEvent; import android.view.View; import android.widget.ListView; import android.widget.TextView; import android.widget.listview.ListWithOffScreenNextSelectable; +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; + @Suppress // Failing. public class ListWithOffScreenNextSelectableTest extends ActivityInstrumentationTestCase<ListWithOffScreenNextSelectable> { diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithOnItemSelectedActionTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithOnItemSelectedActionTest.java index feea9b2c403c..819b739fdd32 100644 --- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithOnItemSelectedActionTest.java +++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithOnItemSelectedActionTest.java @@ -17,12 +17,13 @@ package android.widget.listview.arrowscroll; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; +import android.view.KeyEvent; import android.widget.ListView; import android.widget.TextView; -import android.view.KeyEvent; import android.widget.listview.ListWithOnItemSelectedAction; +import androidx.test.filters.MediumTest; + public class ListWithOnItemSelectedActionTest extends ActivityInstrumentationTestCase<ListWithOnItemSelectedAction> { private ListView mListView; diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithScreenOfNoSelectablesTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithScreenOfNoSelectablesTest.java index 211c8c8d0f7e..9bbdc2ae8b9e 100644 --- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithScreenOfNoSelectablesTest.java +++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithScreenOfNoSelectablesTest.java @@ -17,13 +17,14 @@ package android.widget.listview.arrowscroll; import android.test.ActivityInstrumentationTestCase2; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.Suppress; import android.view.KeyEvent; import android.view.View; import android.widget.ListView; import android.widget.listview.ListWithScreenOfNoSelectables; +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; + public class ListWithScreenOfNoSelectablesTest extends ActivityInstrumentationTestCase2<ListWithScreenOfNoSelectables> { private ListView mListView; diff --git a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithSeparatorsTest.java b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithSeparatorsTest.java index 42058f030020..21fa51d4ae13 100644 --- a/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithSeparatorsTest.java +++ b/core/tests/coretests/src/android/widget/listview/arrowscroll/ListWithSeparatorsTest.java @@ -17,11 +17,12 @@ package android.widget.listview.arrowscroll; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; -import android.widget.ListView; import android.view.KeyEvent; +import android.widget.ListView; import android.widget.listview.ListWithSeparators; +import androidx.test.filters.MediumTest; + public class ListWithSeparatorsTest extends ActivityInstrumentationTestCase<ListWithSeparators> { private ListWithSeparators mActivity; private ListView mListView; diff --git a/core/tests/coretests/src/android/widget/listview/focus/AdjacentListsWithAdjacentISVsInsideTest.java b/core/tests/coretests/src/android/widget/listview/focus/AdjacentListsWithAdjacentISVsInsideTest.java index 6a7466b627aa..e9baabf3175a 100644 --- a/core/tests/coretests/src/android/widget/listview/focus/AdjacentListsWithAdjacentISVsInsideTest.java +++ b/core/tests/coretests/src/android/widget/listview/focus/AdjacentListsWithAdjacentISVsInsideTest.java @@ -16,14 +16,14 @@ package android.widget.listview.focus; -import android.test.suitebuilder.annotation.Suppress; -import android.widget.listview.AdjacentListsWithAdjacentISVsInside; -import android.util.InternalSelectionView; - import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; +import android.util.InternalSelectionView; import android.view.KeyEvent; import android.widget.ListView; +import android.widget.listview.AdjacentListsWithAdjacentISVsInside; + +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; public class AdjacentListsWithAdjacentISVsInsideTest extends ActivityInstrumentationTestCase<AdjacentListsWithAdjacentISVsInside> { diff --git a/core/tests/coretests/src/android/widget/listview/focus/ListButtonsDiagonalAcrossItemsTest.java b/core/tests/coretests/src/android/widget/listview/focus/ListButtonsDiagonalAcrossItemsTest.java index 5540d650dd19..3fbdacc302f5 100644 --- a/core/tests/coretests/src/android/widget/listview/focus/ListButtonsDiagonalAcrossItemsTest.java +++ b/core/tests/coretests/src/android/widget/listview/focus/ListButtonsDiagonalAcrossItemsTest.java @@ -16,15 +16,15 @@ package android.widget.listview.focus; -import android.widget.listview.ListButtonsDiagonalAcrossItems; - import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.view.FocusFinder; import android.view.KeyEvent; import android.view.View; import android.widget.Button; import android.widget.ListView; +import android.widget.listview.ListButtonsDiagonalAcrossItems; + +import androidx.test.filters.MediumTest; /** * Test that ListView will override default behavior of focus searching to diff --git a/core/tests/coretests/src/android/widget/listview/focus/ListHorizontalFocusWithinItemWinsTest.java b/core/tests/coretests/src/android/widget/listview/focus/ListHorizontalFocusWithinItemWinsTest.java index edc60b58e9d0..544895279e6d 100644 --- a/core/tests/coretests/src/android/widget/listview/focus/ListHorizontalFocusWithinItemWinsTest.java +++ b/core/tests/coretests/src/android/widget/listview/focus/ListHorizontalFocusWithinItemWinsTest.java @@ -17,12 +17,13 @@ package android.widget.listview.focus; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.view.KeyEvent; import android.widget.Button; import android.widget.ListView; import android.widget.listview.ListHorizontalFocusWithinItemWins; +import androidx.test.filters.MediumTest; + public class ListHorizontalFocusWithinItemWinsTest extends ActivityInstrumentationTestCase<ListHorizontalFocusWithinItemWins> { private ListView mListView; diff --git a/core/tests/coretests/src/android/widget/listview/focus/ListWithEditTextHeaderTest.java b/core/tests/coretests/src/android/widget/listview/focus/ListWithEditTextHeaderTest.java index b449b61baf83..0b17aaf4792c 100644 --- a/core/tests/coretests/src/android/widget/listview/focus/ListWithEditTextHeaderTest.java +++ b/core/tests/coretests/src/android/widget/listview/focus/ListWithEditTextHeaderTest.java @@ -17,17 +17,18 @@ package android.widget.listview.focus; import android.test.ActivityInstrumentationTestCase2; -import android.test.FlakyTest; import android.test.TouchUtils; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.Suppress; import android.view.KeyEvent; import android.view.View; import android.widget.AbsListView; import android.widget.ListView; import android.widget.listview.ListWithEditTextHeader; +import androidx.test.filters.FlakyTest; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; + public class ListWithEditTextHeaderTest extends ActivityInstrumentationTestCase2<ListWithEditTextHeader> { private ListView mListView; @@ -49,7 +50,7 @@ public class ListWithEditTextHeaderTest extends ActivityInstrumentationTestCase2 assertTrue("header does not have focus", mListView.getChildAt(0).isFocused()); } - @FlakyTest(tolerance=2) + @FlakyTest @LargeTest public void testClickingHeaderKeepsFocus() { TouchUtils.clickView(this, mListView.getChildAt(0)); diff --git a/core/tests/coretests/src/android/widget/listview/touch/ListGetSelectedViewTest.java b/core/tests/coretests/src/android/widget/listview/touch/ListGetSelectedViewTest.java index 28f899edc9b6..262d0f4ba42f 100644 --- a/core/tests/coretests/src/android/widget/listview/touch/ListGetSelectedViewTest.java +++ b/core/tests/coretests/src/android/widget/listview/touch/ListGetSelectedViewTest.java @@ -17,14 +17,14 @@ package android.widget.listview.touch; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; import android.test.TouchUtils; -import android.widget.ListView; import android.view.View; - +import android.widget.ListView; import android.widget.listview.ListGetSelectedView; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; + /** * This test is made to check that getSelectedView() will return * null in touch mode. diff --git a/core/tests/coretests/src/android/widget/listview/touch/ListOfTouchablesTest.java b/core/tests/coretests/src/android/widget/listview/touch/ListOfTouchablesTest.java index ffa9a5e79543..48e8c5e24946 100644 --- a/core/tests/coretests/src/android/widget/listview/touch/ListOfTouchablesTest.java +++ b/core/tests/coretests/src/android/widget/listview/touch/ListOfTouchablesTest.java @@ -17,15 +17,14 @@ package android.widget.listview.touch; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; +import android.test.TouchUtils; import android.view.Gravity; import android.view.View; import android.view.ViewConfiguration; import android.widget.ListView; - import android.widget.listview.ListOfTouchables; -import android.test.TouchUtils; + +import androidx.test.filters.MediumTest; /** * Touch tests for a list where all of the items fit on the screen. diff --git a/core/tests/coretests/src/android/widget/listview/touch/ListSetSelectionTest.java b/core/tests/coretests/src/android/widget/listview/touch/ListSetSelectionTest.java index aed513a0721b..716683ab52ad 100644 --- a/core/tests/coretests/src/android/widget/listview/touch/ListSetSelectionTest.java +++ b/core/tests/coretests/src/android/widget/listview/touch/ListSetSelectionTest.java @@ -17,15 +17,15 @@ package android.widget.listview.touch; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; import android.test.TouchUtils; -import android.test.suitebuilder.annotation.Suppress; import android.view.View; import android.widget.ListView; - import android.widget.listview.ListSimple; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; + /** * Tests setting the selection in touch mode */ diff --git a/core/tests/coretests/src/android/widget/listview/touch/ListTouchBottomGravityManyTest.java b/core/tests/coretests/src/android/widget/listview/touch/ListTouchBottomGravityManyTest.java index 7daf64e0a596..6a1f076ea2c3 100644 --- a/core/tests/coretests/src/android/widget/listview/touch/ListTouchBottomGravityManyTest.java +++ b/core/tests/coretests/src/android/widget/listview/touch/ListTouchBottomGravityManyTest.java @@ -17,16 +17,16 @@ package android.widget.listview.touch; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; import android.test.TouchUtils; import android.view.Gravity; import android.view.View; import android.view.ViewConfiguration; import android.widget.ListView; - import android.widget.listview.ListBottomGravityMany; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; + /** * Touch tests for a list where all of the items do not fit on the screen, and the list * stacks from the bottom. diff --git a/core/tests/coretests/src/android/widget/listview/touch/ListTouchBottomGravityTest.java b/core/tests/coretests/src/android/widget/listview/touch/ListTouchBottomGravityTest.java index 4086cf094ab9..89498d6632b9 100644 --- a/core/tests/coretests/src/android/widget/listview/touch/ListTouchBottomGravityTest.java +++ b/core/tests/coretests/src/android/widget/listview/touch/ListTouchBottomGravityTest.java @@ -17,13 +17,13 @@ package android.widget.listview.touch; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.test.TouchUtils; import android.view.View; import android.widget.ListView; - import android.widget.listview.ListBottomGravity; +import androidx.test.filters.MediumTest; + /** * Touch tests for a list where all of the items fit on the screen, and the list * stacks from the bottom. diff --git a/core/tests/coretests/src/android/widget/listview/touch/ListTouchManyTest.java b/core/tests/coretests/src/android/widget/listview/touch/ListTouchManyTest.java index 30d56caee7f6..c7f23714f3ba 100644 --- a/core/tests/coretests/src/android/widget/listview/touch/ListTouchManyTest.java +++ b/core/tests/coretests/src/android/widget/listview/touch/ListTouchManyTest.java @@ -17,16 +17,16 @@ package android.widget.listview.touch; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; import android.test.TouchUtils; import android.view.Gravity; import android.view.View; import android.view.ViewConfiguration; import android.widget.ListView; - import android.widget.listview.ListTopGravityMany; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; + /** * Touch tests for a list where all of the items do not fit on the screen. */ diff --git a/core/tests/coretests/src/android/widget/listview/touch/ListTouchTest.java b/core/tests/coretests/src/android/widget/listview/touch/ListTouchTest.java index 5b064b3e770d..8a557aba700e 100644 --- a/core/tests/coretests/src/android/widget/listview/touch/ListTouchTest.java +++ b/core/tests/coretests/src/android/widget/listview/touch/ListTouchTest.java @@ -17,13 +17,13 @@ package android.widget.listview.touch; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.test.TouchUtils; import android.view.View; import android.widget.ListView; - import android.widget.listview.ListTopGravity; +import androidx.test.filters.MediumTest; + /** * Touch tests for a list where all of the items fit on the screen. */ diff --git a/core/tests/coretests/src/android/widget/scroll/ButtonAboveTallInternalSelectionView.java b/core/tests/coretests/src/android/widget/scroll/ButtonAboveTallInternalSelectionView.java index a7f5c0560a4e..a30985bfaf87 100644 --- a/core/tests/coretests/src/android/widget/scroll/ButtonAboveTallInternalSelectionView.java +++ b/core/tests/coretests/src/android/widget/scroll/ButtonAboveTallInternalSelectionView.java @@ -18,7 +18,6 @@ package android.widget.scroll; import android.util.InternalSelectionView; import android.util.ScrollViewScenario; - import android.widget.Button; /** diff --git a/core/tests/coretests/src/android/widget/scroll/ButtonAboveTallInternalSelectionViewTest.java b/core/tests/coretests/src/android/widget/scroll/ButtonAboveTallInternalSelectionViewTest.java index 8123228c5228..825aa1aa85a3 100644 --- a/core/tests/coretests/src/android/widget/scroll/ButtonAboveTallInternalSelectionViewTest.java +++ b/core/tests/coretests/src/android/widget/scroll/ButtonAboveTallInternalSelectionViewTest.java @@ -16,14 +16,13 @@ package android.widget.scroll; -import android.test.suitebuilder.annotation.Suppress; -import android.widget.scroll.ButtonAboveTallInternalSelectionView; -import android.util.InternalSelectionView; - import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; +import android.util.InternalSelectionView; import android.view.KeyEvent; +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; + @Suppress // Failing. public class ButtonAboveTallInternalSelectionViewTest extends ActivityInstrumentationTestCase<ButtonAboveTallInternalSelectionView> { diff --git a/core/tests/coretests/src/android/widget/scroll/ButtonsWithTallTextViewInBetween.java b/core/tests/coretests/src/android/widget/scroll/ButtonsWithTallTextViewInBetween.java index 3d5f86d35b07..47d36ddf9be1 100644 --- a/core/tests/coretests/src/android/widget/scroll/ButtonsWithTallTextViewInBetween.java +++ b/core/tests/coretests/src/android/widget/scroll/ButtonsWithTallTextViewInBetween.java @@ -17,7 +17,6 @@ package android.widget.scroll; import android.util.ScrollViewScenario; - import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; diff --git a/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisible.java b/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisible.java index afc275f25181..dba07a086e89 100644 --- a/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisible.java +++ b/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisible.java @@ -16,15 +16,15 @@ package android.widget.scroll; -import com.android.frameworks.coretests.R; - import android.app.Activity; -import android.os.Bundle; import android.graphics.Rect; +import android.os.Bundle; import android.view.View; import android.widget.ScrollView; import android.widget.TextView; +import com.android.frameworks.coretests.R; + /** * A screen with some scenarios that exercise {@link ScrollView}'s implementation * of {@link android.view.ViewGroup#requestChildRectangleOnScreen}: diff --git a/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleTest.java b/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleTest.java index f8abdb2c8ec1..7c3df910a547 100644 --- a/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleTest.java +++ b/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleTest.java @@ -16,19 +16,19 @@ package android.widget.scroll; -import android.test.suitebuilder.annotation.Suppress; -import android.widget.scroll.RequestRectangleVisible; -import com.android.frameworks.coretests.R; - import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; import android.test.ViewAsserts; +import android.view.KeyEvent; +import android.view.View; import android.widget.Button; import android.widget.ScrollView; import android.widget.TextView; -import android.view.View; -import android.view.KeyEvent; + +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; + +import com.android.frameworks.coretests.R; /** * {@link RequestRectangleVisible} is set up to exercise the cases of moving a diff --git a/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleWithInternalScroll.java b/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleWithInternalScroll.java index 731b25a08926..105686ad7a92 100644 --- a/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleWithInternalScroll.java +++ b/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleWithInternalScroll.java @@ -16,15 +16,14 @@ package android.widget.scroll; -import com.android.frameworks.coretests.R; - import android.app.Activity; +import android.graphics.Rect; import android.os.Bundle; -import android.widget.EditText; -import android.widget.TextView; -import android.widget.Button; import android.view.View; -import android.graphics.Rect; +import android.widget.Button; +import android.widget.TextView; + +import com.android.frameworks.coretests.R; public class RequestRectangleVisibleWithInternalScroll extends Activity { diff --git a/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleWithInternalScrollTest.java b/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleWithInternalScrollTest.java index 5e9b520a9ec2..1a221ff63863 100644 --- a/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleWithInternalScrollTest.java +++ b/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleWithInternalScrollTest.java @@ -16,16 +16,17 @@ package android.widget.scroll; -import com.android.frameworks.coretests.R; - import android.test.ActivityInstrumentationTestCase; import android.test.ViewAsserts; -import android.test.suitebuilder.annotation.Suppress; import android.view.KeyEvent; import android.widget.Button; import android.widget.ScrollView; import android.widget.TextView; +import androidx.test.filters.Suppress; + +import com.android.frameworks.coretests.R; + /** * This is suppressed because {@link TextView#scrollBy} isn't working. */ diff --git a/core/tests/coretests/src/android/widget/scroll/ScrollViewButtonsAndLabels.java b/core/tests/coretests/src/android/widget/scroll/ScrollViewButtonsAndLabels.java index 027ea0f83350..92a315296064 100644 --- a/core/tests/coretests/src/android/widget/scroll/ScrollViewButtonsAndLabels.java +++ b/core/tests/coretests/src/android/widget/scroll/ScrollViewButtonsAndLabels.java @@ -16,15 +16,14 @@ package android.widget.scroll; -import com.android.frameworks.coretests.R; - import android.app.Activity; import android.os.Bundle; +import android.widget.Button; import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.TextView; -import android.widget.Button; +import com.android.frameworks.coretests.R; /** * Basic scroll view example diff --git a/core/tests/coretests/src/android/widget/scroll/ScrollViewButtonsAndLabelsTest.java b/core/tests/coretests/src/android/widget/scroll/ScrollViewButtonsAndLabelsTest.java index 3fd17ee51abf..8d71f84d8f7d 100644 --- a/core/tests/coretests/src/android/widget/scroll/ScrollViewButtonsAndLabelsTest.java +++ b/core/tests/coretests/src/android/widget/scroll/ScrollViewButtonsAndLabelsTest.java @@ -17,14 +17,14 @@ package android.widget.scroll; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.Suppress; import android.view.KeyEvent; import android.widget.Button; import android.widget.LinearLayout; import android.widget.ScrollView; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; public class ScrollViewButtonsAndLabelsTest extends ActivityInstrumentationTestCase<ScrollViewButtonsAndLabels> { diff --git a/core/tests/coretests/src/android/widget/scroll/ShortButtons.java b/core/tests/coretests/src/android/widget/scroll/ShortButtons.java index 3a0f29a530ee..90ede7d35511 100644 --- a/core/tests/coretests/src/android/widget/scroll/ShortButtons.java +++ b/core/tests/coretests/src/android/widget/scroll/ShortButtons.java @@ -17,7 +17,6 @@ package android.widget.scroll; import android.util.ScrollViewScenario; - import android.widget.Button; import android.widget.LinearLayout; diff --git a/core/tests/coretests/src/android/widget/scroll/arrowscroll/ButtonsWithTallTextViewInBetweenTest.java b/core/tests/coretests/src/android/widget/scroll/arrowscroll/ButtonsWithTallTextViewInBetweenTest.java index 56d7ed2c3243..04f5ac84bd2a 100644 --- a/core/tests/coretests/src/android/widget/scroll/arrowscroll/ButtonsWithTallTextViewInBetweenTest.java +++ b/core/tests/coretests/src/android/widget/scroll/arrowscroll/ButtonsWithTallTextViewInBetweenTest.java @@ -16,16 +16,16 @@ package android.widget.scroll.arrowscroll; -import android.widget.scroll.ButtonsWithTallTextViewInBetween; - import android.graphics.Rect; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.view.KeyEvent; import android.view.View; import android.widget.Button; import android.widget.ScrollView; import android.widget.TextView; +import android.widget.scroll.ButtonsWithTallTextViewInBetween; + +import androidx.test.filters.MediumTest; public class ButtonsWithTallTextViewInBetweenTest extends ActivityInstrumentationTestCase<ButtonsWithTallTextViewInBetween> { diff --git a/core/tests/coretests/src/android/widget/scroll/arrowscroll/MultiPageTextWithPaddingTest.java b/core/tests/coretests/src/android/widget/scroll/arrowscroll/MultiPageTextWithPaddingTest.java index 6ce4c1508213..2f4509827592 100644 --- a/core/tests/coretests/src/android/widget/scroll/arrowscroll/MultiPageTextWithPaddingTest.java +++ b/core/tests/coretests/src/android/widget/scroll/arrowscroll/MultiPageTextWithPaddingTest.java @@ -16,14 +16,14 @@ package android.widget.scroll.arrowscroll; -import android.test.suitebuilder.annotation.Suppress; -import android.widget.scroll.arrowscroll.MultiPageTextWithPadding; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; import android.view.KeyEvent; -import android.widget.TextView; import android.widget.ScrollView; +import android.widget.TextView; + +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; +import androidx.test.filters.Suppress; @Suppress // Flaky public class MultiPageTextWithPaddingTest extends diff --git a/core/tests/coretests/src/android/widget/scroll/arrowscroll/ShortButtonsTest.java b/core/tests/coretests/src/android/widget/scroll/arrowscroll/ShortButtonsTest.java index 267d8ee4a250..a2928cb78e0c 100644 --- a/core/tests/coretests/src/android/widget/scroll/arrowscroll/ShortButtonsTest.java +++ b/core/tests/coretests/src/android/widget/scroll/arrowscroll/ShortButtonsTest.java @@ -16,15 +16,15 @@ package android.widget.scroll.arrowscroll; -import android.widget.scroll.ShortButtons; - import android.graphics.Rect; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; import android.view.KeyEvent; import android.widget.Button; import android.widget.ScrollView; +import android.widget.scroll.ShortButtons; + +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; public class ShortButtonsTest extends ActivityInstrumentationTestCase<ShortButtons> { diff --git a/core/tests/coretests/src/android/widget/scroll/arrowscroll/TallTextAboveButtonTest.java b/core/tests/coretests/src/android/widget/scroll/arrowscroll/TallTextAboveButtonTest.java index 5351839e868f..0681081f7452 100644 --- a/core/tests/coretests/src/android/widget/scroll/arrowscroll/TallTextAboveButtonTest.java +++ b/core/tests/coretests/src/android/widget/scroll/arrowscroll/TallTextAboveButtonTest.java @@ -16,13 +16,13 @@ package android.widget.scroll.arrowscroll; -import android.widget.scroll.TallTextAboveButton; - import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.view.KeyEvent; import android.widget.ScrollView; import android.widget.TextView; +import android.widget.scroll.TallTextAboveButton; + +import androidx.test.filters.MediumTest; public class TallTextAboveButtonTest extends ActivityInstrumentationTestCase<TallTextAboveButton> { private ScrollView mScrollView; diff --git a/core/tests/coretests/src/android/widget/touchmode/ChangeTouchModeTest.java b/core/tests/coretests/src/android/widget/touchmode/ChangeTouchModeTest.java index 449c95cc81fe..aa20c9b65f2e 100644 --- a/core/tests/coretests/src/android/widget/touchmode/ChangeTouchModeTest.java +++ b/core/tests/coretests/src/android/widget/touchmode/ChangeTouchModeTest.java @@ -16,16 +16,17 @@ package android.widget.touchmode; -import android.widget.layout.linear.LLOfButtons1; -import android.widget.layout.linear.LLOfButtons2; import static android.util.TouchModeFlexibleAsserts.assertInTouchModeAfterClick; -import static android.util.TouchModeFlexibleAsserts.assertNotInTouchModeAfterKey; import static android.util.TouchModeFlexibleAsserts.assertInTouchModeAfterTap; +import static android.util.TouchModeFlexibleAsserts.assertNotInTouchModeAfterKey; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; import android.view.KeyEvent; +import android.widget.layout.linear.LLOfButtons1; +import android.widget.layout.linear.LLOfButtons2; + +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; /** * Tests that the touch mode changes from various events, and that the state diff --git a/core/tests/coretests/src/android/widget/touchmode/FocusableInTouchModeClickTest.java b/core/tests/coretests/src/android/widget/touchmode/FocusableInTouchModeClickTest.java index 691b25a51b8a..97c982f3cbfd 100644 --- a/core/tests/coretests/src/android/widget/touchmode/FocusableInTouchModeClickTest.java +++ b/core/tests/coretests/src/android/widget/touchmode/FocusableInTouchModeClickTest.java @@ -16,12 +16,12 @@ package android.widget.touchmode; -import android.widget.layout.linear.LLOfTwoFocusableInTouchMode; - import android.test.ActivityInstrumentationTestCase2; import android.test.TouchUtils; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; +import android.widget.layout.linear.LLOfTwoFocusableInTouchMode; + +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; public class FocusableInTouchModeClickTest extends ActivityInstrumentationTestCase2<LLOfTwoFocusableInTouchMode> { diff --git a/core/tests/coretests/src/android/widget/touchmode/StartInTouchWithViewInFocusTest.java b/core/tests/coretests/src/android/widget/touchmode/StartInTouchWithViewInFocusTest.java index 5339188ae89a..88aa9caa31b6 100644 --- a/core/tests/coretests/src/android/widget/touchmode/StartInTouchWithViewInFocusTest.java +++ b/core/tests/coretests/src/android/widget/touchmode/StartInTouchWithViewInFocusTest.java @@ -16,14 +16,15 @@ package android.widget.touchmode; -import android.widget.layout.linear.LLEditTextThenButton; import static android.util.TouchModeFlexibleAsserts.assertNotInTouchModeAfterKey; import android.test.ActivityInstrumentationTestCase2; -import android.test.suitebuilder.annotation.MediumTest; import android.view.KeyEvent; import android.widget.Button; import android.widget.EditText; +import android.widget.layout.linear.LLEditTextThenButton; + +import androidx.test.filters.MediumTest; public class StartInTouchWithViewInFocusTest extends ActivityInstrumentationTestCase2<LLEditTextThenButton> { diff --git a/core/tests/coretests/src/android/widget/touchmode/TouchModeFocusChangeTest.java b/core/tests/coretests/src/android/widget/touchmode/TouchModeFocusChangeTest.java index 5a6110c08116..f192f6815163 100644 --- a/core/tests/coretests/src/android/widget/touchmode/TouchModeFocusChangeTest.java +++ b/core/tests/coretests/src/android/widget/touchmode/TouchModeFocusChangeTest.java @@ -21,11 +21,11 @@ import static android.util.TouchModeFlexibleAsserts.assertInTouchModeAfterTap; import static android.util.TouchModeFlexibleAsserts.assertNotInTouchModeAfterKey; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; import android.view.KeyEvent; import android.widget.Button; import android.widget.layout.linear.LLOfButtons1; +import androidx.test.filters.MediumTest; /** * Make sure focus isn't kept by buttons when entering touch mode. diff --git a/core/tests/coretests/src/android/widget/touchmode/TouchModeFocusableTest.java b/core/tests/coretests/src/android/widget/touchmode/TouchModeFocusableTest.java index 3ddeef072a9e..87f33a4cc803 100644 --- a/core/tests/coretests/src/android/widget/touchmode/TouchModeFocusableTest.java +++ b/core/tests/coretests/src/android/widget/touchmode/TouchModeFocusableTest.java @@ -20,12 +20,13 @@ import static android.util.TouchModeFlexibleAsserts.assertInTouchModeAfterClick; import static android.util.TouchModeFlexibleAsserts.assertInTouchModeAfterTap; import android.test.ActivityInstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; import android.widget.Button; import android.widget.EditText; import android.widget.layout.linear.LLEditTextThenButton; +import androidx.test.filters.LargeTest; +import androidx.test.filters.MediumTest; + /** * Some views, like edit texts, can keep and gain focus even when in touch mode. */ diff --git a/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java b/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java index a302657c7ede..aadfcbc84f76 100644 --- a/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java +++ b/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java @@ -57,7 +57,6 @@ import android.os.Vibrator; import android.provider.Settings; import android.speech.tts.TextToSpeech; import android.speech.tts.Voice; -import android.support.test.runner.AndroidJUnit4; import android.test.mock.MockContentResolver; import android.text.TextUtils; import android.view.Window; @@ -66,6 +65,8 @@ import android.view.accessibility.AccessibilityManager; import android.view.accessibility.IAccessibilityManager; import android.widget.Toast; +import androidx.test.runner.AndroidJUnit4; + import com.android.internal.R; import com.android.internal.accessibility.AccessibilityShortcutController.FrameworkObjectProvider; import com.android.internal.util.test.FakeSettingsProvider; diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java index 1859378e4c1f..aaa624e6b25e 100644 --- a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java +++ b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java @@ -16,41 +16,41 @@ package com.android.internal.app; -import com.android.internal.R; -import com.android.internal.app.ResolverActivity.ResolvedComponentInfo; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; - -import android.app.usage.UsageStats; -import android.app.usage.UsageStatsManager; -import android.content.Intent; -import android.content.pm.ResolveInfo; -import android.os.UserHandle; -import android.support.test.InstrumentationRegistry; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - import static android.support.test.espresso.Espresso.onView; import static android.support.test.espresso.action.ViewActions.click; import static android.support.test.espresso.assertion.ViewAssertions.matches; import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; import static android.support.test.espresso.matcher.ViewMatchers.withId; import static android.support.test.espresso.matcher.ViewMatchers.withText; + import static com.android.internal.app.ChooserWrapperActivity.sOverrides; + import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.MatcherAssert.assertThat; -import static org.mockito.Mockito.when; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.app.usage.UsageStatsManager; +import android.content.Intent; +import android.content.pm.ResolveInfo; + +import androidx.test.InstrumentationRegistry; +import androidx.test.rule.ActivityTestRule; +import androidx.test.runner.AndroidJUnit4; + +import com.android.internal.R; +import com.android.internal.app.ResolverActivity.ResolvedComponentInfo; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; + +import java.util.ArrayList; +import java.util.List; /** * Chooser activity instrumentation tests diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java b/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java index c446f3c79ea8..60529f6d4071 100644 --- a/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java +++ b/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java @@ -16,14 +16,14 @@ package com.android.internal.app; +import static org.mockito.Mockito.mock; + import android.app.usage.UsageStatsManager; import android.content.Context; import android.content.pm.PackageManager; import java.util.function.Function; -import static org.mockito.Mockito.mock; - public class ChooserWrapperActivity extends ChooserActivity { /* * Simple wrapper around chooser activity to be able to initiate it under test diff --git a/core/tests/coretests/src/com/android/internal/app/IntentForwarderActivityTest.java b/core/tests/coretests/src/com/android/internal/app/IntentForwarderActivityTest.java index cfb6bdd5d613..9b13af2a4357 100644 --- a/core/tests/coretests/src/com/android/internal/app/IntentForwarderActivityTest.java +++ b/core/tests/coretests/src/com/android/internal/app/IntentForwarderActivityTest.java @@ -46,9 +46,10 @@ import android.os.IBinder; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; -import android.support.test.InstrumentationRegistry; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.rule.ActivityTestRule; +import androidx.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Rule; diff --git a/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java b/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java index 404c99c82a4c..fe2fb8530cf6 100644 --- a/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java +++ b/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java @@ -16,6 +16,29 @@ package com.android.internal.app; +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.action.ViewActions.click; +import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.ViewMatchers.isEnabled; +import static android.support.test.espresso.matcher.ViewMatchers.withId; +import static android.support.test.espresso.matcher.ViewMatchers.withText; + +import static com.android.internal.app.ResolverWrapperActivity.sOverrides; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.when; + +import android.content.Intent; +import android.content.pm.ResolveInfo; +import android.view.View; +import android.widget.RelativeLayout; + +import androidx.test.InstrumentationRegistry; +import androidx.test.rule.ActivityTestRule; +import androidx.test.runner.AndroidJUnit4; + import com.android.internal.R; import com.android.internal.app.ResolverActivity.ResolvedComponentInfo; import com.android.internal.widget.ResolverDrawerLayout; @@ -26,37 +49,8 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; -import android.app.usage.UsageStats; -import android.app.usage.UsageStatsManager; -import android.content.Intent; -import android.content.pm.ResolveInfo; -import android.os.UserHandle; -import android.support.test.InstrumentationRegistry; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; -import android.view.View; -import android.widget.RelativeLayout; - import java.util.ArrayList; import java.util.List; -import java.util.Map; - -import static android.os.SystemClock.sleep; -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.action.ViewActions.click; -import static android.support.test.espresso.assertion.ViewAssertions.matches; -import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; -import static android.support.test.espresso.matcher.ViewMatchers.isEnabled; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static android.support.test.espresso.matcher.ViewMatchers.withText; -import static com.android.internal.app.ResolverWrapperActivity.sOverrides; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; /** * Resolver activity instrumentation tests diff --git a/core/tests/coretests/src/com/android/internal/app/ResolverDataProvider.java b/core/tests/coretests/src/com/android/internal/app/ResolverDataProvider.java index c710b9ad77bf..850b466ec755 100644 --- a/core/tests/coretests/src/com/android/internal/app/ResolverDataProvider.java +++ b/core/tests/coretests/src/com/android/internal/app/ResolverDataProvider.java @@ -23,10 +23,6 @@ import android.content.pm.ApplicationInfo; import android.content.pm.ResolveInfo; import android.os.UserHandle; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; - /** * Utility class used by resolver tests to create mock data */ diff --git a/core/tests/coretests/src/com/android/internal/app/ResolverListControllerTest.java b/core/tests/coretests/src/com/android/internal/app/ResolverListControllerTest.java index 284ab605c3b5..fcec00e34278 100644 --- a/core/tests/coretests/src/com/android/internal/app/ResolverListControllerTest.java +++ b/core/tests/coretests/src/com/android/internal/app/ResolverListControllerTest.java @@ -25,34 +25,31 @@ import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.when; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import org.mockito.invocation.InvocationOnMock; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; -import org.mockito.stubbing.Answer; - import android.app.usage.IUsageStatsManager; import android.app.usage.UsageStats; import android.app.usage.UsageStatsManager; import android.content.Context; +import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ParceledListSlice; import android.content.pm.ResolveInfo; import android.content.res.Configuration; import android.content.res.Resources; -import android.content.Intent; import android.os.RemoteException; import android.os.UserHandle; -import android.support.test.runner.AndroidJUnit4; import android.util.ArrayMap; -import java.io.File; +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; + import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; diff --git a/core/tests/coretests/src/com/android/internal/app/ResolverWrapperActivity.java b/core/tests/coretests/src/com/android/internal/app/ResolverWrapperActivity.java index 163211e10e6a..83f6bc2e8bf3 100644 --- a/core/tests/coretests/src/com/android/internal/app/ResolverWrapperActivity.java +++ b/core/tests/coretests/src/com/android/internal/app/ResolverWrapperActivity.java @@ -16,18 +16,13 @@ package com.android.internal.app; +import static org.mockito.Mockito.mock; + import android.app.usage.UsageStatsManager; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; import android.content.pm.PackageManager; -import android.os.RemoteException; import java.util.function.Function; -import static org.mockito.Mockito.mock; - - /* * Simple wrapper around chooser activity to be able to initiate it under test */ diff --git a/core/tests/coretests/src/com/android/internal/app/WindowDecorActionBarTest.java b/core/tests/coretests/src/com/android/internal/app/WindowDecorActionBarTest.java index 472958a01eb4..87ad124fe04b 100644 --- a/core/tests/coretests/src/com/android/internal/app/WindowDecorActionBarTest.java +++ b/core/tests/coretests/src/com/android/internal/app/WindowDecorActionBarTest.java @@ -17,12 +17,13 @@ package com.android.internal.app; import android.test.ActivityInstrumentationTestCase2; -import android.test.UiThreadTest; -import android.test.suitebuilder.annotation.SmallTest; import android.view.ActionMode; import android.view.Menu; import android.view.MenuItem; +import androidx.test.annotation.UiThreadTest; +import androidx.test.filters.SmallTest; + /** * Tests for {@link WindowDecorActionBar}. */ diff --git a/core/tests/coretests/src/com/android/internal/app/procstats/SparseMappingTableTest.java b/core/tests/coretests/src/com/android/internal/app/procstats/SparseMappingTableTest.java index 115af5e0ea5d..f7fea3b7a6d0 100644 --- a/core/tests/coretests/src/com/android/internal/app/procstats/SparseMappingTableTest.java +++ b/core/tests/coretests/src/com/android/internal/app/procstats/SparseMappingTableTest.java @@ -16,20 +16,14 @@ package com.android.internal.app.procstats; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.ArrayList; - -import android.os.BatteryStats; import android.os.Parcel; -import android.test.suitebuilder.annotation.SmallTest; import android.util.Log; +import androidx.test.filters.SmallTest; + import junit.framework.Assert; import junit.framework.TestCase; -import org.mockito.Mockito; - /** * Provides test cases for SparseMappingTable. */ diff --git a/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodDebugTest.java b/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodDebugTest.java index 629f7b60471c..222e494de7d4 100644 --- a/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodDebugTest.java +++ b/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodDebugTest.java @@ -18,10 +18,11 @@ package com.android.internal.inputmethod; import static org.junit.Assert.assertEquals; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.view.WindowManager.LayoutParams; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/com/android/internal/inputmethod/SubtypeLocaleUtilsTest.java b/core/tests/coretests/src/com/android/internal/inputmethod/SubtypeLocaleUtilsTest.java index 8179328c32c4..ba6390808151 100644 --- a/core/tests/coretests/src/com/android/internal/inputmethod/SubtypeLocaleUtilsTest.java +++ b/core/tests/coretests/src/com/android/internal/inputmethod/SubtypeLocaleUtilsTest.java @@ -18,8 +18,8 @@ package com.android.internal.inputmethod; import static org.junit.Assert.assertEquals; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java index 992b46f96339..b6878013b254 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java @@ -13,6 +13,7 @@ * License for the specific language governing permissions and limitations under * the License. */ + package com.android.internal.os; import static android.os.BatteryStats.STATS_SINCE_CHARGED; @@ -20,10 +21,11 @@ import static android.os.BatteryStats.STATS_SINCE_CHARGED; import android.app.ActivityManager; import android.os.BatteryStats; import android.os.WorkSource; -import android.support.test.filters.SmallTest; import android.util.ArrayMap; import android.view.Display; +import androidx.test.filters.SmallTest; + import junit.framework.TestCase; /** diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsCounterTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsCounterTest.java index 08f8dd146516..37f818a70ec9 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsCounterTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsCounterTest.java @@ -13,11 +13,13 @@ * License for the specific language governing permissions and limitations under * the License. */ + package com.android.internal.os; import android.os.BatteryStats; import android.os.Parcel; -import android.support.test.filters.SmallTest; + +import androidx.test.filters.SmallTest; import junit.framework.TestCase; diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsCpuTimesTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsCpuTimesTest.java index ee8d5081b0b3..0179eadae6a1 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsCpuTimesTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsCpuTimesTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.android.internal.os; import static android.os.BatteryStats.STATS_SINCE_CHARGED; @@ -36,11 +37,12 @@ import static org.mockito.Mockito.when; import android.os.BatteryStats; import android.os.UserHandle; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.util.SparseLongArray; import android.view.Display; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import com.android.internal.util.ArrayUtils; import org.junit.Before; @@ -64,7 +66,7 @@ import java.util.Arrays; * Install: adb install -r \ * ${ANDROID_PRODUCT_OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk * Run: adb shell am instrument -e class com.android.internal.os.BatteryStatsCpuTimesTest -w \ - * com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner + * com.android.frameworks.coretests/androidx.test.runner.AndroidJUnitRunner * * or * diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsDualTimerTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsDualTimerTest.java index 3a5a9f5bc67a..efb871027830 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsDualTimerTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsDualTimerTest.java @@ -13,10 +13,12 @@ * License for the specific language governing permissions and limitations under * the License. */ + package com.android.internal.os; import android.os.BatteryStats; -import android.support.test.filters.SmallTest; + +import androidx.test.filters.SmallTest; import junit.framework.TestCase; diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsDurationTimerTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsDurationTimerTest.java index 19dab7961401..a42286f6882f 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsDurationTimerTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsDurationTimerTest.java @@ -13,11 +13,13 @@ * License for the specific language governing permissions and limitations under * the License. */ + package com.android.internal.os; import android.os.BatteryStats; import android.os.Parcel; -import android.support.test.filters.SmallTest; + +import androidx.test.filters.SmallTest; import junit.framework.TestCase; diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsHelperTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsHelperTest.java index 7467114a7596..355601ca05ed 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsHelperTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsHelperTest.java @@ -17,7 +17,6 @@ package com.android.internal.os; - import static android.os.BatteryStats.Uid.PROCESS_STATE_TOP; import static com.google.common.truth.Truth.assertThat; @@ -37,12 +36,13 @@ import android.content.Context; import android.content.pm.PackageManager; import android.os.BatteryStats; import android.os.Process; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.text.format.DateUtils; import android.util.StatsLog; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import junit.framework.TestCase; import org.junit.Before; diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsHistoryTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsHistoryTest.java index 10a318920646..cc0ddb7bf8a4 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsHistoryTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsHistoryTest.java @@ -13,18 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.android.internal.os; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.junit.Assert.assertEquals; - import android.content.Context; import android.os.Parcel; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.LargeTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java index 613de45173d6..dc9367557f9f 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.android.internal.os; import static android.os.BatteryStats.STATS_SINCE_CHARGED; @@ -31,12 +32,13 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.when; import android.os.BatteryStats; -import android.support.test.filters.LargeTest; -import android.support.test.runner.AndroidJUnit4; import android.util.SparseArray; import android.util.SparseIntArray; import android.view.Display; +import androidx.test.filters.LargeTest; +import androidx.test.runner.AndroidJUnit4; + import com.android.internal.util.ArrayUtils; import org.junit.Before; diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java index 8cbe5d68d554..3e33273feddb 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java @@ -13,6 +13,7 @@ * License for the specific language governing permissions and limitations under * the License. */ + package com.android.internal.os; import static android.os.BatteryStats.STATS_CURRENT; @@ -20,21 +21,20 @@ import static android.os.BatteryStats.STATS_SINCE_CHARGED; import static android.os.BatteryStats.WAKE_TYPE_PARTIAL; import android.app.ActivityManager; -import android.os.BatteryManager; import android.os.BatteryStats; import android.os.BatteryStats.HistoryItem; import android.os.BatteryStats.Uid.Sensor; import android.os.WorkSource; -import android.support.test.filters.SmallTest; import android.view.Display; +import androidx.test.filters.SmallTest; + import com.android.internal.os.BatteryStatsImpl.DualTimer; import com.android.internal.os.BatteryStatsImpl.Uid; + import junit.framework.TestCase; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; import java.util.Map; /** @@ -47,7 +47,7 @@ import java.util.Map; * Install: adb install -r \ * ${ANDROID_PRODUCT_OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk * Run: adb shell am instrument -e class com.android.internal.os.BatteryStatsNoteTest -w \ - * com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner + * com.android.frameworks.coretests/androidx.test.runner.AndroidJUnitRunner */ public class BatteryStatsNoteTest extends TestCase { diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsSamplingTimerTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsSamplingTimerTest.java index 251ceb04b973..61d20dfb32d9 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsSamplingTimerTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsSamplingTimerTest.java @@ -13,11 +13,13 @@ * License for the specific language governing permissions and limitations under * the License. */ + package com.android.internal.os; import android.os.BatteryStats; import android.os.Parcel; -import android.support.test.filters.SmallTest; + +import androidx.test.filters.SmallTest; import junit.framework.TestCase; diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java index a751f9060588..b851f0ad3414 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java @@ -13,13 +13,15 @@ * License for the specific language governing permissions and limitations under * the License. */ + package com.android.internal.os; import android.app.ActivityManager; import android.os.BatteryStats; -import android.support.test.filters.SmallTest; import android.view.Display; +import androidx.test.filters.SmallTest; + import junit.framework.TestCase; /** diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsServTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsServTest.java index 5fd822549ff8..b9995c443f35 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsServTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsServTest.java @@ -18,7 +18,8 @@ package com.android.internal.os; import android.os.BatteryStats; import android.os.Parcel; -import android.support.test.filters.SmallTest; + +import androidx.test.filters.SmallTest; import junit.framework.Assert; import junit.framework.TestCase; diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsStopwatchTimerTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsStopwatchTimerTest.java index 015314ebe8dc..f76f31619f79 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsStopwatchTimerTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsStopwatchTimerTest.java @@ -13,10 +13,12 @@ * License for the specific language governing permissions and limitations under * the License. */ + package com.android.internal.os; import android.os.BatteryStats; -import android.support.test.filters.SmallTest; + +import androidx.test.filters.SmallTest; import junit.framework.TestCase; diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java index 225515e9e3f3..d69e1d131731 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.android.internal.os; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTimeBaseTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTimeBaseTest.java index 3190d9e77c77..bce8b40cc31d 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTimeBaseTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTimeBaseTest.java @@ -16,19 +16,20 @@ package com.android.internal.os; -import java.io.PrintWriter; -import java.io.StringWriter; - import android.os.BatteryStats; import android.os.Parcel; -import android.support.test.filters.SmallTest; import android.util.Log; +import androidx.test.filters.SmallTest; + import junit.framework.Assert; import junit.framework.TestCase; import org.mockito.Mockito; +import java.io.PrintWriter; +import java.io.StringWriter; + /** * Provides test cases for android.os.BatteryStats. */ diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTimerTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTimerTest.java index 98d0f7fdce5c..87dc2f3dd43b 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTimerTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTimerTest.java @@ -18,16 +18,17 @@ package com.android.internal.os; import android.os.BatteryStats; import android.os.Parcel; -import android.support.test.filters.SmallTest; import android.util.StringBuilderPrinter; -import junit.framework.Assert; -import junit.framework.TestCase; +import androidx.test.filters.SmallTest; import com.android.internal.os.BatteryStatsImpl.Clocks; import com.android.internal.os.BatteryStatsImpl.TimeBase; import com.android.internal.os.BatteryStatsImpl.Timer; +import junit.framework.Assert; +import junit.framework.TestCase; + /** * Provides test cases for android.os.BatteryStats. */ diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsUidTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsUidTest.java index a7e75a248eda..4df3190cc2d7 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsUidTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsUidTest.java @@ -16,22 +16,10 @@ package com.android.internal.os; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.ArrayList; +import androidx.test.filters.SmallTest; -import android.os.BatteryStats; -import android.os.Parcel; -import android.test.suitebuilder.annotation.SmallTest; -import android.util.Log; - -import junit.framework.Assert; import junit.framework.TestCase; -import com.android.internal.os.BatteryStatsImpl; - -import org.mockito.Mockito; - /** * Provides test cases for android.os.BatteryStats. */ diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsUserLifecycleTests.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsUserLifecycleTests.java index 450473d0335c..e7a1bcae459a 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsUserLifecycleTests.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsUserLifecycleTests.java @@ -28,12 +28,13 @@ import android.content.pm.UserInfo; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.LargeTest; -import android.support.test.runner.AndroidJUnit4; import android.support.test.uiautomator.UiDevice; import android.util.ArraySet; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.LargeTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; diff --git a/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java index dc3a12f0bbf5..1d35143e3fab 100644 --- a/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java @@ -22,11 +22,12 @@ import static org.junit.Assert.assertTrue; import android.os.Binder; import android.os.SystemClock; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.util.ArrayMap; import android.util.SparseArray; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import com.android.internal.os.BinderInternal.CallSession; import org.junit.Assert; diff --git a/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java b/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java index 42c9139e04e2..01515bd9c6b5 100644 --- a/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.android.internal.os; import static android.os.BatteryStats.UID_TIMES_TYPE_ALL; @@ -33,9 +34,6 @@ import static junit.framework.Assert.assertNull; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.fail; -import com.android.frameworks.coretests.aidl.ICmdCallback; -import com.android.frameworks.coretests.aidl.ICmdReceiver; - import android.app.ActivityManager; import android.app.KeyguardManager; import android.content.ComponentName; @@ -52,14 +50,18 @@ import android.os.PowerManager; import android.os.Process; import android.os.SystemClock; import android.provider.Settings; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.LargeTest; -import android.support.test.runner.AndroidJUnit4; import android.support.test.uiautomator.UiDevice; import android.text.TextUtils; import android.util.DebugUtils; import android.util.Log; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.LargeTest; +import androidx.test.runner.AndroidJUnit4; + +import com.android.frameworks.coretests.aidl.ICmdCallback; +import com.android.frameworks.coretests.aidl.ICmdReceiver; + import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Rule; diff --git a/core/tests/coretests/src/com/android/internal/os/DebugTest.java b/core/tests/coretests/src/com/android/internal/os/DebugTest.java index efb78d788575..2a8a8571c882 100644 --- a/core/tests/coretests/src/com/android/internal/os/DebugTest.java +++ b/core/tests/coretests/src/com/android/internal/os/DebugTest.java @@ -18,7 +18,8 @@ package com.android.internal.os; import android.os.Debug; -import android.test.suitebuilder.annotation.SmallTest; +import androidx.test.filters.SmallTest; + import junit.framework.TestCase; @SmallTest diff --git a/core/tests/coretests/src/com/android/internal/os/KernelCpuProcReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelCpuProcReaderTest.java index 8360126f3751..a25a74890029 100644 --- a/core/tests/coretests/src/com/android/internal/os/KernelCpuProcReaderTest.java +++ b/core/tests/coretests/src/com/android/internal/os/KernelCpuProcReaderTest.java @@ -24,9 +24,10 @@ import static org.junit.Assert.assertTrue; import android.content.Context; import android.os.FileUtils; import android.os.SystemClock; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Before; diff --git a/core/tests/coretests/src/com/android/internal/os/KernelCpuProcStringReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelCpuProcStringReaderTest.java index 2663f2bc8ae1..7a316056429a 100644 --- a/core/tests/coretests/src/com/android/internal/os/KernelCpuProcStringReaderTest.java +++ b/core/tests/coretests/src/com/android/internal/os/KernelCpuProcStringReaderTest.java @@ -24,9 +24,10 @@ import static org.junit.Assert.assertTrue; import android.content.Context; import android.os.FileUtils; import android.os.SystemClock; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Before; diff --git a/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderEndToEndTest.java b/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderEndToEndTest.java new file mode 100644 index 000000000000..c03d1f37ffa7 --- /dev/null +++ b/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderEndToEndTest.java @@ -0,0 +1,214 @@ +/* + * Copyright (C) 2018 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.internal.os; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import android.os.SystemClock; +import android.support.test.filters.LargeTest; +import android.support.test.runner.AndroidJUnit4; + +import com.android.internal.os.KernelCpuThreadReader.ProcessCpuUsage; +import com.android.internal.os.KernelCpuThreadReader.ThreadCpuUsage; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.time.Duration; +import java.util.Arrays; +import java.util.List; +import java.util.OptionalDouble; +import java.util.concurrent.CountDownLatch; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +/** + * End to end test for {@link KernelCpuThreadReader} that checks the accuracy of the reported times + * by spawning threads that do a predictable amount of work + */ +@RunWith(AndroidJUnit4.class) +@LargeTest +public class KernelCpuThreadReaderEndToEndTest { + + private static final int TIMED_NUM_SAMPLES = 5; + private static final int TIMED_START_MILLIS = 500; + private static final int TIMED_END_MILLIS = 2000; + private static final int TIMED_INCREMENT_MILLIS = 500; + private static final int TIMED_COMPARISON_DELTA_MILLIS = 200; + + private static final int ITERATIVE_NUM_SAMPLES = 100; + private static final long ITERATIVE_LOW_ITERATIONS = (long) 1e8; + private static final long ITERATIVE_HIGH_ITERATIONS = (long) 2e8; + private static final double ITERATIONS_COMPARISONS_DELTA = 0.25; + + /** + * Test that when we busy-wait for the thread-local time to reach N seconds, the time reported + * is also N seconds. Takes ~10s. + */ + @Test + public void testTimedWork() throws InterruptedException { + for (int millis = TIMED_START_MILLIS; + millis <= TIMED_END_MILLIS; + millis += TIMED_INCREMENT_MILLIS) { + final Duration targetDuration = Duration.ofMillis(millis); + final Runnable work = timedWork(targetDuration); + Duration resultDuration = getAverageWorkTime( + work, String.format("timed%dms", millis), TIMED_NUM_SAMPLES); + assertEquals( + "Time worked according to currentThreadTimeMillis doesn't match " + + "KernelCpuThreadReader", + targetDuration.toMillis(), resultDuration.toMillis(), + TIMED_COMPARISON_DELTA_MILLIS); + } + } + + /** + * Test that when we scale up the amount of work by N, the time reported also scales by N. Takes + * ~15s. + */ + @Test + public void testIterativeWork() throws InterruptedException { + final Runnable lowAmountWork = iterativeWork(ITERATIVE_LOW_ITERATIONS); + final Runnable highAmountWork = iterativeWork(ITERATIVE_HIGH_ITERATIONS); + final Duration lowResultDuration = + getAverageWorkTime(lowAmountWork, "iterlow", ITERATIVE_NUM_SAMPLES); + final Duration highResultDuration = + getAverageWorkTime(highAmountWork, "iterhigh", ITERATIVE_NUM_SAMPLES); + assertEquals( + "Work scale and CPU time scale do not match", + ((double) ITERATIVE_HIGH_ITERATIONS) / ((double) ITERATIVE_LOW_ITERATIONS), + ((double) highResultDuration.toMillis()) / ((double) lowResultDuration.toMillis()), + ITERATIONS_COMPARISONS_DELTA); + } + + /** + * Run some work {@code numSamples} times, and take the average CPU duration used for that work + * according to {@link KernelCpuThreadReader} + */ + private Duration getAverageWorkTime( + Runnable work, String tag, int numSamples) throws InterruptedException { + // Count down every time a thread finishes work, so that we can wait for work to complete + final CountDownLatch workFinishedLatch = new CountDownLatch(numSamples); + // Count down once when threads can terminate (after we get them from + // `KernelCpuThreadReader`) + final CountDownLatch threadFinishedLatch = new CountDownLatch(1); + + // Start `NUM_SAMPLE` threads to do the work + for (int i = 0; i < numSamples; i++) { + final String threadName = String.format("%s%d", tag, i); + // Check the thread name, as we rely on it later to identify threads + assertTrue("Max name length for linux threads is 15", threadName.length() <= 15); + doWork(work, threadName, workFinishedLatch, threadFinishedLatch); + } + + // Wait for threads to finish + workFinishedLatch.await(); + + // Get thread data from KernelCpuThreadReader + final KernelCpuThreadReader kernelCpuThreadReader = KernelCpuThreadReader.create(); + assertNotNull(kernelCpuThreadReader); + final ProcessCpuUsage currentProcessCpuUsage = + kernelCpuThreadReader.getCurrentProcessCpuUsage(); + + // Threads can terminate, as we've finished crawling them from /proc + threadFinishedLatch.countDown(); + + // Check that we've got times for every thread we spawned + final List<ThreadCpuUsage> threadCpuUsages = currentProcessCpuUsage.threadCpuUsages + .stream() + .filter((thread) -> thread.threadName.startsWith(tag)) + .collect(Collectors.toList()); + assertEquals( + "Incorrect number of threads returned by KernelCpuThreadReader", + numSamples, threadCpuUsages.size()); + + // Calculate the average time spent working + final OptionalDouble averageWorkTimeMillis = threadCpuUsages.stream() + .mapToDouble((t) -> Arrays.stream(t.usageTimesMillis).sum()) + .average(); + assertTrue(averageWorkTimeMillis.isPresent()); + return Duration.ofMillis((long) averageWorkTimeMillis.getAsDouble()); + } + + /** + * Work that lasts {@code duration} according to {@link SystemClock#currentThreadTimeMillis()} + */ + private Runnable timedWork(Duration duration) { + return () -> { + // Busy loop until `duration` has elapsed for the thread timer + final long startTimeMillis = SystemClock.currentThreadTimeMillis(); + final long durationMillis = duration.toMillis(); + while (true) { + final long elapsedMillis = SystemClock.currentThreadTimeMillis() - startTimeMillis; + if (elapsedMillis >= durationMillis) { + break; + } + } + }; + } + + /** + * Work that iterates {@code iterations} times + */ + private Runnable iterativeWork(long iterations) { + Consumer<Long> empty = (i) -> { + }; + return () -> { + long count = 0; + for (long i = 0; i < iterations; i++) { + // Alternate branching to reduce effect of branch prediction + if (i % 2 == 0) { + count++; + } + } + // Call empty function with value to avoid loop getting optimized away + empty.accept(count); + }; + } + + /** + * Perform some work in another thread + * + * @param work the work to perform + * @param threadName the name of the spawned thread + * @param workFinishedLatch latch to register that the work has been completed + * @param threadFinishedLatch latch to pause termination of the thread until the latch is + * decremented + */ + private void doWork( + Runnable work, + String threadName, + CountDownLatch workFinishedLatch, + CountDownLatch threadFinishedLatch) { + Runnable workWrapped = () -> { + // Do the work + work.run(); + // Notify that the work is finished + workFinishedLatch.countDown(); + // Wait until `threadFinishLatch` has been released in order to keep the thread alive so + // we can see it in `proc` filesystem + try { + threadFinishedLatch.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }; + new Thread(workWrapped, threadName).start(); + } +} diff --git a/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderTest.java index b242a34cc703..0c56b8a3e8aa 100644 --- a/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderTest.java +++ b/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderTest.java @@ -23,9 +23,10 @@ import static org.junit.Assert.assertTrue; import android.content.Context; import android.os.FileUtils; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Before; diff --git a/core/tests/coretests/src/com/android/internal/os/KernelCpuUidActiveTimeReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelCpuUidActiveTimeReaderTest.java index adafda04d516..1b13a9927beb 100644 --- a/core/tests/coretests/src/com/android/internal/os/KernelCpuUidActiveTimeReaderTest.java +++ b/core/tests/coretests/src/com/android/internal/os/KernelCpuUidActiveTimeReaderTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.android.internal.os; import static org.junit.Assert.assertEquals; @@ -20,11 +21,12 @@ import static org.junit.Assert.assertTrue; import android.content.Context; import android.os.FileUtils; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.util.SparseLongArray; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidActiveTimeReader; import org.junit.After; diff --git a/core/tests/coretests/src/com/android/internal/os/KernelCpuUidClusterTimeReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelCpuUidClusterTimeReaderTest.java index ad20d84bfc60..2ea80da9e6d0 100644 --- a/core/tests/coretests/src/com/android/internal/os/KernelCpuUidClusterTimeReaderTest.java +++ b/core/tests/coretests/src/com/android/internal/os/KernelCpuUidClusterTimeReaderTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.android.internal.os; import static org.junit.Assert.assertArrayEquals; @@ -22,11 +23,12 @@ import static org.junit.Assert.assertTrue; import android.content.Context; import android.os.FileUtils; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.util.SparseArray; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidClusterTimeReader; import org.junit.After; diff --git a/core/tests/coretests/src/com/android/internal/os/KernelCpuUidFreqTimeReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelCpuUidFreqTimeReaderTest.java index 1d3a98a89d95..0b6fed386117 100644 --- a/core/tests/coretests/src/com/android/internal/os/KernelCpuUidFreqTimeReaderTest.java +++ b/core/tests/coretests/src/com/android/internal/os/KernelCpuUidFreqTimeReaderTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.android.internal.os; import static org.junit.Assert.assertArrayEquals; @@ -24,11 +25,12 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.os.FileUtils; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.util.SparseArray; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidFreqTimeReader; import org.junit.After; diff --git a/core/tests/coretests/src/com/android/internal/os/KernelCpuUidUserSysTimeReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelCpuUidUserSysTimeReaderTest.java index 9b4512b8b9bd..8f81ea237a15 100644 --- a/core/tests/coretests/src/com/android/internal/os/KernelCpuUidUserSysTimeReaderTest.java +++ b/core/tests/coretests/src/com/android/internal/os/KernelCpuUidUserSysTimeReaderTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.android.internal.os; import static org.junit.Assert.assertArrayEquals; @@ -23,11 +24,12 @@ import static org.junit.Assert.assertTrue; import android.content.Context; import android.os.FileUtils; import android.os.SystemClock; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.util.SparseArray; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidUserSysTimeReader; import org.junit.After; diff --git a/core/tests/coretests/src/com/android/internal/os/KernelMemoryBandwidthStatsTest.java b/core/tests/coretests/src/com/android/internal/os/KernelMemoryBandwidthStatsTest.java index 32317eed203e..60dac8520d14 100644 --- a/core/tests/coretests/src/com/android/internal/os/KernelMemoryBandwidthStatsTest.java +++ b/core/tests/coretests/src/com/android/internal/os/KernelMemoryBandwidthStatsTest.java @@ -1,11 +1,27 @@ +/* + * Copyright (C) 2016 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.internal.os; -import android.support.test.filters.SmallTest; import android.util.LongSparseLongArray; +import androidx.test.filters.SmallTest; + import junit.framework.TestCase; -import org.junit.Assert; import org.mockito.Mockito; import java.io.BufferedReader; diff --git a/core/tests/coretests/src/com/android/internal/os/KernelSingleUidTimeReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelSingleUidTimeReaderTest.java index 29227f9f6a1b..479e19e10ba0 100644 --- a/core/tests/coretests/src/com/android/internal/os/KernelSingleUidTimeReaderTest.java +++ b/core/tests/coretests/src/com/android/internal/os/KernelSingleUidTimeReaderTest.java @@ -21,10 +21,11 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.util.SparseArray; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import com.android.internal.os.KernelSingleUidTimeReader.Injector; import org.junit.Before; diff --git a/core/tests/coretests/src/com/android/internal/os/KernelUidCpuActiveTimeReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelUidCpuActiveTimeReaderTest.java index 28570e8fa747..12f6c188f18f 100644 --- a/core/tests/coretests/src/com/android/internal/os/KernelUidCpuActiveTimeReaderTest.java +++ b/core/tests/coretests/src/com/android/internal/os/KernelUidCpuActiveTimeReaderTest.java @@ -20,8 +20,8 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/com/android/internal/os/KernelUidCpuClusterTimeReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelUidCpuClusterTimeReaderTest.java index 85dce020ddd4..532f337fe2e1 100644 --- a/core/tests/coretests/src/com/android/internal/os/KernelUidCpuClusterTimeReaderTest.java +++ b/core/tests/coretests/src/com/android/internal/os/KernelUidCpuClusterTimeReaderTest.java @@ -21,10 +21,11 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.when; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.util.SparseArray; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/com/android/internal/os/KernelUidCpuFreqTimeReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelUidCpuFreqTimeReaderTest.java index 67c4e6161da6..6d2980b8bed0 100644 --- a/core/tests/coretests/src/com/android/internal/os/KernelUidCpuFreqTimeReaderTest.java +++ b/core/tests/coretests/src/com/android/internal/os/KernelUidCpuFreqTimeReaderTest.java @@ -24,10 +24,11 @@ import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.util.SparseArray; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -53,7 +54,7 @@ import java.util.Arrays; * Install: adb install -r \ * ${ANDROID_PRODUCT_OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk * Run: adb shell am instrument -e class com.android.internal.os.KernelUidCpuFreqTimeReaderTest -w \ - * com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner + * com.android.frameworks.coretests/androidx.test.runner.AndroidJUnitRunner * * or * diff --git a/core/tests/coretests/src/com/android/internal/os/KernelWakelockReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelWakelockReaderTest.java index 4e4bb350739d..78b6843e535c 100644 --- a/core/tests/coretests/src/com/android/internal/os/KernelWakelockReaderTest.java +++ b/core/tests/coretests/src/com/android/internal/os/KernelWakelockReaderTest.java @@ -13,9 +13,10 @@ * License for the specific language governing permissions and limitations under * the License. */ + package com.android.internal.os; -import android.support.test.filters.SmallTest; +import androidx.test.filters.SmallTest; import junit.framework.TestCase; diff --git a/core/tests/coretests/src/com/android/internal/os/LoggingPrintStreamTest.java b/core/tests/coretests/src/com/android/internal/os/LoggingPrintStreamTest.java index fe627642418f..cb8a62c0936c 100644 --- a/core/tests/coretests/src/com/android/internal/os/LoggingPrintStreamTest.java +++ b/core/tests/coretests/src/com/android/internal/os/LoggingPrintStreamTest.java @@ -16,7 +16,9 @@ package com.android.internal.os; -import android.test.suitebuilder.annotation.Suppress; +import androidx.test.filters.Suppress; + +import junit.framework.TestCase; import java.io.PrintWriter; import java.io.StringWriter; @@ -25,8 +27,6 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; -import junit.framework.TestCase; - // this test causes a IllegalAccessError: superclass not accessible @Suppress public class LoggingPrintStreamTest extends TestCase { diff --git a/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterArrayTest.java b/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterArrayTest.java index 37b4e41a38d6..0516bb7f74d7 100644 --- a/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterArrayTest.java +++ b/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterArrayTest.java @@ -30,8 +30,9 @@ import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import android.os.Parcel; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Test; @@ -55,7 +56,7 @@ import java.util.Arrays; * Install: adb install -r \ * ${ANDROID_PRODUCT_OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk * Run: adb shell am instrument -e class com.android.internal.os.LongSamplingCounterArrayTest -w \ - * com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner + * com.android.frameworks.coretests/androidx.test.runner.AndroidJUnitRunner */ @SmallTest @RunWith(AndroidJUnit4.class) diff --git a/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterTest.java b/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterTest.java index 853bf8a079a6..d2f5735ce3c1 100644 --- a/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterTest.java +++ b/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterTest.java @@ -28,8 +28,9 @@ import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import android.os.Parcel; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/com/android/internal/os/LooperStatsTest.java b/core/tests/coretests/src/com/android/internal/os/LooperStatsTest.java index b65c1e6210a7..2c597b14c557 100644 --- a/core/tests/coretests/src/com/android/internal/os/LooperStatsTest.java +++ b/core/tests/coretests/src/com/android/internal/os/LooperStatsTest.java @@ -23,8 +23,9 @@ import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.platform.test.annotations.Presubmit; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Assert; diff --git a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java index b68f6b1273b9..c18445e26173 100644 --- a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java +++ b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java @@ -21,6 +21,7 @@ import android.os.Looper; import android.util.SparseIntArray; import com.android.internal.location.gnssmetrics.GnssMetrics; + import java.util.ArrayList; import java.util.Queue; import java.util.concurrent.Future; diff --git a/core/tests/coretests/src/com/android/internal/os/PowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/PowerCalculatorTest.java index 14d62e0b2f9c..c592ab6a16ae 100644 --- a/core/tests/coretests/src/com/android/internal/os/PowerCalculatorTest.java +++ b/core/tests/coretests/src/com/android/internal/os/PowerCalculatorTest.java @@ -17,13 +17,13 @@ package com.android.internal.os; - import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.os.BatteryStats; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import junit.framework.TestCase; diff --git a/core/tests/coretests/src/com/android/internal/os/PowerProfileTest.java b/core/tests/coretests/src/com/android/internal/os/PowerProfileTest.java index 2853c965e871..5862368f44d2 100644 --- a/core/tests/coretests/src/com/android/internal/os/PowerProfileTest.java +++ b/core/tests/coretests/src/com/android/internal/os/PowerProfileTest.java @@ -17,8 +17,8 @@ package com.android.internal.os; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; import junit.framework.TestCase; diff --git a/core/tests/coretests/src/com/android/internal/os/ProcStatsUtilTest.java b/core/tests/coretests/src/com/android/internal/os/ProcStatsUtilTest.java index 489e164e0b12..e97caf8c0631 100644 --- a/core/tests/coretests/src/com/android/internal/os/ProcStatsUtilTest.java +++ b/core/tests/coretests/src/com/android/internal/os/ProcStatsUtilTest.java @@ -20,9 +20,10 @@ import static org.junit.Assert.assertEquals; import android.content.Context; import android.os.FileUtils; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Before; diff --git a/core/tests/coretests/src/com/android/internal/os/ProcTimeInStateReaderTest.java b/core/tests/coretests/src/com/android/internal/os/ProcTimeInStateReaderTest.java index 2893066af0d8..9db3f8a6e187 100644 --- a/core/tests/coretests/src/com/android/internal/os/ProcTimeInStateReaderTest.java +++ b/core/tests/coretests/src/com/android/internal/os/ProcTimeInStateReaderTest.java @@ -22,9 +22,10 @@ import static org.junit.Assert.fail; import android.content.Context; import android.os.FileUtils; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Before; diff --git a/core/tests/coretests/src/com/android/internal/os/StoragedUidIoStatsReaderTest.java b/core/tests/coretests/src/com/android/internal/os/StoragedUidIoStatsReaderTest.java index c051a1cdf052..85eafc57acc3 100644 --- a/core/tests/coretests/src/com/android/internal/os/StoragedUidIoStatsReaderTest.java +++ b/core/tests/coretests/src/com/android/internal/os/StoragedUidIoStatsReaderTest.java @@ -15,15 +15,17 @@ */ package com.android.internal.os; + import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyZeroInteractions; import android.content.Context; import android.os.FileUtils; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Before; @@ -36,7 +38,6 @@ import java.io.BufferedWriter; import java.io.File; import java.nio.file.Files; - /** * Test class for {@link StoragedUidIoStatsReader}. * diff --git a/core/tests/coretests/src/com/android/internal/policy/PhoneWindowActionModeTest.java b/core/tests/coretests/src/com/android/internal/policy/PhoneWindowActionModeTest.java index 2a24881f67fa..8e0c1fe99933 100644 --- a/core/tests/coretests/src/com/android/internal/policy/PhoneWindowActionModeTest.java +++ b/core/tests/coretests/src/com/android/internal/policy/PhoneWindowActionModeTest.java @@ -17,8 +17,6 @@ package com.android.internal.policy; import android.test.ActivityInstrumentationTestCase2; -import android.test.UiThreadTest; -import android.test.suitebuilder.annotation.SmallTest; import android.view.ActionMode; import android.view.ActionMode.Callback; import android.view.KeyEvent; @@ -32,7 +30,8 @@ import android.view.Window; import android.view.WindowManager.LayoutParams; import android.view.accessibility.AccessibilityEvent; -import java.util.List; +import androidx.test.annotation.UiThreadTest; +import androidx.test.filters.SmallTest; /** * Tests {@link PhoneWindow}'s {@link ActionMode} related methods. diff --git a/core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java b/core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java index d4b8566b0345..6c2d630ac917 100644 --- a/core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java +++ b/core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java @@ -28,12 +28,13 @@ import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.platform.test.annotations.Presubmit; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.view.ActionMode; import android.view.ContextThemeWrapper; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import com.android.frameworks.coretests.R; import org.junit.Before; diff --git a/core/tests/coretests/src/com/android/internal/util/ArrayUtilsTest.java b/core/tests/coretests/src/com/android/internal/util/ArrayUtilsTest.java index b3897ceb6e79..d0267355c92e 100644 --- a/core/tests/coretests/src/com/android/internal/util/ArrayUtilsTest.java +++ b/core/tests/coretests/src/com/android/internal/util/ArrayUtilsTest.java @@ -13,9 +13,11 @@ * License for the specific language governing permissions and limitations under * the License. */ + package com.android.internal.util; -import android.test.suitebuilder.annotation.SmallTest; +import androidx.test.filters.SmallTest; + import junit.framework.TestCase; import java.util.ArrayList; diff --git a/core/tests/coretests/src/com/android/internal/util/DumpUtilsTest.java b/core/tests/coretests/src/com/android/internal/util/DumpUtilsTest.java index a44b86074ee2..4716312c59a8 100644 --- a/core/tests/coretests/src/com/android/internal/util/DumpUtilsTest.java +++ b/core/tests/coretests/src/com/android/internal/util/DumpUtilsTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.android.internal.util; import static com.android.internal.util.DumpUtils.CRITICAL_SECTION_COMPONENTS; diff --git a/core/tests/coretests/src/com/android/internal/util/LineBreakBufferedWriterTest.java b/core/tests/coretests/src/com/android/internal/util/LineBreakBufferedWriterTest.java index 4845c4ef28f8..b2a2265d30ae 100644 --- a/core/tests/coretests/src/com/android/internal/util/LineBreakBufferedWriterTest.java +++ b/core/tests/coretests/src/com/android/internal/util/LineBreakBufferedWriterTest.java @@ -19,11 +19,8 @@ package com.android.internal.util; import junit.framework.TestCase; import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.PrintWriter; import java.io.Writer; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; /** diff --git a/core/tests/coretests/src/com/android/internal/util/ParseUtilsTest.java b/core/tests/coretests/src/com/android/internal/util/ParseUtilsTest.java index f00c48c96b5d..867152e720dd 100644 --- a/core/tests/coretests/src/com/android/internal/util/ParseUtilsTest.java +++ b/core/tests/coretests/src/com/android/internal/util/ParseUtilsTest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.android.internal.util; import junit.framework.TestCase; diff --git a/core/tests/coretests/src/android/util/TokenBucketTest.java b/core/tests/coretests/src/com/android/internal/util/TokenBucketTest.java index f7ac20c7287f..6c50bce86638 100644 --- a/core/tests/coretests/src/android/util/TokenBucketTest.java +++ b/core/tests/coretests/src/com/android/internal/util/TokenBucketTest.java @@ -18,6 +18,7 @@ package com.android.internal.util; import android.os.SystemClock; import android.text.format.DateUtils; + import junit.framework.TestCase; public class TokenBucketTest extends TestCase { @@ -54,9 +55,9 @@ public class TokenBucketTest extends TestCase { drain(new TokenBucket(FILL_DELTA_VERY_LONG, 10, 100), 10); - drain(new TokenBucket((int)DateUtils.MINUTE_IN_MILLIS, 50), 50); - drain(new TokenBucket((int)DateUtils.HOUR_IN_MILLIS, 10), 10); - drain(new TokenBucket((int)DateUtils.DAY_IN_MILLIS, 200), 200); + drain(new TokenBucket((int) DateUtils.MINUTE_IN_MILLIS, 50), 50); + drain(new TokenBucket((int) DateUtils.HOUR_IN_MILLIS, 10), 10); + drain(new TokenBucket((int) DateUtils.DAY_IN_MILLIS, 200), 200); } public void testReset() { @@ -163,16 +164,16 @@ public class TokenBucketTest extends TestCase { void assertDuration(long expected, long elapsed) { String msg = String.format( - "expected elapsed time at least %d ms, but was %d ms", expected, elapsed); + "expected elapsed time at least %d ms, but was %d ms", expected, elapsed); elapsed += 1; // one millisecond extra guard assertTrue(msg, elapsed >= expected); } - void assertThrow(Fn fn) { - try { - fn.call(); - fail("expected n exception to be thrown."); - } catch (Throwable t) {} + void assertThrow(Fn fn) { + try { + fn.call(); + fail("expected n exception to be thrown."); + } catch (Throwable t) { } } interface Fn { void call(); } diff --git a/core/tests/coretests/src/com/android/internal/widget/ActionBarContainerTest.java b/core/tests/coretests/src/com/android/internal/widget/ActionBarContainerTest.java index 912b7ec02b15..b3723664dc1b 100644 --- a/core/tests/coretests/src/com/android/internal/widget/ActionBarContainerTest.java +++ b/core/tests/coretests/src/com/android/internal/widget/ActionBarContainerTest.java @@ -18,11 +18,12 @@ package com.android.internal.widget; import android.content.Context; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; import android.view.ActionMode; import android.view.View; import android.view.ViewGroup; +import androidx.test.filters.SmallTest; + /** * Tests for {@link ActionBarContainer}. */ diff --git a/core/tests/coretests/src/com/android/internal/widget/ActionBarOverlayLayoutTest.java b/core/tests/coretests/src/com/android/internal/widget/ActionBarOverlayLayoutTest.java index d782c0c0308d..d10f173328be 100644 --- a/core/tests/coretests/src/com/android/internal/widget/ActionBarOverlayLayoutTest.java +++ b/core/tests/coretests/src/com/android/internal/widget/ActionBarOverlayLayoutTest.java @@ -29,9 +29,6 @@ import static org.junit.Assert.assertThat; import android.content.Context; import android.graphics.Insets; import android.graphics.Rect; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; import android.view.DisplayCutout; import android.view.View; import android.view.View.OnApplyWindowInsetsListener; @@ -40,6 +37,10 @@ import android.view.WindowInsets; import android.widget.FrameLayout; import android.widget.Toolbar; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/com/android/internal/widget/BackgroundFallbackTest.java b/core/tests/coretests/src/com/android/internal/widget/BackgroundFallbackTest.java index e21143d4392f..0fada06b8de4 100644 --- a/core/tests/coretests/src/com/android/internal/widget/BackgroundFallbackTest.java +++ b/core/tests/coretests/src/com/android/internal/widget/BackgroundFallbackTest.java @@ -32,10 +32,11 @@ import static java.util.Collections.emptyList; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; -import android.support.test.InstrumentationRegistry; import android.view.ViewGroup; import android.widget.FrameLayout; +import androidx.test.InstrumentationRegistry; + import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/com/android/internal/widget/ImageFloatingTextViewTest.java b/core/tests/coretests/src/com/android/internal/widget/ImageFloatingTextViewTest.java index 1806b226e7b3..2e0dbb4f574e 100644 --- a/core/tests/coretests/src/com/android/internal/widget/ImageFloatingTextViewTest.java +++ b/core/tests/coretests/src/com/android/internal/widget/ImageFloatingTextViewTest.java @@ -19,12 +19,13 @@ package com.android.internal.widget; import static org.junit.Assert.assertTrue; import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; import android.text.Layout; import android.view.View.MeasureSpec; import android.widget.TextView; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; + import org.junit.Assert; import org.junit.Before; import org.junit.Test; diff --git a/core/tests/coretests/src/com/android/internal/widget/LockPatternUtilsTest.java b/core/tests/coretests/src/com/android/internal/widget/LockPatternUtilsTest.java index f73950a648e0..6167c4b80cee 100644 --- a/core/tests/coretests/src/com/android/internal/widget/LockPatternUtilsTest.java +++ b/core/tests/coretests/src/com/android/internal/widget/LockPatternUtilsTest.java @@ -20,8 +20,9 @@ import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import android.os.UserHandle; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/core/tests/coretests/src/com/android/internal/widget/MessagingLinearLayoutTest.java b/core/tests/coretests/src/com/android/internal/widget/MessagingLinearLayoutTest.java index 41082b7c7593..6af7c886ce9b 100644 --- a/core/tests/coretests/src/com/android/internal/widget/MessagingLinearLayoutTest.java +++ b/core/tests/coretests/src/com/android/internal/widget/MessagingLinearLayoutTest.java @@ -21,12 +21,12 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.text.Layout; import android.view.LayoutInflater; import android.view.View.MeasureSpec; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; + import com.android.frameworks.coretests.R; import org.junit.Before; diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/Android.mk index f3d98a88d485..afbcd4675a78 100644 --- a/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/Android.mk +++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/Android.mk @@ -23,7 +23,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := MultiDexLegacyTestServicesTests2 LOCAL_JAVA_LIBRARIES := android-support-multidex -LOCAL_STATIC_JAVA_LIBRARIES := android-support-test +LOCAL_STATIC_JAVA_LIBRARIES := androidx.test.rules LOCAL_SDK_VERSION := 9 diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/AndroidManifest.xml b/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/AndroidManifest.xml index 0ab29591be18..01285e77e3ff 100644 --- a/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/AndroidManifest.xml +++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/AndroidManifest.xml @@ -7,7 +7,7 @@ <uses-sdk android:minSdkVersion="9" /> <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/> <instrumentation - android:name="android.support.test.runner.AndroidJUnitRunner" + android:name="androidx.test.runner.AndroidJUnitRunner" android:targetPackage="com.android.framework.multidexlegacytestservices" /> <application diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/src/com/android/framework/multidexlegacytestservices/test2/ServicesTests.java b/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/src/com/android/framework/multidexlegacytestservices/test2/ServicesTests.java index 900f20387c49..f2c72f001646 100644 --- a/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/src/com/android/framework/multidexlegacytestservices/test2/ServicesTests.java +++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/src/com/android/framework/multidexlegacytestservices/test2/ServicesTests.java @@ -19,22 +19,26 @@ package com.android.framework.multidexlegacytestservices.test2; import android.app.ActivityManager; import android.content.Context; import android.content.Intent; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; import android.util.Log; + +import androidx.test.InstrumentationRegistry; +import androidx.test.runner.AndroidJUnit4; + +import junit.framework.Assert; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.io.RandomAccessFile; import java.util.concurrent.TimeoutException; -import junit.framework.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; /** * Run the tests with: <code>adb shell am instrument -w - * com.android.framework.multidexlegacytestservices.test2/android.support.test.runner.AndroidJUnitRunner + * com.android.framework.multidexlegacytestservices.test2/androidx.test.runner.AndroidJUnitRunner * </code> */ @RunWith(AndroidJUnit4.class) diff --git a/libs/androidfw/AttributeResolution.cpp b/libs/androidfw/AttributeResolution.cpp index 3dc1f2cd56c5..18d74efdbacf 100644 --- a/libs/androidfw/AttributeResolution.cpp +++ b/libs/androidfw/AttributeResolution.cpp @@ -286,6 +286,7 @@ void ApplyStyle(Theme* theme, ResXMLParser* xml_parser, uint32_t def_style_attr, value.dataType = Res_value::TYPE_NULL; value.data = Res_value::DATA_NULL_UNDEFINED; config.density = 0; + uint32_t source_style_resid = 0; // Try to find a value for this attribute... we prioritize values // coming from, first XML attributes, then XML style, then default @@ -309,6 +310,7 @@ void ApplyStyle(Theme* theme, ResXMLParser* xml_parser, uint32_t def_style_attr, cookie = entry->cookie; type_set_flags = style_flags; value = entry->value; + source_style_resid = entry->style; if (kDebugStyles) { ALOGI("-> From style: type=0x%x, data=0x%08x, style=0x%08x", value.dataType, value.data, entry->style); @@ -325,8 +327,10 @@ void ApplyStyle(Theme* theme, ResXMLParser* xml_parser, uint32_t def_style_attr, type_set_flags = def_style_flags; value = entry->value; if (kDebugStyles) { - ALOGI("-> From def style: type=0x%x, data=0x%08x", value.dataType, value.data); + ALOGI("-> From def style: type=0x%x, data=0x%08x, style=0x%08x", value.dataType, value.data, + entry->style); } + source_style_resid = entry->style; } } @@ -382,6 +386,7 @@ void ApplyStyle(Theme* theme, ResXMLParser* xml_parser, uint32_t def_style_attr, out_values[STYLE_RESOURCE_ID] = resid; out_values[STYLE_CHANGING_CONFIGURATIONS] = type_set_flags; out_values[STYLE_DENSITY] = config.density; + out_values[SYTLE_SOURCE_STYLE] = source_style_resid; if (value.dataType != Res_value::TYPE_NULL || value.data == Res_value::DATA_NULL_EMPTY) { indices_idx++; diff --git a/libs/androidfw/include/androidfw/AttributeResolution.h b/libs/androidfw/include/androidfw/AttributeResolution.h index 35ef98d8c704..c88004c70687 100644 --- a/libs/androidfw/include/androidfw/AttributeResolution.h +++ b/libs/androidfw/include/androidfw/AttributeResolution.h @@ -23,15 +23,17 @@ namespace android { // Offsets into the outValues array populated by the methods below. outValues is a uint32_t -// array, but each logical element takes up 6 uint32_t-sized physical elements. +// array, but each logical element takes up 7 uint32_t-sized physical elements. +// Keep these in sync with android.content.res.TypedArray java class enum { - STYLE_NUM_ENTRIES = 6, + STYLE_NUM_ENTRIES = 7, STYLE_TYPE = 0, STYLE_DATA = 1, STYLE_ASSET_COOKIE = 2, STYLE_RESOURCE_ID = 3, STYLE_CHANGING_CONFIGURATIONS = 4, - STYLE_DENSITY = 5 + STYLE_DENSITY = 5, + SYTLE_SOURCE_STYLE = 6 }; // These are all variations of the same method. They each perform the exact same operation, diff --git a/libs/services/include/android/os/DropBoxManager.h b/libs/services/include/android/os/DropBoxManager.h index 75b26c626d14..07472435d8a3 100644 --- a/libs/services/include/android/os/DropBoxManager.h +++ b/libs/services/include/android/os/DropBoxManager.h @@ -62,7 +62,7 @@ public: // file descriptor. Status addFile(const String16& tag, int fd, int flags); - class Entry : public virtual RefBase, public Parcelable { + class Entry : public Parcelable { public: Entry(); virtual ~Entry(); @@ -89,9 +89,6 @@ public: friend class DropBoxManager; }; - // Get the next entry from the drop box after the specified time. - Status getNextEntry(const String16& tag, long msec, Entry* entry); - private: enum { HAS_BYTE_ARRAY = 8 diff --git a/libs/services/src/os/DropBoxManager.cpp b/libs/services/src/os/DropBoxManager.cpp index 8282518f75c6..681d5f780739 100644 --- a/libs/services/src/os/DropBoxManager.cpp +++ b/libs/services/src/os/DropBoxManager.cpp @@ -228,15 +228,4 @@ DropBoxManager::add(const Entry& entry) return service->add(entry); } -Status -DropBoxManager::getNextEntry(const String16& tag, long msec, Entry* entry) -{ - sp<IDropBoxManagerService> service = interface_cast<IDropBoxManagerService>( - defaultServiceManager()->getService(android::String16("dropbox"))); - if (service == NULL) { - return Status::fromExceptionCode(Status::EX_NULL_POINTER, "can't find dropbox service"); - } - return service->getNextEntry(tag, msec, android::String16("android"), entry); -} - }} // namespace android::os diff --git a/media/Android.bp b/media/Android.bp index d5da6f266952..8ebc91a06f7a 100644 --- a/media/Android.bp +++ b/media/Android.bp @@ -1,4 +1,21 @@ java_library { + name: "media1", + + srcs: [ + ":media1-srcs", + ], + + sdk_version: "system_current", +} + +filegroup { + name: "media1-srcs", + srcs: [ + "java/android/media/session/MediaSessionProviderService.java", + ], +} + +java_library { // TODO: include media2.jar in the media apex and add it to the bootclasspath. name: "media2", diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java index 4f23cca1171f..f5a6f8667fa6 100644 --- a/media/java/android/media/AudioAttributes.java +++ b/media/java/android/media/AudioAttributes.java @@ -736,8 +736,9 @@ public final class AudioAttributes implements Parcelable { * @param preset one of {@link MediaRecorder.AudioSource#DEFAULT}, * {@link MediaRecorder.AudioSource#MIC}, {@link MediaRecorder.AudioSource#CAMCORDER}, * {@link MediaRecorder.AudioSource#VOICE_RECOGNITION}, - * {@link MediaRecorder.AudioSource#VOICE_COMMUNICATION} or - * {@link MediaRecorder.AudioSource#UNPROCESSED} + * {@link MediaRecorder.AudioSource#VOICE_COMMUNICATION}, + * {@link MediaRecorder.AudioSource#UNPROCESSED} or + * {@link MediaRecorder.AudioSource#VOICE_PERFORMANCE} * @return the same Builder instance. */ @SystemApi @@ -749,6 +750,7 @@ public final class AudioAttributes implements Parcelable { case MediaRecorder.AudioSource.VOICE_RECOGNITION: case MediaRecorder.AudioSource.VOICE_COMMUNICATION: case MediaRecorder.AudioSource.UNPROCESSED: + case MediaRecorder.AudioSource.VOICE_PERFORMANCE: mSource = preset; break; default: @@ -760,7 +762,7 @@ public final class AudioAttributes implements Parcelable { /** * @hide * Same as {@link #setCapturePreset(int)} but authorizes the use of HOTWORD, - * REMOTE_SUBMIX, RADIO_TUNER, VOICE_DOWNLINK, VOICE_UPLINK and VOICE_CALL. + * REMOTE_SUBMIX, RADIO_TUNER, VOICE_DOWNLINK, VOICE_UPLINK, VOICE_CALL and ECHO_REFERENCE. * @param preset * @return the same Builder instance. */ @@ -771,7 +773,8 @@ public final class AudioAttributes implements Parcelable { || (preset == MediaRecorder.AudioSource.RADIO_TUNER) || (preset == MediaRecorder.AudioSource.VOICE_DOWNLINK) || (preset == MediaRecorder.AudioSource.VOICE_UPLINK) - || (preset == MediaRecorder.AudioSource.VOICE_CALL)) { + || (preset == MediaRecorder.AudioSource.VOICE_CALL) + || (preset == MediaRecorder.AudioSource.ECHO_REFERENCE)) { mSource = preset; } else { setCapturePreset(preset); diff --git a/media/java/android/media/AudioRecordingConfiguration.java b/media/java/android/media/AudioRecordingConfiguration.java index de76aeff82c4..52771e4199d8 100644 --- a/media/java/android/media/AudioRecordingConfiguration.java +++ b/media/java/android/media/AudioRecordingConfiguration.java @@ -172,7 +172,8 @@ public final class AudioRecordingConfiguration implements Parcelable { MediaRecorder.AudioSource.CAMCORDER, MediaRecorder.AudioSource.VOICE_RECOGNITION, MediaRecorder.AudioSource.VOICE_COMMUNICATION, - MediaRecorder.AudioSource.UNPROCESSED + MediaRecorder.AudioSource.UNPROCESSED, + MediaRecorder.AudioSource.VOICE_PERFORMANCE }) @Retention(RetentionPolicy.SOURCE) public @interface AudioSource {} diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java index 45cde0ffecc4..de73649d59dc 100644 --- a/media/java/android/media/AudioSystem.java +++ b/media/java/android/media/AudioSystem.java @@ -541,6 +541,8 @@ public class AudioSystem public static final int DEVICE_IN_BUS = DEVICE_BIT_IN | 0x100000; public static final int DEVICE_IN_PROXY = DEVICE_BIT_IN | 0x1000000; public static final int DEVICE_IN_USB_HEADSET = DEVICE_BIT_IN | 0x2000000; + public static final int DEVICE_IN_BLUETOOTH_BLE = DEVICE_BIT_IN | 0x4000000; + public static final int DEVICE_IN_ECHO_REFERENCE = DEVICE_BIT_IN | 0x10000000; @UnsupportedAppUsage public static final int DEVICE_IN_DEFAULT = DEVICE_BIT_IN | DEVICE_BIT_DEFAULT; @@ -567,6 +569,8 @@ public class AudioSystem DEVICE_IN_BUS | DEVICE_IN_PROXY | DEVICE_IN_USB_HEADSET | + DEVICE_IN_BLUETOOTH_BLE | + DEVICE_IN_ECHO_REFERENCE | DEVICE_IN_DEFAULT); public static final int DEVICE_IN_ALL_SCO = DEVICE_IN_BLUETOOTH_SCO_HEADSET; public static final int DEVICE_IN_ALL_USB = (DEVICE_IN_USB_ACCESSORY | @@ -641,6 +645,8 @@ public class AudioSystem public static final String DEVICE_IN_BUS_NAME = "bus"; public static final String DEVICE_IN_PROXY_NAME = "proxy"; public static final String DEVICE_IN_USB_HEADSET_NAME = "usb_headset"; + public static final String DEVICE_IN_BLUETOOTH_BLE_NAME = "bt_ble"; + public static final String DEVICE_IN_ECHO_REFERENCE_NAME = "echo_reference"; @UnsupportedAppUsage public static String getOutputDeviceName(int device) @@ -757,6 +763,10 @@ public class AudioSystem return DEVICE_IN_PROXY_NAME; case DEVICE_IN_USB_HEADSET: return DEVICE_IN_USB_HEADSET_NAME; + case DEVICE_IN_BLUETOOTH_BLE: + return DEVICE_IN_BLUETOOTH_BLE_NAME; + case DEVICE_IN_ECHO_REFERENCE: + return DEVICE_IN_ECHO_REFERENCE_NAME; case DEVICE_IN_DEFAULT: default: return Integer.toString(device); diff --git a/media/java/android/media/IMediaSession2Service.aidl b/media/java/android/media/IMediaSession2Service.aidl new file mode 100644 index 000000000000..10ac1be0a36e --- /dev/null +++ b/media/java/android/media/IMediaSession2Service.aidl @@ -0,0 +1,32 @@ +/* + * Copyright 2019 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.media; + +import android.os.Bundle; +import android.media.Controller2Link; + +/** + * Interface from MediaController2 to MediaSession2Service. + * <p> + * Keep this interface oneway. Otherwise a malicious app may implement fake version of this, + * and holds calls from controller to make controller owner(s) frozen. + * @hide + */ +oneway interface IMediaSession2Service { + void connect(in Controller2Link caller, int seq, in Bundle connectionRequest) = 0; + // Next Id : 1 +} diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java index bc9500ddb3b7..f756658b4fa8 100644 --- a/media/java/android/media/MediaCodec.java +++ b/media/java/android/media/MediaCodec.java @@ -1829,9 +1829,14 @@ final public class MediaCodec { mBufferLock = new Object(); + // save name used at creation + mNameAtCreation = nameIsType ? null : name; + native_setup(name, nameIsType, encoder); } + private String mNameAtCreation; + @Override protected void finalize() { native_finalize(); @@ -3317,12 +3322,36 @@ final public class MediaCodec { private native void native_setAudioPresentation(int presentationId, int programId); /** - * Get the component name. If the codec was created by createDecoderByType - * or createEncoderByType, what component is chosen is not known beforehand. + * Retrieve the codec name. + * + * If the codec was created by createDecoderByType or createEncoderByType, what component is + * chosen is not known beforehand. This method returns the name of the codec that was + * selected by the platform. + * + * <strong>Note:</strong> Implementations may provide multiple aliases (codec + * names) for the same underlying codec, any of which can be used to instantiate the same + * underlying codec in {@link MediaCodec#createByCodecName}. This method returns the + * name used to create the codec in this case. + * + * @throws IllegalStateException if in the Released state. + */ + @NonNull + public final String getName() { + // get canonical name to handle exception + String canonicalName = getCanonicalName(); + return mNameAtCreation != null ? mNameAtCreation : canonicalName; + } + + /** + * Retrieve the underlying codec name. + * + * This method is similar to {@link #getName}, except that it returns the underlying component + * name even if an alias was used to create this MediaCodec object by name, + * * @throws IllegalStateException if in the Released state. */ @NonNull - public native final String getName(); + public native final String getCanonicalName(); /** * Return Metrics data about the current codec instance. diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java index 10a1e3a72225..751d57bbdc81 100644 --- a/media/java/android/media/MediaCodecInfo.java +++ b/media/java/android/media/MediaCodecInfo.java @@ -32,8 +32,10 @@ import android.util.Size; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Set; +import java.util.Vector; /** * Provides information about a given media codec available on the device. You can @@ -61,15 +63,25 @@ import java.util.Set; * */ public final class MediaCodecInfo { - private boolean mIsEncoder; + private static final String TAG = "MediaCodecInfo"; + + private static final int FLAG_IS_ENCODER = (1 << 0); + private static final int FLAG_IS_VENDOR = (1 << 1); + private static final int FLAG_IS_SOFTWARE_ONLY = (1 << 2); + private static final int FLAG_IS_HARDWARE_ACCELERATED = (1 << 3); + + private int mFlags; private String mName; + private String mCanonicalName; private Map<String, CodecCapabilities> mCaps; /* package private */ MediaCodecInfo( - String name, boolean isEncoder, CodecCapabilities[] caps) { + String name, String canonicalName, int flags, CodecCapabilities[] caps) { mName = name; - mIsEncoder = isEncoder; + mCanonicalName = canonicalName; + mFlags = flags; mCaps = new HashMap<String, CodecCapabilities>(); + for (CodecCapabilities c: caps) { mCaps.put(c.getMimeType(), c); } @@ -77,16 +89,69 @@ public final class MediaCodecInfo { /** * Retrieve the codec name. + * + * <strong>Note:</strong> Implementations may provide multiple aliases (codec + * names) for the same underlying codec, any of which can be used to instantiate the same + * underlying codec in {@link MediaCodec#createByCodecName}. + * + * Applications targeting SDK < {@link android.os.Build.VERSION_CODES#Q}, cannot determine if + * the multiple codec names listed in MediaCodecList are in-fact for the same codec. */ + @NonNull public final String getName() { return mName; } /** + * Retrieve the underlying codec name. + * + * Device implementations may provide multiple aliases (codec names) for the same underlying + * codec to maintain backward app compatibility. This method returns the name of the underlying + * codec name, which must not be another alias. For non-aliases this is always the name of the + * codec. + */ + @NonNull + public final String getCanonicalName() { + return mCanonicalName; + } + + /** + * Query if the codec is an alias for another underlying codec. + */ + public final boolean isAlias() { + return !mName.equals(mCanonicalName); + } + + /** * Query if the codec is an encoder. */ public final boolean isEncoder() { - return mIsEncoder; + return (mFlags & FLAG_IS_ENCODER) != 0; + } + + /** + * Query if the codec is provided by the Android platform (false) or the device manufacturer + * (true). + */ + public final boolean isVendor() { + return (mFlags & FLAG_IS_VENDOR) != 0; + } + + /** + * Query if the codec is software only. Software-only codecs are more secure as they run in + * a tighter security sandbox. On the other hand, software-only codecs do not provide any + * performance guarantees. + */ + public final boolean isSoftwareOnly() { + return (mFlags & FLAG_IS_SOFTWARE_ONLY) != 0; + } + + /** + * Query if the codec is hardware accelerated. This attribute is provided by the device + * manufacturer. Note that it cannot be tested for correctness. + */ + public final boolean isHardwareAccelerated() { + return (mFlags & FLAG_IS_HARDWARE_ACCELERATED) != 0; } /** @@ -163,7 +228,7 @@ public final class MediaCodecInfo { // such as B-frame support, arithmetic coding... public CodecProfileLevel[] profileLevels; // NOTE this array is modifiable by user - // from OMX_COLOR_FORMATTYPE + // from MediaCodecConstants /** @deprecated Use {@link #COLOR_Format24bitBGR888}. */ public static final int COLOR_FormatMonochrome = 1; /** @deprecated Use {@link #COLOR_Format24bitBGR888}. */ @@ -344,7 +409,7 @@ public final class MediaCodecInfo { /** @deprecated Use {@link #COLOR_FormatYUV420Flexible}. */ public static final int COLOR_TI_FormatYUV420PackedSemiPlanar = 0x7f000100; // COLOR_FormatSurface indicates that the data will be a GraphicBuffer metadata reference. - // In OMX this is called OMX_COLOR_FormatAndroidOpaque. + // Note: in OMX this is called OMX_COLOR_FormatAndroidOpaque. public static final int COLOR_FormatSurface = 0x7F000789; /** @@ -435,8 +500,7 @@ public final class MediaCodecInfo { public static final int COLOR_QCOM_FormatYUV420SemiPlanar = 0x7fa30c00; /** - * Defined in the OpenMAX IL specs, color format values are drawn from - * OMX_COLOR_FORMATTYPE. + * The color format for the media. This is one of the color constants defined in this class. */ public int[] colorFormats; // NOTE this array is modifiable by user @@ -462,6 +526,26 @@ public final class MediaCodecInfo { public static final String FEATURE_TunneledPlayback = "tunneled-playback"; /** + * If true, the timestamp of each output buffer is derived from the timestamp of the input + * buffer that produced the output. If false, the timestamp of each output buffer is + * derived from the timestamp of the first input buffer. + */ + public static final String FEATURE_DynamicTimestamp = "dynamic-timestamp"; + + /** + * <b>decoder only</b>If true, the codec supports partial (including multiple) access units + * per input buffer. + */ + public static final String FEATURE_FrameParsing = "frame-parsing"; + + /** + * If true, the codec supports multiple access units (for decoding, or to output for + * encoders). If false, the codec only supports single access units. Producing multiple + * access units for output is an optional feature. + */ + public static final String FEATURE_MultipleFrames = "multiple-frames"; + + /** * <b>video decoder only</b>: codec supports queuing partial frames. */ public static final String FEATURE_PartialFrame = "partial-frame"; @@ -497,10 +581,15 @@ public final class MediaCodecInfo { new Feature(FEATURE_SecurePlayback, (1 << 1), false), new Feature(FEATURE_TunneledPlayback, (1 << 2), false), new Feature(FEATURE_PartialFrame, (1 << 3), false), + new Feature(FEATURE_FrameParsing, (1 << 4), false), + new Feature(FEATURE_MultipleFrames, (1 << 5), false), + new Feature(FEATURE_DynamicTimestamp, (1 << 6), false), }; private static final Feature[] encoderFeatures = { new Feature(FEATURE_IntraRefresh, (1 << 0), false), + new Feature(FEATURE_MultipleFrames, (1 << 1), false), + new Feature(FEATURE_DynamicTimestamp, (1 << 2), false), }; /** @hide */ @@ -869,7 +958,7 @@ public final class MediaCodecInfo { CodecCapabilities ret = new CodecCapabilities( new CodecProfileLevel[] { pl }, new int[0], true /* encoder */, - 0 /* flags */, defaultFormat, new MediaFormat() /* info */); + defaultFormat, new MediaFormat() /* info */); if (ret.mError != 0) { return null; } @@ -878,10 +967,10 @@ public final class MediaCodecInfo { /* package private */ CodecCapabilities( CodecProfileLevel[] profLevs, int[] colFmts, - boolean encoder, int flags, + boolean encoder, Map<String, Object>defaultFormatMap, Map<String, Object>capabilitiesMap) { - this(profLevs, colFmts, encoder, flags, + this(profLevs, colFmts, encoder, new MediaFormat(defaultFormatMap), new MediaFormat(capabilitiesMap)); } @@ -889,11 +978,11 @@ public final class MediaCodecInfo { private MediaFormat mCapabilitiesInfo; /* package private */ CodecCapabilities( - CodecProfileLevel[] profLevs, int[] colFmts, boolean encoder, int flags, + CodecProfileLevel[] profLevs, int[] colFmts, boolean encoder, MediaFormat defaultFormat, MediaFormat info) { final Map<String, Object> map = info.getMap(); colorFormats = colFmts; - mFlagsVerified = flags; + mFlagsVerified = 0; // TODO: remove as it is unused mDefaultFormat = defaultFormat; mCapabilitiesInfo = info; mMime = mDefaultFormat.getString(MediaFormat.KEY_MIME); @@ -1243,6 +1332,7 @@ public final class MediaCodecInfo { private Range<Rational> mBlockAspectRatioRange; private Range<Long> mBlocksPerSecondRange; private Map<Size, Range<Long>> mMeasuredFrameRates; + private Vector<PerformancePoint> mPerformancePoints; private Range<Integer> mFrameRateRange; private int mBlockWidth; @@ -1524,6 +1614,158 @@ public final class MediaCodecInfo { } /** + * Video performance points are a set of standard performance points defined by pixel rate. + */ + public static final class PerformancePoint { + /** + * Frame width in pixels. + */ + public final int width; + + /** + * Frame height in pixels. + */ + public final int height; + + /** + * Frame rate in frames per second. + */ + public final int frameRate; + + /* package private */ + PerformancePoint(int width_, int height_, int frameRate_) { + width = width_; + height = height_; + frameRate = frameRate_; + } + + /** + * Checks whether the performance point covers a media format. + * + * @param format Stream format considered + * + * @return {@code true} if the performance point covers the format. + */ + public boolean covers(@NonNull MediaFormat format) { + // for simplicity, this code assumes a 16x16 block size. + long macroBlocks = ((width + 15) / 16) * (long)((height + 15) / 16); + long mbps = macroBlocks * frameRate; + + long formatMacroBlocks = + (long)((format.getInteger(MediaFormat.KEY_WIDTH, 0) + 15) / 16) + * ((format.getInteger(MediaFormat.KEY_HEIGHT, 0) + 15) / 16); + double formatMbps = + Math.ceil(formatMacroBlocks + * format.getNumber(MediaFormat.KEY_FRAME_RATE, 0).doubleValue()); + return formatMacroBlocks > 0 && formatMacroBlocks <= macroBlocks + && formatMbps <= mbps; + } + + @Override + public boolean equals(Object o) { + if (o instanceof PerformancePoint) { + PerformancePoint other = (PerformancePoint)o; + return ((long)width * height) == ((long)other.width * other.height) + && frameRate == other.frameRate; + } + return false; + } + + /** 480p 24fps */ + public static final PerformancePoint SD_24 = new PerformancePoint(720, 480, 24); + /** 576p 25fps */ + public static final PerformancePoint SD_25 = new PerformancePoint(720, 576, 25); + /** 480p 30fps */ + public static final PerformancePoint SD_30 = new PerformancePoint(720, 480, 30); + /** 480p 48fps */ + public static final PerformancePoint SD_48 = new PerformancePoint(720, 480, 48); + /** 576p 50fps */ + public static final PerformancePoint SD_50 = new PerformancePoint(720, 576, 50); + /** 480p 60fps */ + public static final PerformancePoint SD_60 = new PerformancePoint(720, 480, 60); + + /** 720p 24fps */ + public static final PerformancePoint HD_24 = new PerformancePoint(1280, 720, 24); + /** 720p 25fps */ + public static final PerformancePoint HD_25 = new PerformancePoint(1280, 720, 25); + /** 720p 30fps */ + public static final PerformancePoint HD_30 = new PerformancePoint(1280, 720, 30); + /** 720p 50fps */ + public static final PerformancePoint HD_50 = new PerformancePoint(1280, 720, 50); + /** 720p 60fps */ + public static final PerformancePoint HD_60 = new PerformancePoint(1280, 720, 60); + /** 720p 100fps */ + public static final PerformancePoint HD_100 = new PerformancePoint(1280, 720, 100); + /** 720p 120fps */ + public static final PerformancePoint HD_120 = new PerformancePoint(1280, 720, 120); + /** 720p 200fps */ + public static final PerformancePoint HD_200 = new PerformancePoint(1280, 720, 200); + /** 720p 240fps */ + public static final PerformancePoint HD_240 = new PerformancePoint(1280, 720, 240); + + /** 1080p 24fps */ + public static final PerformancePoint FHD_24 = new PerformancePoint(1920, 1080, 24); + /** 1080p 25fps */ + public static final PerformancePoint FHD_25 = new PerformancePoint(1920, 1080, 25); + /** 1080p 30fps */ + public static final PerformancePoint FHD_30 = new PerformancePoint(1920, 1080, 30); + /** 1080p 50fps */ + public static final PerformancePoint FHD_50 = new PerformancePoint(1920, 1080, 50); + /** 1080p 60fps */ + public static final PerformancePoint FHD_60 = new PerformancePoint(1920, 1080, 60); + /** 1080p 100fps */ + public static final PerformancePoint FHD_100 = new PerformancePoint(1920, 1080, 100); + /** 1080p 120fps */ + public static final PerformancePoint FHD_120 = new PerformancePoint(1920, 1080, 120); + /** 1080p 200fps */ + public static final PerformancePoint FHD_200 = new PerformancePoint(1920, 1080, 200); + /** 1080p 240fps */ + public static final PerformancePoint FHD_240 = new PerformancePoint(1920, 1080, 240); + + /** 2160p 24fps */ + public static final PerformancePoint UHD_24 = new PerformancePoint(3840, 2160, 24); + /** 2160p 25fps */ + public static final PerformancePoint UHD_25 = new PerformancePoint(3840, 2160, 25); + /** 2160p 30fps */ + public static final PerformancePoint UHD_30 = new PerformancePoint(3840, 2160, 30); + /** 2160p 50fps */ + public static final PerformancePoint UHD_50 = new PerformancePoint(3840, 2160, 50); + /** 2160p 60fps */ + public static final PerformancePoint UHD_60 = new PerformancePoint(3840, 2160, 60); + /** 2160p 100fps */ + public static final PerformancePoint UHD_100 = new PerformancePoint(3840, 2160, 100); + /** 2160p 120fps */ + public static final PerformancePoint UHD_120 = new PerformancePoint(3840, 2160, 120); + /** 2160p 200fps */ + public static final PerformancePoint UHD_200 = new PerformancePoint(3840, 2160, 200); + /** 2160p 240fps */ + public static final PerformancePoint UHD_240 = new PerformancePoint(3840, 2160, 240); + } + + /** + * Returns the supported performance points. May return {@code null} if the codec did not + * publish any performance point information (e.g. the vendor codecs have not been updated + * to the latest android release). May return an empty list if the codec published that + * if does not guarantee any performance points. + * <p> + * This is a performance guarantee provided by the device manufacturer for hardware codecs + * based on hardware capabilities of the device. + * <p> + * The returned list is sorted first by decreasing number of pixels, then by decreasing + * width, and finally by decreasing frame rate. + * Performance points assume a single active codec. For use cases where multiple + * codecs are active, should use that highest pixel count, and add the frame rates of + * each individual codec. + */ + @Nullable + public List<PerformancePoint> getSupportedPerformancePoints() { + if (mPerformancePoints == null) { + return null; + } + return new ArrayList<PerformancePoint>(mPerformancePoints); + } + + /** * Returns whether a given video size ({@code width} and * {@code height}) and {@code frameRate} combination is supported. */ @@ -1659,6 +1901,50 @@ public final class MediaCodecInfo { mSmallerDimensionUpperLimit = SIZE_RANGE.getUpper(); } + private @Nullable Vector<PerformancePoint> getPerformancePoints(Map<String, Object> map) { + Vector<PerformancePoint> ret = new Vector<>(); + final String prefix = "performance-point-"; + Set<String> keys = map.keySet(); + for (String key : keys) { + // looking for: performance-point-WIDTHxHEIGHT-range + if (!key.startsWith(prefix)) { + continue; + } + String subKey = key.substring(prefix.length()); + if (subKey.equals("none") && ret.size() == 0) { + // This means that component knowingly did not publish performance points. + // This is different from when the component forgot to publish performance + // points. + return ret; + } + String[] temp = key.split("-"); + if (temp.length != 4) { + continue; + } + String sizeStr = temp[2]; + Size size = Utils.parseSize(sizeStr, null); + if (size == null || size.getWidth() * size.getHeight() <= 0) { + continue; + } + Range<Long> range = Utils.parseLongRange(map.get(key), null); + if (range == null || range.getLower() < 0 || range.getUpper() < 0) { + continue; + } + ret.add(new PerformancePoint( + size.getWidth(), size.getHeight(), range.getLower().intValue())); + } + // check if the component specified no performance point indication + if (ret.size() == 0) { + return null; + } + + // sort reversed by area first, then by frame rate + ret.sort((a, b) -> (a.width * a.height != b.width * b.height ? + (b.width * b.height - a.width * a.height) : + (b.frameRate - a.frameRate))); + return ret; + } + private Map<Size, Range<Long>> getMeasuredFrameRates(Map<String, Object> map) { Map<Size, Range<Long>> ret = new HashMap<Size, Range<Long>>(); final String prefix = "measured-frame-rate-"; @@ -1770,6 +2056,7 @@ public final class MediaCodecInfo { blockRates = Utils.parseLongRange(map.get("blocks-per-second-range"), null); mMeasuredFrameRates = getMeasuredFrameRates(map); + mPerformancePoints = getPerformancePoints(map); Pair<Range<Integer>, Range<Integer>> sizeRanges = parseWidthHeightRanges(map.get("size-range")); if (sizeRanges != null) { @@ -2879,7 +3166,9 @@ public final class MediaCodecInfo { * {@link MediaCodecInfo.CodecCapabilities#profileLevels} field. */ public static final class CodecProfileLevel { - // from OMX_VIDEO_AVCPROFILETYPE + // These constants were originally in-line with OMX values, but this + // correspondence is no longer maintained. + public static final int AVCProfileBaseline = 0x01; public static final int AVCProfileMain = 0x02; public static final int AVCProfileExtended = 0x04; @@ -2890,7 +3179,6 @@ public final class MediaCodecInfo { public static final int AVCProfileConstrainedBaseline = 0x10000; public static final int AVCProfileConstrainedHigh = 0x80000; - // from OMX_VIDEO_AVCLEVELTYPE public static final int AVCLevel1 = 0x01; public static final int AVCLevel1b = 0x02; public static final int AVCLevel11 = 0x04; @@ -2908,8 +3196,10 @@ public final class MediaCodecInfo { public static final int AVCLevel5 = 0x4000; public static final int AVCLevel51 = 0x8000; public static final int AVCLevel52 = 0x10000; + public static final int AVCLevel6 = 0x20000; + public static final int AVCLevel61 = 0x40000; + public static final int AVCLevel62 = 0x80000; - // from OMX_VIDEO_H263PROFILETYPE public static final int H263ProfileBaseline = 0x01; public static final int H263ProfileH320Coding = 0x02; public static final int H263ProfileBackwardCompatible = 0x04; @@ -2920,7 +3210,6 @@ public final class MediaCodecInfo { public static final int H263ProfileInterlace = 0x80; public static final int H263ProfileHighLatency = 0x100; - // from OMX_VIDEO_H263LEVELTYPE public static final int H263Level10 = 0x01; public static final int H263Level20 = 0x02; public static final int H263Level30 = 0x04; @@ -2930,7 +3219,6 @@ public final class MediaCodecInfo { public static final int H263Level60 = 0x40; public static final int H263Level70 = 0x80; - // from OMX_VIDEO_MPEG4PROFILETYPE public static final int MPEG4ProfileSimple = 0x01; public static final int MPEG4ProfileSimpleScalable = 0x02; public static final int MPEG4ProfileCore = 0x04; @@ -2948,7 +3236,6 @@ public final class MediaCodecInfo { public static final int MPEG4ProfileAdvancedScalable = 0x4000; public static final int MPEG4ProfileAdvancedSimple = 0x8000; - // from OMX_VIDEO_MPEG4LEVELTYPE public static final int MPEG4Level0 = 0x01; public static final int MPEG4Level0b = 0x02; public static final int MPEG4Level1 = 0x04; @@ -2960,7 +3247,6 @@ public final class MediaCodecInfo { public static final int MPEG4Level5 = 0x80; public static final int MPEG4Level6 = 0x100; - // from OMX_VIDEO_MPEG2PROFILETYPE public static final int MPEG2ProfileSimple = 0x00; public static final int MPEG2ProfileMain = 0x01; public static final int MPEG2Profile422 = 0x02; @@ -2968,14 +3254,12 @@ public final class MediaCodecInfo { public static final int MPEG2ProfileSpatial = 0x04; public static final int MPEG2ProfileHigh = 0x05; - // from OMX_VIDEO_MPEG2LEVELTYPE public static final int MPEG2LevelLL = 0x00; public static final int MPEG2LevelML = 0x01; public static final int MPEG2LevelH14 = 0x02; public static final int MPEG2LevelHL = 0x03; public static final int MPEG2LevelHP = 0x04; - // from OMX_AUDIO_AACPROFILETYPE public static final int AACObjectMain = 1; public static final int AACObjectLC = 2; public static final int AACObjectSSR = 3; @@ -2990,16 +3274,13 @@ public final class MediaCodecInfo { /** xHE-AAC (includes USAC) */ public static final int AACObjectXHE = 42; - // from OMX_VIDEO_VP8LEVELTYPE public static final int VP8Level_Version0 = 0x01; public static final int VP8Level_Version1 = 0x02; public static final int VP8Level_Version2 = 0x04; public static final int VP8Level_Version3 = 0x08; - // from OMX_VIDEO_VP8PROFILETYPE public static final int VP8ProfileMain = 0x01; - // from OMX_VIDEO_VP9PROFILETYPE public static final int VP9Profile0 = 0x01; public static final int VP9Profile1 = 0x02; public static final int VP9Profile2 = 0x04; @@ -3010,7 +3291,6 @@ public final class MediaCodecInfo { public static final int VP9Profile2HDR10Plus = 0x4000; public static final int VP9Profile3HDR10Plus = 0x8000; - // from OMX_VIDEO_VP9LEVELTYPE public static final int VP9Level1 = 0x1; public static final int VP9Level11 = 0x2; public static final int VP9Level2 = 0x4; @@ -3026,14 +3306,12 @@ public final class MediaCodecInfo { public static final int VP9Level61 = 0x1000; public static final int VP9Level62 = 0x2000; - // from OMX_VIDEO_HEVCPROFILETYPE public static final int HEVCProfileMain = 0x01; public static final int HEVCProfileMain10 = 0x02; public static final int HEVCProfileMainStill = 0x04; public static final int HEVCProfileMain10HDR10 = 0x1000; public static final int HEVCProfileMain10HDR10Plus = 0x2000; - // from OMX_VIDEO_HEVCLEVELTYPE public static final int HEVCMainTierLevel1 = 0x1; public static final int HEVCHighTierLevel1 = 0x2; public static final int HEVCMainTierLevel2 = 0x4; @@ -3067,7 +3345,6 @@ public final class MediaCodecInfo { HEVCHighTierLevel51 | HEVCHighTierLevel52 | HEVCHighTierLevel6 | HEVCHighTierLevel61 | HEVCHighTierLevel62; - // from OMX_VIDEO_DOLBYVISIONPROFILETYPE public static final int DolbyVisionProfileDvavPer = 0x1; public static final int DolbyVisionProfileDvavPen = 0x2; public static final int DolbyVisionProfileDvheDer = 0x4; @@ -3079,7 +3356,6 @@ public final class MediaCodecInfo { public static final int DolbyVisionProfileDvheSt = 0x100; public static final int DolbyVisionProfileDvavSe = 0x200; - // from OMX_VIDEO_DOLBYVISIONLEVELTYPE public static final int DolbyVisionLevelHd24 = 0x1; public static final int DolbyVisionLevelHd30 = 0x2; public static final int DolbyVisionLevelFhd24 = 0x4; @@ -3090,17 +3366,44 @@ public final class MediaCodecInfo { public static final int DolbyVisionLevelUhd48 = 0x80; public static final int DolbyVisionLevelUhd60 = 0x100; + public static final int AV1Profile0 = 0x1; + public static final int AV1Profile1 = 0x2; + public static final int AV1Profile2 = 0x4; + + public static final int AV1Level2 = 0x1; + public static final int AV1Level21 = 0x2; + public static final int AV1Level22 = 0x4; + public static final int AV1Level23 = 0x8; + public static final int AV1Level3 = 0x10; + public static final int AV1Level31 = 0x20; + public static final int AV1Level32 = 0x40; + public static final int AV1Level33 = 0x80; + public static final int AV1Level4 = 0x100; + public static final int AV1Level41 = 0x200; + public static final int AV1Level42 = 0x400; + public static final int AV1Level43 = 0x800; + public static final int AV1Level5 = 0x1000; + public static final int AV1Level51 = 0x2000; + public static final int AV1Level52 = 0x4000; + public static final int AV1Level53 = 0x8000; + public static final int AV1Level6 = 0x10000; + public static final int AV1Level61 = 0x20000; + public static final int AV1Level62 = 0x40000; + public static final int AV1Level63 = 0x80000; + public static final int AV1Level7 = 0x100000; + public static final int AV1Level71 = 0x200000; + public static final int AV1Level72 = 0x400000; + public static final int AV1Level73 = 0x800000; + /** - * Defined in the OpenMAX IL specs, depending on the type of media - * this can be OMX_VIDEO_AVCPROFILETYPE, OMX_VIDEO_H263PROFILETYPE, - * OMX_VIDEO_MPEG4PROFILETYPE, OMX_VIDEO_VP8PROFILETYPE or OMX_VIDEO_VP9PROFILETYPE. + * The profile of the media content. Depending on the type of media this can be + * one of the profile values defined in this class. */ public int profile; /** - * Defined in the OpenMAX IL specs, depending on the type of media - * this can be OMX_VIDEO_AVCLEVELTYPE, OMX_VIDEO_H263LEVELTYPE - * OMX_VIDEO_MPEG4LEVELTYPE, OMX_VIDEO_VP8LEVELTYPE or OMX_VIDEO_VP9LEVELTYPE. + * The level of the media content. Depending on the type of media this can be + * one of the level values defined in this class. * * Note that VP9 decoder on platforms before {@link android.os.Build.VERSION_CODES#N} may * not advertise a profile level support. For those VP9 decoders, please use @@ -3157,7 +3460,7 @@ public final class MediaCodecInfo { } return new MediaCodecInfo( - mName, mIsEncoder, + mName, mCanonicalName, mFlags, caps.toArray(new CodecCapabilities[caps.size()])); } } diff --git a/media/java/android/media/MediaCodecList.java b/media/java/android/media/MediaCodecList.java index 2e4786579d97..a46095484fe7 100644 --- a/media/java/android/media/MediaCodecList.java +++ b/media/java/android/media/MediaCodecList.java @@ -111,12 +111,14 @@ final public class MediaCodecList { caps[typeIx++] = getCodecCapabilities(index, type); } return new MediaCodecInfo( - getCodecName(index), isEncoder(index), caps); + getCodecName(index), getCanonicalName(index), getAttributes(index), caps); } /* package private */ static native final String getCodecName(int index); - /* package private */ static native final boolean isEncoder(int index); + /* package private */ static native final String getCanonicalName(int index); + + /* package private */ static native final int getAttributes(int index); /* package private */ static native final String[] getSupportedTypes(int index); diff --git a/media/java/android/media/MediaController2.java b/media/java/android/media/MediaController2.java index 774ea185f57c..165ea412333e 100644 --- a/media/java/android/media/MediaController2.java +++ b/media/java/android/media/MediaController2.java @@ -26,12 +26,16 @@ import static android.media.Session2Token.TYPE_SESSION; import android.annotation.NonNull; import android.annotation.Nullable; +import android.content.ComponentName; import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; import android.os.Binder; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Process; +import android.os.RemoteException; import android.os.ResultReceiver; import android.util.ArrayMap; import android.util.ArraySet; @@ -63,6 +67,7 @@ public class MediaController2 implements AutoCloseable { private final Executor mCallbackExecutor; private final Controller2Link mControllerStub; private final Handler mResultHandler; + private final SessionServiceConnection mServiceConnection; private final Object mLock = new Object(); //@GuardedBy("mLock") @@ -118,16 +123,25 @@ public class MediaController2 implements AutoCloseable { mPendingCommands = new ArrayMap<>(); mRequestedCommandSeqNumbers = new ArraySet<>(); + boolean connectRequested; if (token.getType() == TYPE_SESSION) { - connectToSession(); + mServiceConnection = null; + connectRequested = requestConnectToSession(); } else { - // TODO: Handle connect to session service. + mServiceConnection = new SessionServiceConnection(); + connectRequested = requestConnectToService(); + } + if (!connectRequested) { + close(); } } @Override public void close() { synchronized (mLock) { + if (mServiceConnection != null) { + mContext.unbindService(mServiceConnection); + } if (mSessionBinder != null) { try { mSessionBinder.disconnect(mControllerStub, getNextSeqNumber()); @@ -299,18 +313,55 @@ public class MediaController2 implements AutoCloseable { } } - private void connectToSession() { - Session2Link sessionBinder = mSessionToken.getSessionLink(); + private Bundle createConnectionRequest() { Bundle connectionRequest = new Bundle(); connectionRequest.putString(KEY_PACKAGE_NAME, mContext.getPackageName()); connectionRequest.putInt(KEY_PID, Process.myPid()); + return connectionRequest; + } + private boolean requestConnectToSession() { + Session2Link sessionBinder = mSessionToken.getSessionLink(); + Bundle connectionRequest = createConnectionRequest(); try { sessionBinder.connect(mControllerStub, getNextSeqNumber(), connectionRequest); } catch (RuntimeException e) { - Log.w(TAG, "Failed to call connection request. Framework will retry" - + " automatically"); + Log.w(TAG, "Failed to call connection request", e); + return false; + } + return true; + } + + private boolean requestConnectToService() { + // Service. Needs to get fresh binder whenever connection is needed. + final Intent intent = new Intent(MediaSession2Service.SERVICE_INTERFACE); + intent.setClassName(mSessionToken.getPackageName(), mSessionToken.getServiceName()); + + // Use bindService() instead of startForegroundService() to start session service for three + // reasons. + // 1. Prevent session service owner's stopSelf() from destroying service. + // With the startForegroundService(), service's call of stopSelf() will trigger immediate + // onDestroy() calls on the main thread even when onConnect() is running in another + // thread. + // 2. Minimize APIs for developers to take care about. + // With bindService(), developers only need to take care about Service.onBind() + // but Service.onStartCommand() should be also taken care about with the + // startForegroundService(). + // 3. Future support for UI-less playback + // If a service wants to keep running, it should be either foreground service or + // bound service. But there had been request for the feature for system apps + // and using bindService() will be better fit with it. + synchronized (mLock) { + boolean result = mContext.bindService( + intent, mServiceConnection, Context.BIND_AUTO_CREATE); + if (!result) { + Log.w(TAG, "bind to " + mSessionToken + " failed"); + return false; + } else if (DEBUG) { + Log.d(TAG, "bind to " + mSessionToken + " succeeded"); + } } + return true; } /** @@ -367,4 +418,59 @@ public class MediaController2 implements AutoCloseable { public void onCommandResult(@NonNull MediaController2 controller, @NonNull Object token, @NonNull Session2Command command, @NonNull Session2Command.Result result) {} } + + // This will be called on the main thread. + private class SessionServiceConnection implements ServiceConnection { + SessionServiceConnection() { + } + + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + // Note that it's always main-thread. + boolean connectRequested = false; + try { + if (DEBUG) { + Log.d(TAG, "onServiceConnected " + name + " " + this); + } + // Sanity check + if (!mSessionToken.getPackageName().equals(name.getPackageName())) { + Log.wtf(TAG, "Expected connection to " + mSessionToken.getPackageName() + + " but is connected to " + name); + return; + } + IMediaSession2Service iService = IMediaSession2Service.Stub.asInterface(service); + if (iService == null) { + Log.wtf(TAG, "Service interface is missing."); + return; + } + Bundle connectionRequest = createConnectionRequest(); + iService.connect(mControllerStub, getNextSeqNumber(), connectionRequest); + connectRequested = true; + } catch (RemoteException e) { + Log.w(TAG, "Service " + name + " has died prematurely", e); + } finally { + if (!connectRequested) { + close(); + } + } + } + + @Override + public void onServiceDisconnected(ComponentName name) { + // Temporal lose of the binding because of the service crash. System will automatically + // rebind, so just no-op. + if (DEBUG) { + Log.w(TAG, "Session service " + name + " is disconnected."); + } + close(); + } + + @Override + public void onBindingDied(ComponentName name) { + // Permanent lose of the binding because of the service package update or removed. + // This SessionServiceRecord will be removed accordingly, but forget session binder here + // for sure. + close(); + } + } } diff --git a/media/java/android/media/MediaFormat.java b/media/java/android/media/MediaFormat.java index 594a22457cc3..c82b5f6f12a1 100644 --- a/media/java/android/media/MediaFormat.java +++ b/media/java/android/media/MediaFormat.java @@ -124,6 +124,7 @@ import java.util.stream.Collectors; public final class MediaFormat { public static final String MIMETYPE_VIDEO_VP8 = "video/x-vnd.on2.vp8"; public static final String MIMETYPE_VIDEO_VP9 = "video/x-vnd.on2.vp9"; + public static final String MIMETYPE_VIDEO_AV1 = "video/av01"; public static final String MIMETYPE_VIDEO_AVC = "video/avc"; public static final String MIMETYPE_VIDEO_HEVC = "video/hevc"; public static final String MIMETYPE_VIDEO_MPEG4 = "video/mp4v-es"; diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java index 25b1df26fd40..1304afe3654e 100644 --- a/media/java/android/media/MediaRecorder.java +++ b/media/java/android/media/MediaRecorder.java @@ -302,6 +302,34 @@ public class MediaRecorder implements AudioRouting, * {@link #DEFAULT} otherwise. */ public static final int UNPROCESSED = 9; + + /** + * Source for capturing audio meant to be processed in real time and played back for live + * performance (e.g karaoke). + * <p> + * The capture path will minimize latency and coupling with + * playback path. + * </p> + */ + public static final int VOICE_PERFORMANCE = 10; + + /** + * Source for an echo canceller to capture the reference signal to be cancelled. + * <p> + * The echo reference signal will be captured as close as possible to the DAC in order + * to include all post processing applied to the playback path. + * </p><p> + * Capturing the echo reference requires the + * {@link android.Manifest.permission#CAPTURE_AUDIO_OUTPUT} permission. + * This permission is reserved for use by system components and is not available to + * third-party applications. + * </p> + * @hide + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_OUTPUT) + public static final int ECHO_REFERENCE = 1997; + /** * Audio source for capturing broadcast radio tuner output. * @hide @@ -343,6 +371,7 @@ public class MediaRecorder implements AudioRouting, case AudioSource.VOICE_COMMUNICATION: //case REMOTE_SUBMIX: considered "system" as it requires system permissions case AudioSource.UNPROCESSED: + case AudioSource.VOICE_PERFORMANCE: return false; default: return true; @@ -372,6 +401,10 @@ public class MediaRecorder implements AudioRouting, return "REMOTE_SUBMIX"; case AudioSource.UNPROCESSED: return "UNPROCESSED"; + case AudioSource.ECHO_REFERENCE: + return "ECHO_REFERENCE"; + case AudioSource.VOICE_PERFORMANCE: + return "VOICE_PERFORMANCE"; case AudioSource.RADIO_TUNER: return "RADIO_TUNER"; case AudioSource.HOTWORD: @@ -524,7 +557,7 @@ public class MediaRecorder implements AudioRouting, * @see android.media.MediaRecorder.AudioSource */ public static final int getAudioSourceMax() { - return AudioSource.UNPROCESSED; + return AudioSource.VOICE_PERFORMANCE; } /** diff --git a/media/java/android/media/MediaSession2.java b/media/java/android/media/MediaSession2.java index e008adf120ab..04999cace5e0 100644 --- a/media/java/android/media/MediaSession2.java +++ b/media/java/android/media/MediaSession2.java @@ -31,7 +31,6 @@ import android.content.Context; import android.content.Intent; import android.media.session.MediaSessionManager; import android.media.session.MediaSessionManager.RemoteUserInfo; -import android.os.Binder; import android.os.Bundle; import android.os.Handler; import android.os.Process; @@ -41,7 +40,6 @@ import android.util.ArraySet; import android.util.Log; import java.util.ArrayList; -import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -117,14 +115,18 @@ public class MediaSession2 implements AutoCloseable { @Override public void close() { try { - synchronized (MediaSession2.class) { - SESSION_ID_LIST.remove(mSessionId); - } - Collection<ControllerInfo> controllerInfos; + List<ControllerInfo> controllerInfos; synchronized (mLock) { - controllerInfos = mConnectedControllers.values(); - mConnectedControllers.clear(); + if (mClosed) { + return; + } mClosed = true; + controllerInfos = getConnectedControllers(); + mConnectedControllers.clear(); + mCallback.onSessionClosed(this); + } + synchronized (MediaSession2.class) { + SESSION_ID_LIST.remove(mSessionId); } for (ControllerInfo info : controllerInfos) { info.notifyDisconnected(); @@ -160,10 +162,7 @@ public class MediaSession2 implements AutoCloseable { if (command == null) { throw new IllegalArgumentException("command shouldn't be null"); } - Collection<ControllerInfo> controllerInfos; - synchronized (mLock) { - controllerInfos = mConnectedControllers.values(); - } + List<ControllerInfo> controllerInfos = getConnectedControllers(); for (ControllerInfo controller : controllerInfos) { controller.sendSessionCommand(command, args, null); } @@ -222,23 +221,26 @@ public class MediaSession2 implements AutoCloseable { } } - // Called by Session2Link.onConnect - void onConnect(final Controller2Link controller, int seq, Bundle connectionRequest) { - if (controller == null || connectionRequest == null) { - return; - } - final int uid = Binder.getCallingUid(); - final int callingPid = Binder.getCallingPid(); - final long token = Binder.clearCallingIdentity(); - // Binder.getCallingPid() can be 0 for an oneway call from the remote process. - // If it's the case, use PID from the ConnectionRequest. - final int pid = (callingPid != 0) ? callingPid : connectionRequest.getInt(KEY_PID); - final String pkg = connectionRequest.getString(KEY_PACKAGE_NAME); - try { - RemoteUserInfo remoteUserInfo = new RemoteUserInfo(pkg, pid, uid); - final ControllerInfo controllerInfo = new ControllerInfo(remoteUserInfo, - mSessionManager.isTrustedForMediaControl(remoteUserInfo), controller); - mCallbackExecutor.execute(() -> { + SessionCallback getCallback() { + return mCallback; + } + + // Called by Session2Link.onConnect and MediaSession2Service.MediaSession2ServiceStub.connect + void onConnect(final Controller2Link controller, int callingPid, int callingUid, int seq, + Bundle connectionRequest) { + if (callingPid == 0) { + // The pid here is from Binder.getCallingPid(), which can be 0 for an oneway call from + // the remote process. If it's the case, use PID from the connectionRequest. + callingPid = connectionRequest.getInt(KEY_PID); + } + String callingPkg = connectionRequest.getString(KEY_PACKAGE_NAME); + + RemoteUserInfo remoteUserInfo = new RemoteUserInfo(callingPkg, callingPid, callingUid); + final ControllerInfo controllerInfo = new ControllerInfo(remoteUserInfo, + mSessionManager.isTrustedForMediaControl(remoteUserInfo), controller); + mCallbackExecutor.execute(() -> { + boolean connected = false; + try { if (isClosed()) { return; } @@ -247,77 +249,71 @@ public class MediaSession2 implements AutoCloseable { // Don't reject connection for the request from trusted app. // Otherwise server will fail to retrieve session's information to dispatch // media keys to. - boolean accept = - controllerInfo.mAllowedCommands != null || controllerInfo.isTrusted(); - if (accept) { - if (controllerInfo.mAllowedCommands == null) { - // For trusted apps, send non-null allowed commands to keep - // connection. - controllerInfo.mAllowedCommands = - new Session2CommandGroup.Builder().build(); + if (controllerInfo.mAllowedCommands == null && !controllerInfo.isTrusted()) { + return; + } + if (controllerInfo.mAllowedCommands == null) { + // For trusted apps, send non-null allowed commands to keep + // connection. + controllerInfo.mAllowedCommands = + new Session2CommandGroup.Builder().build(); + } + if (DEBUG) { + Log.d(TAG, "Accepting connection: " + controllerInfo); + } + synchronized (mLock) { + if (mConnectedControllers.containsKey(controller)) { + Log.w(TAG, "Controller " + controllerInfo + " has sent connection" + + " request multiple times"); } + mConnectedControllers.put(controller, controllerInfo); + } + // If connection is accepted, notify the current state to the controller. + // It's needed because we cannot call synchronous calls between + // session/controller. + Bundle connectionResult = new Bundle(); + connectionResult.putParcelable(KEY_SESSION2LINK, mSessionStub); + connectionResult.putParcelable(KEY_ALLOWED_COMMANDS, + controllerInfo.mAllowedCommands); + + // Double check if session is still there, because close() can be called in + // another thread. + if (isClosed()) { + return; + } + controllerInfo.notifyConnected(connectionResult); + connected = true; + } finally { + if (!connected) { if (DEBUG) { - Log.d(TAG, "Accepting connection: " + controllerInfo); + Log.d(TAG, "Rejecting connection or notifying that session is closed" + + ", controllerInfo=" + controllerInfo); } synchronized (mLock) { - if (mConnectedControllers.containsKey(controller)) { - Log.w(TAG, "Controller " + controllerInfo + " has sent connection" - + " request multiple times"); - } - mConnectedControllers.put(controller, controllerInfo); - } - // If connection is accepted, notify the current state to the controller. - // It's needed because we cannot call synchronous calls between - // session/controller. - Bundle connectionResult = new Bundle(); - connectionResult.putParcelable(KEY_SESSION2LINK, mSessionStub); - connectionResult.putParcelable(KEY_ALLOWED_COMMANDS, - controllerInfo.mAllowedCommands); - - // Double check if session is still there, because close() can be called in - // another thread. - if (isClosed()) { - return; - } - controllerInfo.notifyConnected(connectionResult); - } else { - if (DEBUG) { - Log.d(TAG, "Rejecting connection, controllerInfo=" + controllerInfo); + mConnectedControllers.remove(controller); } controllerInfo.notifyDisconnected(); } - }); - } finally { - Binder.restoreCallingIdentity(token); - } + } + }); } // Called by Session2Link.onDisconnect - void onDisconnect(final Controller2Link controller, int seq) { - if (controller == null) { - return; - } + void onDisconnect(@NonNull final Controller2Link controller, int seq) { final ControllerInfo controllerInfo; synchronized (mLock) { - controllerInfo = mConnectedControllers.get(controller); + controllerInfo = mConnectedControllers.remove(controller); } if (controllerInfo == null) { return; } - - final long token = Binder.clearCallingIdentity(); - try { - mCallbackExecutor.execute(() -> { - mCallback.onDisconnected(MediaSession2.this, controllerInfo); - }); - mConnectedControllers.remove(controller); - } finally { - Binder.restoreCallingIdentity(token); - } + mCallbackExecutor.execute(() -> { + mCallback.onDisconnected(MediaSession2.this, controllerInfo); + }); } // Called by Session2Link.onSessionCommand - void onSessionCommand(final Controller2Link controller, final int seq, + void onSessionCommand(@NonNull final Controller2Link controller, final int seq, final Session2Command command, final Bundle args, @Nullable ResultReceiver resultReceiver) { if (controller == null) { @@ -332,34 +328,28 @@ public class MediaSession2 implements AutoCloseable { } // TODO: check allowed commands. - final long token = Binder.clearCallingIdentity(); - try { - synchronized (mLock) { - controllerInfo.addRequestedCommandSeqNumber(seq); + synchronized (mLock) { + controllerInfo.addRequestedCommandSeqNumber(seq); + } + mCallbackExecutor.execute(() -> { + if (!controllerInfo.removeRequestedCommandSeqNumber(seq)) { + resultReceiver.send(RESULT_INFO_SKIPPED, null); + return; } - - mCallbackExecutor.execute(() -> { - if (!controllerInfo.removeRequestedCommandSeqNumber(seq)) { - resultReceiver.send(RESULT_INFO_SKIPPED, null); - return; - } - Session2Command.Result result = mCallback.onSessionCommand( - MediaSession2.this, controllerInfo, command, args); - if (resultReceiver != null) { - if (result == null) { - throw new RuntimeException("onSessionCommand shouldn't return null"); - } else { - resultReceiver.send(result.getResultCode(), result.getResultData()); - } + Session2Command.Result result = mCallback.onSessionCommand( + MediaSession2.this, controllerInfo, command, args); + if (resultReceiver != null) { + if (result == null) { + throw new RuntimeException("onSessionCommand shouldn't return null"); + } else { + resultReceiver.send(result.getResultCode(), result.getResultData()); } - }); - } finally { - Binder.restoreCallingIdentity(token); - } + } + }); } // Called by Session2Link.onCancelCommand - void onCancelCommand(final Controller2Link controller, final int seq) { + void onCancelCommand(@NonNull final Controller2Link controller, final int seq) { final ControllerInfo controllerInfo; synchronized (mLock) { controllerInfo = mConnectedControllers.get(controller); @@ -367,13 +357,15 @@ public class MediaSession2 implements AutoCloseable { if (controllerInfo == null) { return; } + controllerInfo.removeRequestedCommandSeqNumber(seq); + } - final long token = Binder.clearCallingIdentity(); - try { - controllerInfo.removeRequestedCommandSeqNumber(seq); - } finally { - Binder.restoreCallingIdentity(token); + private List<ControllerInfo> getConnectedControllers() { + List<ControllerInfo> controllers = new ArrayList<>(); + synchronized (mLock) { + controllers.addAll(mConnectedControllers.values()); } + return controllers; } /** @@ -660,6 +652,8 @@ public class MediaSession2 implements AutoCloseable { * This API is not generally intended for third party application developers. */ public abstract static class SessionCallback { + ForegroundServiceEventCallback mForegroundServiceEventCallback; + /** * Called when a controller is created for this session. Return allowed commands for * controller. By default it returns {@code null}. @@ -716,5 +710,19 @@ public class MediaSession2 implements AutoCloseable { public void onCommandResult(@NonNull MediaSession2 session, @NonNull ControllerInfo controller, @NonNull Object token, @NonNull Session2Command command, @NonNull Session2Command.Result result) {} + + final void onSessionClosed(MediaSession2 session) { + if (mForegroundServiceEventCallback != null) { + mForegroundServiceEventCallback.onSessionClosed(session); + } + } + + void setForegroundServiceEventCallback(ForegroundServiceEventCallback callback) { + mForegroundServiceEventCallback = callback; + } + + abstract static class ForegroundServiceEventCallback { + public void onSessionClosed(MediaSession2 session) {} + } } } diff --git a/media/java/android/media/MediaSession2Service.java b/media/java/android/media/MediaSession2Service.java new file mode 100644 index 000000000000..8fb00fe487e8 --- /dev/null +++ b/media/java/android/media/MediaSession2Service.java @@ -0,0 +1,288 @@ +/* + * Copyright 2019 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.media; + +import android.annotation.CallSuper; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.app.Service; +import android.content.Intent; +import android.os.Binder; +import android.os.Bundle; +import android.os.Handler; +import android.os.IBinder; +import android.util.ArrayMap; +import android.util.Log; + +import com.android.internal.annotations.GuardedBy; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * Service containing {@link MediaSession2}. + * <p> + * This API is not generally intended for third party application developers. + * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a> + * <a href="{@docRoot}reference/androidx/media2/package-summary.html">Media2 Library</a> + * for consistent behavior across all devices. + * @hide + */ +// TODO: Unhide +// TODO: Add onUpdateNotification(), and calls it to get Notification for startForegroundService() +// when a session's player state becomes playing. +public abstract class MediaSession2Service extends Service { + /** + * The {@link Intent} that must be declared as handled by the service. + */ + public static final String SERVICE_INTERFACE = "android.media.MediaSession2Service"; + + private static final String TAG = "MediaSession2Service"; + private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); + + private final Object mLock = new Object(); + @GuardedBy("mLock") + private Map<String, MediaSession2> mSessions = new ArrayMap<>(); + + private MediaSession2ServiceStub mStub; + + /** + * Called by the system when the service is first created. Do not call this method directly. + * <p> + * Override this method if you need your own initialization. Derived classes MUST call through + * to the super class's implementation of this method. + */ + @CallSuper + @Override + public void onCreate() { + super.onCreate(); + mStub = new MediaSession2ServiceStub(this); + } + + @CallSuper + @Override + @Nullable + public IBinder onBind(@NonNull Intent intent) { + if (SERVICE_INTERFACE.equals(intent.getAction())) { + return mStub; + } + return null; + } + + @CallSuper + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + // TODO: Dispatch media key events to the primary session. + return START_STICKY; + } + + /** + * Called by the system to notify that it is no longer used and is being removed. Do not call + * this method directly. + * <p> + * Override this method if you need your own clean up. Derived classes MUST call through + * to the super class's implementation of this method. + */ + @CallSuper + @Override + public void onDestroy() { + super.onDestroy(); + synchronized (mLock) { + for (MediaSession2 session : mSessions.values()) { + session.getCallback().setForegroundServiceEventCallback(null); + } + mSessions.clear(); + } + mStub.close(); + } + + /** + * Called when a {@link MediaController2} is created with the this service's + * {@link Session2Token}. Return the primary session for telling the controller which session to + * connect. + * <p> + * Primary session is the highest priority session that this service manages. Here are some + * recommendations of the primary session. + * <ol> + * <li>When there's no {@link MediaSession2}, create and return a new session. Resume the + * playback that the app has the lastly played with the new session. The behavior is what + * framework expects when the framework sends key events to the service.</li> + * <li>When there's multiple {@link MediaSession2}s, pick the session that has the lastly + * started the playback. This is the same way as the framework prioritize sessions to receive + * media key events.</li> + * </ol> + * <p> + * Session returned here will be added to this service automatically. You don't need to call + * {@link #addSession(MediaSession2)} for that. + * <p> + * Session service will accept or reject the connection with the + * {@link MediaSession2.SessionCallback} in the session returned here. + * <p> + * This method is always called on the main thread. + * + * @return a new session + * @see MediaSession2.Builder + * @see #getSessions() + */ + @NonNull + public abstract MediaSession2 onGetPrimarySession(); + + /** + * Adds a session to this service. + * <p> + * Added session will be removed automatically when it's closed, or removed when + * {@link #removeSession} is called. + * + * @param session a session to be added. + * @see #removeSession(MediaSession2) + */ + public final void addSession(@NonNull MediaSession2 session) { + if (session == null) { + throw new IllegalArgumentException("session shouldn't be null"); + } + if (session.isClosed()) { + throw new IllegalArgumentException("session is already closed"); + } + synchronized (mLock) { + MediaSession2 previousSession = mSessions.get(session.getSessionId()); + if (previousSession != session) { + if (previousSession != null) { + Log.w(TAG, "Session ID should be unique, ID=" + session.getSessionId() + + ", previous=" + previousSession + ", session=" + session); + } + return; + } + mSessions.put(session.getSessionId(), session); + session.getCallback().setForegroundServiceEventCallback( + new MediaSession2.SessionCallback.ForegroundServiceEventCallback() { + @Override + public void onSessionClosed(MediaSession2 session) { + removeSession(session); + } + }); + } + } + + /** + * Removes a session from this service. + * + * @param session a session to be removed. + * @see #addSession(MediaSession2) + */ + public final void removeSession(@NonNull MediaSession2 session) { + if (session == null) { + throw new IllegalArgumentException("session shouldn't be null"); + } + synchronized (mLock) { + mSessions.remove(session.getSessionId()); + } + } + + /** + * Gets the list of {@link MediaSession2}s that you've added to this service. + * + * @return sessions + */ + public final @NonNull List<MediaSession2> getSessions() { + List<MediaSession2> list = new ArrayList<>(); + synchronized (mLock) { + list.addAll(mSessions.values()); + } + return list; + } + + private static final class MediaSession2ServiceStub extends IMediaSession2Service.Stub + implements AutoCloseable { + final WeakReference<MediaSession2Service> mService; + final Handler mHandler; + + MediaSession2ServiceStub(MediaSession2Service service) { + mService = new WeakReference<>(service); + mHandler = new Handler(service.getMainLooper()); + } + + @Override + public void connect(Controller2Link caller, int seq, Bundle connectionRequest) { + if (mService.get() == null) { + if (DEBUG) { + Log.d(TAG, "Service is already destroyed"); + } + return; + } + if (caller == null || connectionRequest == null) { + if (DEBUG) { + Log.d(TAG, "Ignoring calls with illegal arguments, caller=" + caller + + ", connectionRequest=" + connectionRequest); + } + return; + } + final int pid = Binder.getCallingPid(); + final int uid = Binder.getCallingUid(); + final long token = Binder.clearCallingIdentity(); + try { + mHandler.post(() -> { + boolean shouldNotifyDisconnected = true; + try { + final MediaSession2Service service = mService.get(); + if (service == null) { + if (DEBUG) { + Log.d(TAG, "Service isn't available"); + } + return; + } + if (DEBUG) { + Log.d(TAG, "Handling incoming connection request from the" + + " controller, controller=" + caller + ", uid=" + uid); + } + final MediaSession2 session; + session = service.onGetPrimarySession(); + service.addSession(session); + shouldNotifyDisconnected = false; + session.onConnect(caller, pid, uid, seq, connectionRequest); + } catch (Exception e) { + // Don't propagate exception in service to the controller. + Log.w(TAG, "Failed to add a session to session service", e); + } finally { + // Trick to call onDisconnected() in one place. + if (shouldNotifyDisconnected) { + if (DEBUG) { + Log.d(TAG, "Service has destroyed prematurely." + + " Rejecting connection"); + } + try { + caller.notifyDisconnected(0); + } catch (RuntimeException e) { + // Controller may be died prematurely. + // Not an issue because we'll ignore it anyway. + } + } + } + }); + } finally { + Binder.restoreCallingIdentity(token); + } + } + + @Override + public void close() { + mHandler.removeCallbacksAndMessages(null); + mService.clear(); + } + } +} diff --git a/media/java/android/media/Session2Link.java b/media/java/android/media/Session2Link.java index 5fe558da12f5..08664aa3b38f 100644 --- a/media/java/android/media/Session2Link.java +++ b/media/java/android/media/Session2Link.java @@ -17,6 +17,7 @@ package android.media; import android.annotation.NonNull; +import android.os.Binder; import android.os.Bundle; import android.os.IBinder; import android.os.Parcel; @@ -145,8 +146,9 @@ public final class Session2Link implements Parcelable { } /** Stub implementation for IMediaSession2.connect */ - public void onConnect(final Controller2Link caller, int seq, Bundle connectionRequest) { - mSession.onConnect(caller, seq, connectionRequest); + public void onConnect(final Controller2Link caller, int pid, int uid, int seq, + Bundle connectionRequest) { + mSession.onConnect(caller, pid, uid, seq, connectionRequest); } /** Stub implementation for IMediaSession2.disconnect */ @@ -168,23 +170,57 @@ public final class Session2Link implements Parcelable { private class Session2Stub extends IMediaSession2.Stub { @Override public void connect(final Controller2Link caller, int seq, Bundle connectionRequest) { - Session2Link.this.onConnect(caller, seq, connectionRequest); + if (caller == null || connectionRequest == null) { + return; + } + final int pid = Binder.getCallingPid(); + final int uid = Binder.getCallingUid(); + final long token = Binder.clearCallingIdentity(); + try { + Session2Link.this.onConnect(caller, pid, uid, seq, connectionRequest); + } finally { + Binder.restoreCallingIdentity(token); + } } @Override public void disconnect(final Controller2Link caller, int seq) { - Session2Link.this.onDisconnect(caller, seq); + if (caller == null) { + return; + } + final long token = Binder.clearCallingIdentity(); + try { + Session2Link.this.onDisconnect(caller, seq); + } finally { + Binder.restoreCallingIdentity(token); + } } @Override public void sendSessionCommand(final Controller2Link caller, final int seq, final Session2Command command, final Bundle args, ResultReceiver resultReceiver) { - Session2Link.this.onSessionCommand(caller, seq, command, args, resultReceiver); + if (caller == null) { + return; + } + final long token = Binder.clearCallingIdentity(); + try { + Session2Link.this.onSessionCommand(caller, seq, command, args, resultReceiver); + } finally { + Binder.restoreCallingIdentity(token); + } } @Override public void cancelSessionCommand(final Controller2Link caller, final int seq) { - Session2Link.this.onCancelCommand(caller, seq); + if (caller == null) { + return; + } + final long token = Binder.clearCallingIdentity(); + try { + Session2Link.this.onCancelCommand(caller, seq); + } finally { + Binder.restoreCallingIdentity(token); + } } } } diff --git a/media/java/android/media/Session2Token.java b/media/java/android/media/Session2Token.java index 95ee4c039f4b..c7b891151201 100644 --- a/media/java/android/media/Session2Token.java +++ b/media/java/android/media/Session2Token.java @@ -152,9 +152,7 @@ public final class Session2Token implements Parcelable { mType = in.readInt(); mPackageName = in.readString(); mServiceName = in.readString(); - // TODO: Uncomment below and stop hardcode mSessionLink - mSessionLink = null; - //mSessionLink = ISession.Stub.asInterface(in.readStrongBinder()); + mSessionLink = Session2Link.CREATOR.createFromParcel(in); mComponentName = ComponentName.unflattenFromString(in.readString()); } @@ -164,8 +162,7 @@ public final class Session2Token implements Parcelable { dest.writeInt(mType); dest.writeString(mPackageName); dest.writeString(mServiceName); - // TODO: Uncomment below - //dest.writeStrongBinder(mSessionLink.getBinder()); + mSessionLink.writeToParcel(dest, flags); dest.writeString(mComponentName == null ? "" : mComponentName.flattenToString()); } diff --git a/media/java/android/media/session/MediaSessionProviderService.java b/media/java/android/media/session/MediaSessionProviderService.java new file mode 100644 index 000000000000..9a346ff4a12e --- /dev/null +++ b/media/java/android/media/session/MediaSessionProviderService.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2019 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.media.session; + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; + +/** + * Abstract class for mainline module services. + * + * @hide // TODO: Make it as a @SystemApi + */ +public abstract class MediaSessionProviderService extends Service { + + @Override + public IBinder onBind(Intent intent) { + // TODO: Return IMediaSessionProviderService.Stub() + return null; + } +} diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp index 7b07bea3cf1a..9c519963b5cb 100644 --- a/media/jni/android_media_MediaCodec.cpp +++ b/media/jni/android_media_MediaCodec.cpp @@ -648,7 +648,6 @@ static jobject getCodecCapabilitiesObject( capabilities->getSupportedColorFormats(&colorFormats); capabilities->getSupportedProfileLevels(&profileLevels); - uint32_t flags = capabilities->getFlags(); sp<AMessage> details = capabilities->getDetails(); jobject defaultFormatObj = NULL; @@ -687,7 +686,7 @@ static jobject getCodecCapabilitiesObject( return env->NewObject( gCodecInfo.capsClazz, gCodecInfo.capsCtorId, - profileLevelArray.get(), colorFormatsArray.get(), isEncoder, flags, + profileLevelArray.get(), colorFormatsArray.get(), isEncoder, defaultFormatRef.get(), detailsRef.get()); } @@ -700,23 +699,28 @@ status_t JMediaCodec::getCodecInfo(JNIEnv *env, jobject *codecInfoObject) const return err; } + // TODO: get alias ScopedLocalRef<jstring> nameObject(env, env->NewStringUTF(codecInfo->getCodecName())); + ScopedLocalRef<jstring> canonicalNameObject(env, + env->NewStringUTF(codecInfo->getCodecName())); + + MediaCodecInfo::Attributes attributes = codecInfo->getAttributes(); bool isEncoder = codecInfo->isEncoder(); - Vector<AString> mimes; - codecInfo->getSupportedMimes(&mimes); + Vector<AString> mediaTypes; + codecInfo->getSupportedMediaTypes(&mediaTypes); ScopedLocalRef<jobjectArray> capsArrayObj(env, - env->NewObjectArray(mimes.size(), gCodecInfo.capsClazz, NULL)); + env->NewObjectArray(mediaTypes.size(), gCodecInfo.capsClazz, NULL)); - for (size_t i = 0; i < mimes.size(); i++) { + for (size_t i = 0; i < mediaTypes.size(); i++) { const sp<MediaCodecInfo::Capabilities> caps = - codecInfo->getCapabilitiesFor(mimes[i].c_str()); + codecInfo->getCapabilitiesFor(mediaTypes[i].c_str()); ScopedLocalRef<jobject> capsObj(env, getCodecCapabilitiesObject( - env, mimes[i].c_str(), isEncoder, caps)); + env, mediaTypes[i].c_str(), isEncoder, caps)); env->SetObjectArrayElement(capsArrayObj.get(), i, capsObj.get()); } @@ -729,7 +733,7 @@ status_t JMediaCodec::getCodecInfo(JNIEnv *env, jobject *codecInfoObject) const "(Ljava/lang/String;Z[Landroid/media/MediaCodecInfo$CodecCapabilities;)V"); *codecInfoObject = env->NewObject(codecInfoClazz.get(), codecInfoCtorID, - nameObject.get(), isEncoder, capsArrayObj.get()); + nameObject.get(), canonicalNameObject.get(), attributes, capsArrayObj.get()); return OK; } @@ -2079,7 +2083,7 @@ static void android_media_MediaCodec_native_init(JNIEnv *env) { gCodecInfo.capsClazz = (jclass)env->NewGlobalRef(clazz.get()); method = env->GetMethodID(clazz.get(), "<init>", - "([Landroid/media/MediaCodecInfo$CodecProfileLevel;[IZI" + "([Landroid/media/MediaCodecInfo$CodecProfileLevel;[IZ" "Ljava/util/Map;Ljava/util/Map;)V"); CHECK(method != NULL); gCodecInfo.capsCtorId = method; @@ -2217,7 +2221,7 @@ static const JNINativeMethod gMethods[] = { { "getImage", "(ZI)Landroid/media/Image;", (void *)android_media_MediaCodec_getImage }, - { "getName", "()Ljava/lang/String;", + { "getCanonicalName", "()Ljava/lang/String;", (void *)android_media_MediaCodec_getName }, { "getOwnCodecInfo", "()Landroid/media/MediaCodecInfo;", diff --git a/media/jni/android_media_MediaCodecList.cpp b/media/jni/android_media_MediaCodecList.cpp index 8de11caf7d7a..cf1494296756 100644 --- a/media/jni/android_media_MediaCodecList.cpp +++ b/media/jni/android_media_MediaCodecList.cpp @@ -41,6 +41,21 @@ static sp<IMediaCodecList> getCodecList(JNIEnv *env) { return mcl; } +static sp<MediaCodecInfo> getCodecInfo(JNIEnv *env, jint index) { + sp<IMediaCodecList> mcl = getCodecList(env); + if (mcl == NULL) { + // Runtime exception already pending. + return NULL; + } + + sp<MediaCodecInfo> info = mcl->getCodecInfo(index); + if (info == NULL) { + jniThrowException(env, "java/lang/IllegalArgumentException", NULL); + } + + return info; +} + static jint android_media_MediaCodecList_getCodecCount( JNIEnv *env, jobject /* thiz */) { sp<IMediaCodecList> mcl = getCodecList(env); @@ -53,15 +68,22 @@ static jint android_media_MediaCodecList_getCodecCount( static jstring android_media_MediaCodecList_getCodecName( JNIEnv *env, jobject /* thiz */, jint index) { - sp<IMediaCodecList> mcl = getCodecList(env); - if (mcl == NULL) { + sp<MediaCodecInfo> info = getCodecInfo(env, index); + if (info == NULL) { // Runtime exception already pending. return NULL; } - const sp<MediaCodecInfo> &info = mcl->getCodecInfo(index); + // TODO: support aliases + const char *name = info->getCodecName(); + return env->NewStringUTF(name); +} + +static jstring android_media_MediaCodecList_getCanonicalName( + JNIEnv *env, jobject /* thiz */, jint index) { + sp<MediaCodecInfo> info = getCodecInfo(env, index); if (info == NULL) { - jniThrowException(env, "java/lang/IllegalArgumentException", NULL); + // Runtime exception already pending. return NULL; } @@ -94,39 +116,27 @@ static jint android_media_MediaCodecList_findCodecByName( return ret; } -static jboolean android_media_MediaCodecList_isEncoder( +static jboolean android_media_MediaCodecList_getAttributes( JNIEnv *env, jobject /* thiz */, jint index) { - sp<IMediaCodecList> mcl = getCodecList(env); - if (mcl == NULL) { - // Runtime exception already pending. - return false; - } - - const sp<MediaCodecInfo> &info = mcl->getCodecInfo(index); + sp<MediaCodecInfo> info = getCodecInfo(env, index); if (info == NULL) { - jniThrowException(env, "java/lang/IllegalArgumentException", NULL); - return false; + // Runtime exception already pending. + return 0; } - return info->isEncoder(); + return info->getAttributes(); } static jarray android_media_MediaCodecList_getSupportedTypes( JNIEnv *env, jobject /* thiz */, jint index) { - sp<IMediaCodecList> mcl = getCodecList(env); - if (mcl == NULL) { - // Runtime exception already pending. - return NULL; - } - - const sp<MediaCodecInfo> &info = mcl->getCodecInfo(index); + sp<MediaCodecInfo> info = getCodecInfo(env, index); if (info == NULL) { - jniThrowException(env, "java/lang/IllegalArgumentException", NULL); + // Runtime exception already pending. return NULL; } Vector<AString> types; - info->getSupportedMimes(&types); + info->getSupportedMediaTypes(&types); jclass clazz = env->FindClass("java/lang/String"); CHECK(clazz != NULL); @@ -150,17 +160,12 @@ static jobject android_media_MediaCodecList_getCodecCapabilities( return NULL; } - sp<IMediaCodecList> mcl = getCodecList(env); - if (mcl == NULL) { + sp<MediaCodecInfo> info = getCodecInfo(env, index); + if (info == NULL) { // Runtime exception already pending. return NULL; } - const sp<MediaCodecInfo> &info = mcl->getCodecInfo(index); - if (info == NULL) { - jniThrowException(env, "java/lang/IllegalArgumentException", NULL); - return NULL; - } const char *typeStr = env->GetStringUTFChars(type, NULL); if (typeStr == NULL) { @@ -186,7 +191,6 @@ static jobject android_media_MediaCodecList_getCodecCapabilities( capabilities->getSupportedColorFormats(&colorFormats); capabilities->getSupportedProfileLevels(&profileLevels); - uint32_t flags = capabilities->getFlags(); sp<AMessage> details = capabilities->getDetails(); bool isEncoder = info->isEncoder(); @@ -240,11 +244,11 @@ static jobject android_media_MediaCodecList_getCodecCapabilities( } jmethodID capsConstructID = env->GetMethodID(capsClazz, "<init>", - "([Landroid/media/MediaCodecInfo$CodecProfileLevel;[IZI" + "([Landroid/media/MediaCodecInfo$CodecProfileLevel;[IZ" "Ljava/util/Map;Ljava/util/Map;)V"); jobject caps = env->NewObject(capsClazz, capsConstructID, - profileLevelArray, colorFormatsArray, isEncoder, flags, + profileLevelArray, colorFormatsArray, isEncoder, defaultFormatObj, infoObj); env->DeleteLocalRef(profileLevelArray); @@ -288,9 +292,15 @@ static void android_media_MediaCodecList_native_init(JNIEnv* /* env */) { static const JNINativeMethod gMethods[] = { { "native_getCodecCount", "()I", (void *)android_media_MediaCodecList_getCodecCount }, + + { "getCanonicalName", "(I)Ljava/lang/String;", + (void *)android_media_MediaCodecList_getCanonicalName }, + { "getCodecName", "(I)Ljava/lang/String;", (void *)android_media_MediaCodecList_getCodecName }, - { "isEncoder", "(I)Z", (void *)android_media_MediaCodecList_isEncoder }, + + { "getAttributes", "(I)I", (void *)android_media_MediaCodecList_getAttributes }, + { "getSupportedTypes", "(I)[Ljava/lang/String;", (void *)android_media_MediaCodecList_getSupportedTypes }, diff --git a/media/packages/MediaCore/Android.bp b/media/packages/MediaCore/Android.bp new file mode 100644 index 000000000000..c7fd58bf933a --- /dev/null +++ b/media/packages/MediaCore/Android.bp @@ -0,0 +1,21 @@ +android_app { + name: "MediaCore", + + srcs: [ + "src/**/*.java", + ], + + static_libs: [ + // TODO: Temporarily statically linked. Should go into "libs" + "media1", + ], + + // System app + platform_apis: true, + + // Privileged app + privileged: true, + + // Make sure that the implementation only relies on SDK or system APIs. + sdk_version: "system_current", +} diff --git a/media/packages/MediaCore/AndroidManifest.xml b/media/packages/MediaCore/AndroidManifest.xml new file mode 100644 index 000000000000..4e2b274511e8 --- /dev/null +++ b/media/packages/MediaCore/AndroidManifest.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* //device/apps/common/AndroidManifest.xml +** +** Copyright 2019, 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. +*/ +--> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.media" coreApp="true" android:sharedUserId="android.uid.system" + android:sharedUserLabel="@string/android_system_label"> + <application android:process="system" + android:persistent="true" + android:directBootAware="true"> + <service android:name="AmlMediaSessionProviderService" android:singleUser="true"> + <intent-filter> + <action android:name="android.media.session.MediaSessionProviderService"/> + </intent-filter> + </service> + </application> +</manifest> diff --git a/media/packages/MediaCore/res/values/strings.xml b/media/packages/MediaCore/res/values/strings.xml new file mode 100644 index 000000000000..59fd635b905f --- /dev/null +++ b/media/packages/MediaCore/res/values/strings.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2019 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. +--> + +<resources> + <!-- Label for the Android system components when they are shown to the user. --> + <string name="android_system_label" translatable="false">Android System</string> +</resources> + diff --git a/media/packages/MediaCore/src/com/android/media/AmlMediaSessionProviderService.java b/media/packages/MediaCore/src/com/android/media/AmlMediaSessionProviderService.java new file mode 100644 index 000000000000..43b95ab7ebdb --- /dev/null +++ b/media/packages/MediaCore/src/com/android/media/AmlMediaSessionProviderService.java @@ -0,0 +1,37 @@ +/* + * Copyright 2019 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.media; + +import android.content.Context; +import android.media.session.MediaSessionProviderService; +import android.os.PowerManager; +import android.util.Log; + +/** + * System implementation of MediaSessionProviderService + */ +public class AmlMediaSessionProviderService extends MediaSessionProviderService { + private static final String TAG = "AmlMediaSessionProviderS"; + static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); + + private Context mContext; + + public AmlMediaSessionProviderService(Context context) { + mContext = context; + PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); + } +} diff --git a/native/android/sensor.cpp b/native/android/sensor.cpp index 8e5821024cee..c3b2e2526ea8 100644 --- a/native/android/sensor.cpp +++ b/native/android/sensor.cpp @@ -342,3 +342,8 @@ int ASensor_getHighestDirectReportRateLevel(ASensor const *sensor) { RETURN_IF_SENSOR_IS_NULL(ASENSOR_DIRECT_RATE_STOP); return static_cast<Sensor const *>(sensor)->getHighestDirectReportRateLevel(); } + +int ASensor_getHandle(ASensor const* sensor) { + RETURN_IF_SENSOR_IS_NULL(ASENSOR_INVALID); + return static_cast<Sensor const*>(sensor)->getHandle(); +} diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java index 18bdb20ad0a6..e843eb43a3a6 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java @@ -705,14 +705,17 @@ class SettingsProtoDumpUtil { Settings.Global.GPU_DEBUG_LAYERS_GLES, GlobalSettingsProto.Gpu.DEBUG_LAYERS_GLES); dumpSetting(s, p, + Settings.Global.GUP_DEV_ALL_APPS, + GlobalSettingsProto.Gpu.GUP_DEV_ALL_APPS); + dumpSetting(s, p, Settings.Global.GUP_DEV_OPT_IN_APPS, GlobalSettingsProto.Gpu.GUP_DEV_OPT_IN_APPS); dumpSetting(s, p, Settings.Global.GUP_DEV_OPT_OUT_APPS, GlobalSettingsProto.Gpu.GUP_DEV_OPT_OUT_APPS); dumpSetting(s, p, - Settings.Global.GUP_BLACK_LIST, - GlobalSettingsProto.Gpu.GUP_BLACK_LIST); + Settings.Global.GUP_BLACKLIST, + GlobalSettingsProto.Gpu.GUP_BLACKLIST); p.end(gpuToken); final long hdmiToken = p.start(GlobalSettingsProto.HDMI); @@ -1879,6 +1882,9 @@ class SettingsProtoDumpUtil { dumpSetting(s, p, Settings.Secure.DOZE_DOUBLE_TAP_GESTURE, SecureSettingsProto.Doze.PULSE_ON_DOUBLE_TAP); + dumpSetting(s, p, + Settings.Secure.DOZE_TAP_SCREEN_GESTURE, + SecureSettingsProto.Doze.PULSE_ON_TAP); p.end(dozeToken); dumpSetting(s, p, diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index bce559396ddd..5153f9ea86d1 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -1052,7 +1052,7 @@ public class SettingsProvider extends ContentProvider { } // TODO(b/117663715): Ensure the caller can access the setting. - // enforceSettingReadable(name, SETTINGS_TYPE_CONFIG, UserHandle.getCallingUserId()); + // enforceReadPermission(READ_DEVICE_CONFIG); // Get the value. synchronized (mLock) { @@ -1088,8 +1088,9 @@ public class SettingsProvider extends ContentProvider { private boolean mutateConfigSetting(String name, String value, String prefix, boolean makeDefault, int operation, int mode) { - // TODO(b/117663715): check the new permission when it's added. - // enforceWritePermission(Manifest.permission.WRITE_SECURE_SETTINGS); + + // TODO(b/117663715): Ensure the caller can access the setting. + // enforceReadPermission(WRITE_DEVICE_CONFIG); // Perform the mutation. synchronized (mLock) { diff --git a/packages/SettingsProvider/test/AndroidManifest.xml b/packages/SettingsProvider/test/AndroidManifest.xml index 87a4f603f70b..ebdf9b1a2791 100644 --- a/packages/SettingsProvider/test/AndroidManifest.xml +++ b/packages/SettingsProvider/test/AndroidManifest.xml @@ -20,6 +20,8 @@ <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.WRITE_SETTINGS"/> + <uses-permission android:name="android.permission.WRITE_DEVICE_CONFIG"/> + <uses-permission android:name="android.permission.READ_DEVICE_CONFIG"/> <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/> <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"/> <uses-permission android:name="android.permission.MANAGE_USERS"/> diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index 9b775e058ea8..b903142c44c6 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -57,6 +57,8 @@ <uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /> + <uses-permission android:name="android.permission.READ_DEVICE_CONFIG" /> + <uses-permission android:name="android.permission.WRITE_DEVICE_CONFIG" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.permission.MANAGE_ACCESSIBILITY" /> <!-- Development tool permissions granted to the shell. --> diff --git a/packages/SystemUI/res-keyguard/layout/bubble_clock.xml b/packages/SystemUI/res-keyguard/layout/bubble_clock.xml index 0d72657bb2df..6f7f39810608 100644 --- a/packages/SystemUI/res-keyguard/layout/bubble_clock.xml +++ b/packages/SystemUI/res-keyguard/layout/bubble_clock.xml @@ -19,15 +19,9 @@ android:layout_width="match_parent" android:layout_height="match_parent" > - <TextClock + <include android:id="@+id/digital_clock" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:letterSpacing="0.03" - android:singleLine="true" - style="@style/widget_big" - android:format12Hour="@string/keyguard_widget_12_hours_format" - android:format24Hour="@string/keyguard_widget_24_hours_format" + layout="@layout/text_clock" /> <com.android.keyguard.clock.ImageClock android:id="@+id/analog_clock" diff --git a/packages/SystemUI/res-keyguard/layout/digital_clock.xml b/packages/SystemUI/res-keyguard/layout/digital_clock.xml index cf4a573834dd..e88e2c94e74f 100644 --- a/packages/SystemUI/res-keyguard/layout/digital_clock.xml +++ b/packages/SystemUI/res-keyguard/layout/digital_clock.xml @@ -20,16 +20,9 @@ android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_alignParentTop="true"> - <TextClock + <include android:id="@+id/lock_screen_clock" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_horizontal" - android:letterSpacing="0.03" - android:singleLine="true" - style="@style/widget_big" - android:format12Hour="@string/keyguard_widget_12_hours_format" - android:format24Hour="@string/keyguard_widget_24_hours_format" /> + layout="@layout/text_clock" /> </FrameLayout> diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml b/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml index d52866fbd444..463367b2c600 100644 --- a/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml +++ b/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml @@ -30,17 +30,9 @@ android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_alignParentTop="true"> - <TextClock + <include android:id="@+id/default_clock_view" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_horizontal" - android:letterSpacing="0.03" - android:textColor="?attr/wallpaperTextColor" - android:singleLine="true" - style="@style/widget_big" - android:format12Hour="@string/keyguard_widget_12_hours_format" - android:format24Hour="@string/keyguard_widget_24_hours_format" /> + layout="@layout/text_clock" /> </FrameLayout> <include layout="@layout/keyguard_status_area" android:id="@+id/keyguard_status_area" diff --git a/packages/SystemUI/res-keyguard/layout/stretchanalog_clock.xml b/packages/SystemUI/res-keyguard/layout/stretchanalog_clock.xml index 9033fce881c4..64b676f55fd6 100644 --- a/packages/SystemUI/res-keyguard/layout/stretchanalog_clock.xml +++ b/packages/SystemUI/res-keyguard/layout/stretchanalog_clock.xml @@ -19,15 +19,9 @@ android:layout_width="match_parent" android:layout_height="match_parent" > - <TextClock + <include android:id="@+id/digital_clock" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:letterSpacing="0.03" - android:singleLine="true" - style="@style/widget_big" - android:format12Hour="@string/keyguard_widget_12_hours_format" - android:format24Hour="@string/keyguard_widget_24_hours_format" + layout="@layout/text_clock" /> <com.android.keyguard.clock.StretchAnalogClock android:id="@+id/analog_clock" diff --git a/packages/SystemUI/res-keyguard/layout/text_clock.xml b/packages/SystemUI/res-keyguard/layout/text_clock.xml new file mode 100644 index 000000000000..b61ad9c4fc11 --- /dev/null +++ b/packages/SystemUI/res-keyguard/layout/text_clock.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. + --> +<TextClock + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:letterSpacing="0.03" + android:textColor="?attr/wallpaperTextColor" + android:singleLine="true" + style="@style/widget_big" + android:format12Hour="@string/keyguard_widget_12_hours_format" + android:format24Hour="@string/keyguard_widget_24_hours_format" + android:elegantTextHeight="false" +/> diff --git a/packages/SystemUI/res/layout/global_actions_wrapped.xml b/packages/SystemUI/res/layout/global_actions_wrapped.xml index 7f4e0d21078f..f932303473bd 100644 --- a/packages/SystemUI/res/layout/global_actions_wrapped.xml +++ b/packages/SystemUI/res/layout/global_actions_wrapped.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <com.android.systemui.HardwareUiLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@id/global_actions_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="top|right" diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 476089aa3aac..98f0cbe29110 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -106,7 +106,7 @@ <!-- The default tiles to display in QuickSettings --> <string name="quick_settings_tiles_default" translatable="false"> - wifi,bt,dnd,flashlight,rotation,battery,cell,airplane,cast + wifi,bt,dnd,flashlight,rotation,battery,cell,airplane,cast,sensorprivacy </string> <!-- Tiles native to System UI. Order should match "quick_settings_tiles_default" --> diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml index 633f8686b804..bd34beac7fd6 100644 --- a/packages/SystemUI/res/values/ids.xml +++ b/packages/SystemUI/res/values/ids.xml @@ -114,5 +114,8 @@ <item type="id" name="aod_mask_transition_progress_tag" /> <item type="id" name="aod_mask_transition_progress_end_tag" /> <item type="id" name="aod_mask_transition_progress_start_tag" /> + + <!-- Global Actions Menu --> + <item type="id" name="global_actions_view" /> </resources> diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java index a8094d20d5a2..e9ce1a670fe1 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java @@ -248,10 +248,6 @@ public class KeyguardClockSwitch extends RelativeLayout { mClockView.setShowCurrentUserTime(showCurrentUserTime); } - public void setElegantTextHeight(boolean elegant) { - mClockView.setElegantTextHeight(elegant); - } - public void setTextSize(int unit, float size) { mClockView.setTextSize(unit, size); } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java index f0cdc890306f..7ae4c41d318f 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java @@ -202,10 +202,6 @@ public class KeyguardStatusView extends GridLayout implements updateOwnerInfo(); updateLogoutView(); updateDark(); - - // Disable elegant text height because our fancy colon makes the ymin value huge for no - // reason. - mClockView.setElegantTextHeight(false); } /** diff --git a/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java b/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java index 16e869e9d317..e28aa9d369cb 100644 --- a/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java +++ b/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java @@ -37,23 +37,25 @@ import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService.Tunable; import com.android.systemui.util.leak.RotationUtils; -public class HardwareUiLayout extends LinearLayout implements Tunable { +/** + * Layout for placing two containers at a specific physical position on the device, relative to the + * device's hardware, regardless of screen rotation. + */ +public class HardwareUiLayout extends MultiListLayout implements Tunable { private static final String EDGE_BLEED = "sysui_hwui_edge_bleed"; private static final String ROUNDED_DIVIDER = "sysui_hwui_rounded_divider"; private final int[] mTmp2 = new int[2]; - private View mList; - private View mSeparatedView; + private ViewGroup mList; + private ViewGroup mSeparatedView; private int mOldHeight; private boolean mAnimating; private AnimatorSet mAnimation; private View mDivision; - private boolean mHasOutsideTouch; private HardwareBgDrawable mListBackground; private HardwareBgDrawable mSeparatedViewBackground; private Animator mAnimator; private boolean mCollapse; - private boolean mHasSeparatedButton; private int mEndPoint; private boolean mEdgeBleed; private boolean mRoundedDivider; @@ -67,6 +69,35 @@ public class HardwareUiLayout extends LinearLayout implements Tunable { } @Override + protected ViewGroup getSeparatedView() { + return findViewById(com.android.systemui.R.id.separated_button); + } + + @Override + protected ViewGroup getListView() { + return findViewById(android.R.id.list); + } + + @Override + public void removeAllItems() { + if (mList != null) { + mList.removeAllViews(); + } + if (mSeparatedView != null) { + mSeparatedView.removeAllViews(); + } + } + + @Override + public ViewGroup getParentView(boolean separated, int index) { + if (separated) { + return getSeparatedView(); + } else { + return getListView(); + } + } + + @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); updateSettings(); @@ -137,9 +168,9 @@ public class HardwareUiLayout extends LinearLayout implements Tunable { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (mList == null) { if (getChildCount() != 0) { - mList = getChildAt(0); + mList = getListView(); mList.setBackground(mListBackground); - mSeparatedView = getChildAt(1); + mSeparatedView = getSeparatedView(); mSeparatedView.setBackground(mSeparatedViewBackground); updateEdgeMargin(mEdgeBleed ? 0 : getEdgePadding()); mOldHeight = mList.getMeasuredHeight(); @@ -187,7 +218,7 @@ public class HardwareUiLayout extends LinearLayout implements Tunable { } else { rotateLeft(); } - if (mHasSeparatedButton) { + if (mHasSeparatedView) { if (from == ROTATION_SEASCAPE || to == ROTATION_SEASCAPE) { // Separated view has top margin, so seascape separated view need special rotation, // not a full left or right rotation. @@ -408,8 +439,8 @@ public class HardwareUiLayout extends LinearLayout implements Tunable { if (mList == null) return; // If got separated button, setRotatedBackground to false, // all items won't get white background. - mListBackground.setRotatedBackground(mHasSeparatedButton); - mSeparatedViewBackground.setRotatedBackground(mHasSeparatedButton); + mListBackground.setRotatedBackground(mHasSeparatedView); + mSeparatedViewBackground.setRotatedBackground(mHasSeparatedView); if (mDivision != null && mDivision.getVisibility() == VISIBLE) { int index = mRotatedBackground ? 0 : 1; mDivision.getLocationOnScreen(mTmp2); @@ -460,21 +491,21 @@ public class HardwareUiLayout extends LinearLayout implements Tunable { case RotationUtils.ROTATION_LANDSCAPE: defaultTopPadding = getPaddingLeft(); viewsTotalHeight = mList.getMeasuredWidth() + mSeparatedView.getMeasuredWidth(); - separatedViewTopMargin = mHasSeparatedButton ? params.leftMargin : 0; + separatedViewTopMargin = mHasSeparatedView ? params.leftMargin : 0; screenHeight = getMeasuredWidth(); targetGravity = Gravity.CENTER_HORIZONTAL|Gravity.TOP; break; case RotationUtils.ROTATION_SEASCAPE: defaultTopPadding = getPaddingRight(); viewsTotalHeight = mList.getMeasuredWidth() + mSeparatedView.getMeasuredWidth(); - separatedViewTopMargin = mHasSeparatedButton ? params.leftMargin : 0; + separatedViewTopMargin = mHasSeparatedView ? params.leftMargin : 0; screenHeight = getMeasuredWidth(); targetGravity = Gravity.CENTER_HORIZONTAL|Gravity.BOTTOM; break; default: // Portrait defaultTopPadding = getPaddingTop(); viewsTotalHeight = mList.getMeasuredHeight() + mSeparatedView.getMeasuredHeight(); - separatedViewTopMargin = mHasSeparatedButton ? params.topMargin : 0; + separatedViewTopMargin = mHasSeparatedView ? params.topMargin : 0; screenHeight = getMeasuredHeight(); targetGravity = Gravity.CENTER_VERTICAL|Gravity.RIGHT; break; @@ -491,30 +522,10 @@ public class HardwareUiLayout extends LinearLayout implements Tunable { return super.getOutlineProvider(); } - public void setOutsideTouchListener(OnClickListener onClickListener) { - mHasOutsideTouch = true; - requestLayout(); - setOnClickListener(onClickListener); - setClickable(true); - setFocusable(true); - } - public void setCollapse() { mCollapse = true; } - public void setHasSeparatedButton(boolean hasSeparatedButton) { - mHasSeparatedButton = hasSeparatedButton; - } - - public static HardwareUiLayout get(View v) { - if (v instanceof HardwareUiLayout) return (HardwareUiLayout) v; - if (v.getParent() instanceof View) { - return get((View) v.getParent()); - } - return null; - } - private final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsListener = inoutInfo -> { if (mHasOutsideTouch || (mList == null)) { inoutInfo.setTouchableInsets( diff --git a/packages/SystemUI/src/com/android/systemui/MultiListLayout.java b/packages/SystemUI/src/com/android/systemui/MultiListLayout.java new file mode 100644 index 000000000000..0c7a9a9fffd2 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/MultiListLayout.java @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2019 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; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; + +/** + * Layout class representing the Global Actions menu which appears when the power button is held. + */ +public abstract class MultiListLayout extends LinearLayout { + boolean mHasOutsideTouch; + boolean mHasSeparatedView; + + int mExpectedSeparatedItemCount; + int mExpectedListItemCount; + + public MultiListLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + protected abstract ViewGroup getSeparatedView(); + + protected abstract ViewGroup getListView(); + + /** + * Removes all child items from the separated and list views, if they exist. + */ + public abstract void removeAllItems(); + + /** + * Get the parent view which will be used to contain the item at the specified index. + * @param separated Whether or not this index refers to a position in the separated or list + * container. + * @param index The index of the item within the container. + * @return The parent ViewGroup which will be used to contain the specified item + * after it has been added to the layout. + */ + public abstract ViewGroup getParentView(boolean separated, int index); + + /** + * Sets the divided view, which may have a differently-colored background. + */ + public abstract void setDivisionView(View v); + + /** + * Set the view accessibility delegate for the list view container. + */ + public void setListViewAccessibilityDelegate(View.AccessibilityDelegate delegate) { + getListView().setAccessibilityDelegate(delegate); + } + + protected void setSeparatedViewVisibility(boolean visible) { + getSeparatedView().setVisibility(visible ? View.VISIBLE : View.GONE); + } + + /** + * Sets the number of items expected to be rendered in the separated container. This allows the + * layout to correctly determine which parent containers will be used for items before they have + * beenadded to the layout. + * @param count The number of items expected. + */ + public void setExpectedSeparatedItemCount(int count) { + mExpectedSeparatedItemCount = count; + } + + /** + * Sets the number of items expected to be rendered in the list container. This allows the + * layout to correctly determine which parent containers will be used for items before they have + * beenadded to the layout. + * @param count The number of items expected. + */ + public void setExpectedListItemCount(int count) { + mExpectedListItemCount = count; + } + + /** + * Sets whether the separated view should be shown, and handles updating visibility on + * that view. + */ + public void setHasSeparatedView(boolean hasSeparatedView) { + mHasSeparatedView = hasSeparatedView; + setSeparatedViewVisibility(hasSeparatedView); + } + + /** + * Sets this layout to respond to an outside touch listener. + */ + public void setOutsideTouchListener(OnClickListener onClickListener) { + mHasOutsideTouch = true; + requestLayout(); + setOnClickListener(onClickListener); + setClickable(true); + setFocusable(true); + } + + /** + * Retrieve the MultiListLayout associated with the given view. + */ + public static MultiListLayout get(View v) { + if (v instanceof MultiListLayout) return (MultiListLayout) v; + if (v.getParent() instanceof View) { + return get((View) v.getParent()); + } + return null; + } +} diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java b/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java index 4cb1feebcce4..bd7a421e9762 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java @@ -38,7 +38,13 @@ public interface DozeHost { void setAnimateWakeup(boolean animateWakeup); void setAnimateScreenOff(boolean animateScreenOff); - void onDoubleTap(float x, float y); + /** + * Reports that a tap event happend on the Sensors Low Power Island. + * + * @param x Touch X, or -1 if sensor doesn't support touch location. + * @param y Touch Y, or -1 if sensor doesn't support touch location. + */ + void onSlpiTap(float x, float y); default void setAodDimmingScrim(float scrimOpacity) {} void setDozeScreenBrightness(int value); diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java index 50003e3a6a38..a7847739cd00 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java @@ -35,7 +35,7 @@ public class DozeLog { private static final int SIZE = Build.IS_DEBUGGABLE ? 400 : 50; static final SimpleDateFormat FORMAT = new SimpleDateFormat("MM-dd HH:mm:ss.SSS"); - private static final int REASONS = 9; + private static final int REASONS = 10; public static final int PULSE_REASON_NONE = -1; public static final int PULSE_REASON_INTENT = 0; @@ -47,6 +47,7 @@ public class DozeLog { public static final int PULSE_REASON_DOCKING = 6; public static final int REASON_SENSOR_WAKE_UP = 7; public static final int PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN = 8; + public static final int PULSE_REASON_SENSOR_TAP = 9; private static boolean sRegisterKeyguardCallback = true; @@ -207,6 +208,7 @@ public class DozeLog { case PULSE_REASON_DOCKING: return "docking"; case PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN: return "wakelockscreen"; case REASON_SENSOR_WAKE_UP: return "wakeup"; + case PULSE_REASON_SENSOR_TAP: return "tap"; default: throw new IllegalArgumentException("bad reason: " + pulseReason); } } diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java index b6fc35553760..78374a0b1621 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java @@ -107,6 +107,13 @@ public class DozeSensors { dozeParameters.doubleTapReportsTouchCoordinates(), true /* touchscreen */), new TriggerSensor( + findSensorWithType(config.tapSensorType()), + Settings.Secure.DOZE_TAP_SCREEN_GESTURE, + true /* configured */, + DozeLog.PULSE_REASON_SENSOR_TAP, + false /* reports touch coordinates */, + true /* touchscreen */), + new TriggerSensor( findSensorWithType(config.longPressSensorType()), Settings.Secure.DOZE_PULSE_ON_LONG_PRESS, false /* settingDef */, diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java index 6a9b6899d509..e2e448bb0d0c 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java @@ -132,6 +132,7 @@ public class DozeTriggers implements DozeMachine.Part { private void onSensor(int pulseReason, boolean sensorPerformedProxCheck, float screenX, float screenY, float[] rawValues) { boolean isDoubleTap = pulseReason == DozeLog.PULSE_REASON_SENSOR_DOUBLE_TAP; + boolean isTap = pulseReason == DozeLog.PULSE_REASON_SENSOR_TAP; boolean isPickup = pulseReason == DozeLog.PULSE_REASON_SENSOR_PICKUP; boolean isLongPress = pulseReason == DozeLog.PULSE_REASON_SENSOR_LONG_PRESS; boolean isWakeDisplay = pulseReason == DozeLog.REASON_SENSOR_WAKE_UP; @@ -148,8 +149,10 @@ public class DozeTriggers implements DozeMachine.Part { // In pocket, drop event. return; } - if (isDoubleTap) { - mDozeHost.onDoubleTap(screenX, screenY); + if (isDoubleTap || isTap) { + if (screenX != -1 && screenY != -1) { + mDozeHost.onSlpiTap(screenX, screenY); + } mMachine.wakeUp(); } else if (isPickup) { mMachine.wakeUp(); diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java index 268245bd4acd..7b18fad0e105 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java @@ -67,10 +67,8 @@ import android.view.WindowManagerGlobal; import android.view.accessibility.AccessibilityEvent; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.BaseAdapter; -import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.ImageView.ScaleType; -import android.widget.LinearLayout; import android.widget.TextView; import com.android.internal.R; @@ -86,8 +84,8 @@ import com.android.internal.util.ScreenRecordHelper; import com.android.internal.util.ScreenshotHelper; import com.android.internal.widget.LockPatternUtils; import com.android.systemui.Dependency; -import com.android.systemui.HardwareUiLayout; import com.android.systemui.Interpolators; +import com.android.systemui.MultiListLayout; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.plugins.GlobalActions.GlobalActionsManager; import com.android.systemui.statusbar.phone.ScrimController; @@ -490,6 +488,11 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, public boolean showBeforeProvisioning() { return true; } + + @Override + public boolean shouldBeSeparated() { + return true; + } } private final class RestartAction extends SinglePressAction implements LongPressAction { @@ -926,6 +929,34 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, return getItem(position).isEnabled(); } + public ArrayList<Action> getSeparatedActions(boolean shouldUseSeparatedView) { + ArrayList<Action> separatedActions = new ArrayList<Action>(); + if (!shouldUseSeparatedView) { + return separatedActions; + } + for (int i = 0; i < mItems.size(); i++) { + final Action action = mItems.get(i); + if (action.shouldBeSeparated()) { + separatedActions.add(action); + } + } + return separatedActions; + } + + public ArrayList<Action> getListActions(boolean shouldUseSeparatedView) { + if (!shouldUseSeparatedView) { + return new ArrayList<Action>(mItems); + } + ArrayList<Action> listActions = new ArrayList<Action>(); + for (int i = 0; i < mItems.size(); i++) { + final Action action = mItems.get(i); + if (!action.shouldBeSeparated()) { + listActions.add(action); + } + } + return listActions; + } + @Override public boolean areAllItemsEnabled() { return false; @@ -965,7 +996,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, View view = action.create(mContext, convertView, parent, LayoutInflater.from(mContext)); // Everything but screenshot, the last item, gets white background. if (position == getCount() - 1) { - HardwareUiLayout.get(parent).setDivisionView(view); + MultiListLayout.get(parent).setDivisionView(view); } return view; } @@ -1004,6 +1035,10 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, boolean showBeforeProvisioning(); boolean isEnabled(); + + default boolean shouldBeSeparated() { + return false; + } } /** @@ -1423,9 +1458,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, private final Context mContext; private final MyAdapter mAdapter; - private final LinearLayout mListView; - private final FrameLayout mSeparatedView; - private final HardwareUiLayout mHardwareLayout; + private final MultiListLayout mGlobalActionsLayout; private final OnClickListener mClickListener; private final OnItemLongClickListener mLongClickListener; private final GradientDrawable mGradientDrawable; @@ -1466,16 +1499,11 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, window.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY); setContentView(com.android.systemui.R.layout.global_actions_wrapped); - mListView = findViewById(android.R.id.list); - mSeparatedView = findViewById(com.android.systemui.R.id.separated_button); - if (!mShouldDisplaySeparatedButton) { - mSeparatedView.setVisibility(View.GONE); - } - mHardwareLayout = HardwareUiLayout.get(mListView); - mHardwareLayout.setOutsideTouchListener(view -> dismiss()); - mHardwareLayout.setHasSeparatedButton(mShouldDisplaySeparatedButton); - setTitle(R.string.global_actions); - mListView.setAccessibilityDelegate(new View.AccessibilityDelegate() { + mGlobalActionsLayout = (MultiListLayout) + findViewById(com.android.systemui.R.id.global_actions_view); + mGlobalActionsLayout.setOutsideTouchListener(view -> dismiss()); + mGlobalActionsLayout.setHasSeparatedView(mShouldDisplaySeparatedButton); + mGlobalActionsLayout.setListViewAccessibilityDelegate(new View.AccessibilityDelegate() { @Override public boolean dispatchPopulateAccessibilityEvent( View host, AccessibilityEvent event) { @@ -1484,20 +1512,33 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, return true; } }); + setTitle(R.string.global_actions); } private void updateList() { - mListView.removeAllViews(); - mSeparatedView.removeAllViews(); + mGlobalActionsLayout.removeAllItems(); + ArrayList<Action> separatedActions = + mAdapter.getSeparatedActions(mShouldDisplaySeparatedButton); + ArrayList<Action> listActions = mAdapter.getListActions(mShouldDisplaySeparatedButton); + mGlobalActionsLayout.setExpectedListItemCount(listActions.size()); + mGlobalActionsLayout.setExpectedSeparatedItemCount(separatedActions.size()); + for (int i = 0; i < mAdapter.getCount(); i++) { - ViewGroup parentView = mShouldDisplaySeparatedButton && i == mAdapter.getCount() - 1 - ? mSeparatedView : mListView; - View v = mAdapter.getView(i, null, parentView); + Action action = mAdapter.getItem(i); + int separatedIndex = separatedActions.indexOf(action); + ViewGroup parent; + if (separatedIndex != -1) { + parent = mGlobalActionsLayout.getParentView(true, separatedIndex); + } else { + int listIndex = listActions.indexOf(action); + parent = mGlobalActionsLayout.getParentView(false, listIndex); + } + View v = mAdapter.getView(i, null, parent); final int pos = i; v.setOnClickListener(view -> mClickListener.onClick(this, pos)); v.setOnLongClickListener(view -> mLongClickListener.onItemLongClick(null, v, pos, 0)); - parentView.addView(v); + parent.addView(v); } } @@ -1543,9 +1584,9 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, super.show(); mShowing = true; mGradientDrawable.setAlpha(0); - mHardwareLayout.setTranslationX(getAnimTranslation()); - mHardwareLayout.setAlpha(0); - mHardwareLayout.animate() + mGlobalActionsLayout.setTranslationX(getAnimTranslation()); + mGlobalActionsLayout.setAlpha(0); + mGlobalActionsLayout.animate() .alpha(1) .translationX(0) .setDuration(300) @@ -1564,9 +1605,9 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, return; } mShowing = false; - mHardwareLayout.setTranslationX(0); - mHardwareLayout.setAlpha(1); - mHardwareLayout.animate() + mGlobalActionsLayout.setTranslationX(0); + mGlobalActionsLayout.setAlpha(1); + mGlobalActionsLayout.animate() .alpha(0) .translationX(getAnimTranslation()) .setDuration(300) diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyTile.java index 5230cea88e8e..7ee37d567a55 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyTile.java @@ -84,7 +84,7 @@ public class SensorPrivacyTile extends QSTileImpl<BooleanState> implements @Override public Intent getLongClickIntent() { - return null; + return new Intent(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java index eea44906029d..839b06cec496 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java @@ -33,6 +33,13 @@ public interface NotificationEntryListener { default void onPendingEntryAdded(NotificationEntry entry) { } + // TODO: Combine this with onPreEntryUpdated into "onBeforeEntryFiltered" or similar + /** + * Called when a new entry is created but before it has been filtered or displayed to the user. + */ + default void onBeforeNotificationAdded(NotificationEntry entry) { + } + /** * Called when a new entry is created. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java index 45db00210a2e..989e781ab5ba 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java @@ -18,11 +18,9 @@ package com.android.systemui.statusbar.notification; import android.annotation.Nullable; import android.app.Notification; import android.content.Context; -import android.os.UserHandle; import android.service.notification.NotificationListenerService; import android.service.notification.StatusBarNotification; import android.util.ArrayMap; -import android.util.ArraySet; import android.util.Log; import com.android.internal.annotations.VisibleForTesting; @@ -41,7 +39,6 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.NotificationInflater; import com.android.systemui.statusbar.notification.row.NotificationInflater.InflationFlag; import com.android.systemui.statusbar.notification.stack.NotificationListContainer; -import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.HeadsUpManager; import com.android.systemui.util.leak.LeakDetector; @@ -68,8 +65,6 @@ public class NotificationEntryManager implements @VisibleForTesting protected final HashMap<String, NotificationEntry> mPendingNotifications = new HashMap<>(); - private final DeviceProvisionedController mDeviceProvisionedController = - Dependency.get(DeviceProvisionedController.class); private final ForegroundServiceController mForegroundServiceController = Dependency.get(ForegroundServiceController.class); @@ -81,25 +76,12 @@ public class NotificationEntryManager implements private NotificationListenerService.RankingMap mLatestRankingMap; @VisibleForTesting protected NotificationData mNotificationData; - private NotificationListContainer mListContainer; + @VisibleForTesting final ArrayList<NotificationLifetimeExtender> mNotificationLifetimeExtenders = new ArrayList<>(); private final List<NotificationEntryListener> mNotificationEntryListeners = new ArrayList<>(); - private final DeviceProvisionedController.DeviceProvisionedListener - mDeviceProvisionedListener = - new DeviceProvisionedController.DeviceProvisionedListener() { - @Override - public void onDeviceProvisionedChanged() { - updateNotifications(); - } - }; - - public void destroy() { - mDeviceProvisionedController.removeCallback(mDeviceProvisionedListener); - } - @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("NotificationEntryManager state:"); @@ -151,9 +133,6 @@ public class NotificationEntryManager implements HeadsUpManager headsUpManager) { mPresenter = presenter; mNotificationData.setHeadsUpManager(headsUpManager); - mListContainer = listContainer; - - mDeviceProvisionedController.addCallback(mDeviceProvisionedListener); } /** Adds multiple {@link NotificationLifetimeExtender}s. */ @@ -227,7 +206,9 @@ public class NotificationEntryManager implements listener.onEntryInflated(entry, inflatedFlags); } mNotificationData.add(entry); - tagForeground(entry.notification); + for (NotificationEntryListener listener : mNotificationEntryListeners) { + listener.onBeforeNotificationAdded(entry); + } updateNotifications(); for (NotificationEntryListener listener : mNotificationEntryListeners) { listener.onNotificationAdded(entry); @@ -283,7 +264,6 @@ public class NotificationEntryManager implements if (entry.rowExists()) { entry.removeRow(); - mListContainer.cleanUpViewStateForEntry(entry); } // Let's remove the children if this was a summary @@ -368,19 +348,6 @@ public class NotificationEntryManager implements } } - @VisibleForTesting - void tagForeground(StatusBarNotification notification) { - ArraySet<Integer> activeOps = mForegroundServiceController.getAppOps( - notification.getUserId(), notification.getPackageName()); - if (activeOps != null) { - int N = activeOps.size(); - for (int i = 0; i < N; i++) { - updateNotificationsForAppOp(activeOps.valueAt(i), notification.getUid(), - notification.getPackageName(), true); - } - } - } - @Override public void addNotification(StatusBarNotification notification, NotificationListenerService.RankingMap ranking) { @@ -391,15 +358,6 @@ public class NotificationEntryManager implements } } - public void updateNotificationsForAppOp(int appOp, int uid, String pkg, boolean showIcon) { - String foregroundKey = mForegroundServiceController.getStandardLayoutKey( - UserHandle.getUserId(uid), pkg); - if (foregroundKey != null) { - mNotificationData.updateAppOp(appOp, uid, pkg, foregroundKey, showIcon); - updateNotifications(); - } - } - private void updateNotificationInternal(StatusBarNotification notification, NotificationListenerService.RankingMap ranking) throws InflationException { if (DEBUG) Log.d(TAG, "updateNotification(" + notification + ")"); @@ -452,8 +410,9 @@ public class NotificationEntryManager implements public void updateNotifications() { mNotificationData.filterAndSort(); - - mPresenter.updateNotificationViews(); + if (mPresenter != null) { + mPresenter.updateNotificationViews(); + } } public void updateNotificationRanking(NotificationListenerService.RankingMap rankingMap) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationListController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationListController.java new file mode 100644 index 000000000000..88f4ca239af4 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationListController.java @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2019 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.statusbar.notification; + +import static com.android.internal.util.Preconditions.checkNotNull; + +import android.os.UserHandle; +import android.service.notification.StatusBarNotification; +import android.util.ArraySet; + +import com.android.internal.statusbar.NotificationVisibility; +import com.android.systemui.ForegroundServiceController; +import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.stack.NotificationListContainer; +import com.android.systemui.statusbar.policy.DeviceProvisionedController; +import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener; + +/** + * Root controller for the list of notifications in the shade. + * + * TODO: Much of the code in NotificationPresenter should eventually move in here. It will proxy + * domain-specific behavior (ARC, etc) to subcontrollers. + */ +public class NotificationListController { + private final NotificationEntryManager mEntryManager; + private final NotificationListContainer mListContainer; + private final ForegroundServiceController mForegroundServiceController; + private final DeviceProvisionedController mDeviceProvisionedController; + + public NotificationListController( + NotificationEntryManager entryManager, + NotificationListContainer listContainer, + ForegroundServiceController foregroundServiceController, + DeviceProvisionedController deviceProvisionedController) { + mEntryManager = checkNotNull(entryManager); + mListContainer = checkNotNull(listContainer); + mForegroundServiceController = checkNotNull(foregroundServiceController); + mDeviceProvisionedController = checkNotNull(deviceProvisionedController); + } + + /** + * Causes the controller to register listeners on its dependencies. This method must be called + * before the controller is ready to perform its duties. + */ + public void bind() { + mEntryManager.addNotificationEntryListener(mEntryListener); + mDeviceProvisionedController.addCallback(mDeviceProvisionedListener); + } + + /** Should be called when the list controller is being destroyed. */ + public void destroy() { + mDeviceProvisionedController.removeCallback(mDeviceProvisionedListener); + } + + @SuppressWarnings("FieldCanBeLocal") + private final NotificationEntryListener mEntryListener = new NotificationEntryListener() { + @Override + public void onEntryRemoved( + NotificationEntry entry, + NotificationVisibility visibility, + boolean removedByUser) { + mListContainer.cleanUpViewStateForEntry(entry); + } + + @Override + public void onBeforeNotificationAdded(NotificationEntry entry) { + tagForeground(entry.notification); + } + }; + + private final DeviceProvisionedListener mDeviceProvisionedListener = + new DeviceProvisionedListener() { + @Override + public void onDeviceProvisionedChanged() { + mEntryManager.updateNotifications(); + } + }; + + // TODO: This method is horrifically inefficient + private void tagForeground(StatusBarNotification notification) { + ArraySet<Integer> activeOps = + mForegroundServiceController.getAppOps( + notification.getUserId(), notification.getPackageName()); + if (activeOps != null) { + int len = activeOps.size(); + for (int i = 0; i < len; i++) { + updateNotificationsForAppOp(activeOps.valueAt(i), notification.getUid(), + notification.getPackageName(), true); + } + } + } + + /** When an app op changes, propagate that change to notifications. */ + public void updateNotificationsForAppOp(int appOp, int uid, String pkg, boolean showIcon) { + String foregroundKey = + mForegroundServiceController.getStandardLayoutKey(UserHandle.getUserId(uid), pkg); + if (foregroundKey != null) { + mEntryManager + .getNotificationData().updateAppOp(appOp, uid, pkg, foregroundKey, showIcon); + mEntryManager.updateNotifications(); + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index 853d7ab9a76d..3568f2846a51 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -612,9 +612,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo anim.setStartDelay(mAnimationDelay); anim.setDuration(mAnimationDuration); anim.addListener(new AnimatorListenerAdapter() { + private Callback lastCallback = mCallback; + @Override public void onAnimationEnd(Animator animation) { - onFinished(); + onFinished(lastCallback); scrim.setTag(TAG_KEY_ANIM, null); dispatchScrimsVisible(); @@ -672,14 +674,23 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo } private void onFinished() { + onFinished(mCallback); + } + + private void onFinished(Callback callback) { if (mWakeLockHeld) { mWakeLock.release(); mWakeLockHeld = false; } - if (mCallback != null) { - mCallback.onFinished(); - mCallback = null; + + if (callback != null) { + callback.onFinished(); + + if (callback == mCallback) { + mCallback = null; + } } + // When unlocking with fingerprint, we'll fade the scrims from black to transparent. // At the end of the animation we need to remove the tint. if (mState == ScrimState.UNLOCKED) { 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 514bb228cd97..ed71598e22ce 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -196,6 +196,7 @@ import com.android.systemui.statusbar.notification.NotificationAlertingManager; import com.android.systemui.statusbar.notification.NotificationClicker; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider; +import com.android.systemui.statusbar.notification.NotificationListController; import com.android.systemui.statusbar.notification.NotificationRowBinder; import com.android.systemui.statusbar.notification.VisualStabilityManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -387,6 +388,7 @@ public class StatusBar extends SystemUI implements DemoMode, private NotificationGutsManager mGutsManager; protected NotificationLogger mNotificationLogger; protected NotificationEntryManager mEntryManager; + private NotificationListController mNotificationListController; private NotificationInterruptionStateProvider mNotificationInterruptionStateProvider; private NotificationRowBinder mNotificationRowBinder; protected NotificationViewHierarchyManager mViewHierarchyManager; @@ -593,7 +595,7 @@ public class StatusBar extends SystemUI implements DemoMode, public void onActiveStateChanged(int code, int uid, String packageName, boolean active) { mForegroundServiceController.onAppOpChanged(code, uid, packageName, active); Dependency.get(Dependency.MAIN_HANDLER).post(() -> { - mEntryManager.updateNotificationsForAppOp(code, uid, packageName, active); + mNotificationListController.updateNotificationsForAppOp(code, uid, packageName, active); }); } @@ -1044,6 +1046,13 @@ public class StatusBar extends SystemUI implements DemoMode, mScrimController, mActivityLaunchAnimator, mStatusBarKeyguardViewManager, mNotificationAlertingManager); + mNotificationListController = + new NotificationListController( + mEntryManager, + (NotificationListContainer) mStackScroller, + mForegroundServiceController, + mDeviceProvisionedController); + mAppOpsController.addCallback(APP_OPS, this); mNotificationListener.setUpWithPresenter(mPresenter); mNotificationShelf.setOnActivatedListener(mPresenter); @@ -1056,6 +1065,7 @@ public class StatusBar extends SystemUI implements DemoMode, this, Dependency.get(BubbleController.class), mNotificationActivityStarter)); mGroupAlertTransferHelper.bind(mEntryManager, mGroupManager); + mNotificationListController.bind(); } /** @@ -2831,7 +2841,7 @@ public class StatusBar extends SystemUI implements DemoMode, } catch (RemoteException e) { // Ignore. } - mEntryManager.destroy(); + mNotificationListController.destroy(); // End old BaseStatusBar.destroy(). if (mStatusBarWindow != null) { mWindowManager.removeViewImmediate(mStatusBarWindow); @@ -3999,7 +4009,7 @@ public class StatusBar extends SystemUI implements DemoMode, } @Override - public void onDoubleTap(float screenX, float screenY) { + public void onSlpiTap(float screenX, float screenY) { if (screenX > 0 && screenY > 0 && mAmbientIndicationContainer != null && mAmbientIndicationContainer.getVisibility() == View.VISIBLE) { mAmbientIndicationContainer.getLocationOnScreen(mTmpInt2); diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeHostFake.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeHostFake.java index ce28b50436eb..dc4287287b03 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeHostFake.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeHostFake.java @@ -104,7 +104,7 @@ class DozeHostFake implements DozeHost { } @Override - public void onDoubleTap(float x, float y) { + public void onSlpiTap(float x, float y) { doubleTapX = y; doubleTapY = y; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java index d937f93482d5..9ce6ae139998 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java @@ -22,19 +22,15 @@ import static junit.framework.Assert.assertTrue; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.ActivityManager; -import android.app.AppOpsManager; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; @@ -49,7 +45,6 @@ import android.service.notification.StatusBarNotification; import android.support.test.filters.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; -import android.util.ArraySet; import android.widget.FrameLayout; import com.android.internal.logging.MetricsLogger; @@ -79,8 +74,6 @@ import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.HeadsUpManager; -import junit.framework.Assert; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -346,7 +339,6 @@ public class NotificationEntryManagerTest extends SysuiTestCase { verify(mEntryListener, never()).onInflationError(any(), any()); - verify(mListContainer).cleanUpViewStateForEntry(mEntry); verify(mPresenter).updateNotificationViews(); verify(mEntryListener).onEntryRemoved( mEntry, null, false /* removedByUser */); @@ -401,90 +393,6 @@ public class NotificationEntryManagerTest extends SysuiTestCase { } @Test - public void testUpdateAppOps_foregroundNoti() { - com.android.systemui.util.Assert.isNotMainThread(); - - when(mForegroundServiceController.getStandardLayoutKey(anyInt(), anyString())) - .thenReturn(mEntry.key); - mEntry.setRow(mRow); - mEntryManager.getNotificationData().add(mEntry); - - mEntryManager.updateNotificationsForAppOp( - AppOpsManager.OP_CAMERA, mEntry.notification.getUid(), - mEntry.notification.getPackageName(), true); - - verify(mPresenter, times(1)).updateNotificationViews(); - assertTrue(mEntryManager.getNotificationData().get(mEntry.key).mActiveAppOps.contains( - AppOpsManager.OP_CAMERA)); - } - - @Test - public void testUpdateAppOps_otherNoti() { - com.android.systemui.util.Assert.isNotMainThread(); - - when(mForegroundServiceController.getStandardLayoutKey(anyInt(), anyString())) - .thenReturn(null); - mEntryManager.updateNotificationsForAppOp(AppOpsManager.OP_CAMERA, 1000, "pkg", true); - - verify(mPresenter, never()).updateNotificationViews(); - } - - @Test - public void testAddNotificationExistingAppOps() { - mEntry.setRow(mRow); - mEntryManager.getNotificationData().add(mEntry); - ArraySet<Integer> expected = new ArraySet<>(); - expected.add(3); - expected.add(235); - expected.add(1); - - when(mForegroundServiceController.getAppOps(mEntry.notification.getUserId(), - mEntry.notification.getPackageName())).thenReturn(expected); - when(mForegroundServiceController.getStandardLayoutKey( - mEntry.notification.getUserId(), - mEntry.notification.getPackageName())).thenReturn(mEntry.key); - - mEntryManager.tagForeground(mEntry.notification); - - Assert.assertEquals(expected.size(), mEntry.mActiveAppOps.size()); - for (int op : expected) { - assertTrue("Entry missing op " + op, mEntry.mActiveAppOps.contains(op)); - } - } - - @Test - public void testAdd_noExistingAppOps() { - mEntry.setRow(mRow); - mEntryManager.getNotificationData().add(mEntry); - when(mForegroundServiceController.getStandardLayoutKey( - mEntry.notification.getUserId(), - mEntry.notification.getPackageName())).thenReturn(mEntry.key); - when(mForegroundServiceController.getAppOps(mEntry.notification.getUserId(), - mEntry.notification.getPackageName())).thenReturn(null); - - mEntryManager.tagForeground(mEntry.notification); - Assert.assertEquals(0, mEntry.mActiveAppOps.size()); - } - - @Test - public void testAdd_existingAppOpsNotForegroundNoti() { - mEntry.setRow(mRow); - mEntryManager.getNotificationData().add(mEntry); - ArraySet<Integer> ops = new ArraySet<>(); - ops.add(3); - ops.add(235); - ops.add(1); - when(mForegroundServiceController.getAppOps(mEntry.notification.getUserId(), - mEntry.notification.getPackageName())).thenReturn(ops); - when(mForegroundServiceController.getStandardLayoutKey( - mEntry.notification.getUserId(), - mEntry.notification.getPackageName())).thenReturn("something else"); - - mEntryManager.tagForeground(mEntry.notification); - Assert.assertEquals(0, mEntry.mActiveAppOps.size()); - } - - @Test public void testUpdateNotificationRanking() { when(mDeviceProvisionedController.isDeviceProvisioned()).thenReturn(true); when(mEnvironment.isDeviceProvisioned()).thenReturn(true); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationListControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationListControllerTest.java new file mode 100644 index 000000000000..4b5037bb3f64 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationListControllerTest.java @@ -0,0 +1,241 @@ +/* + * Copyright (C) 2019 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.statusbar.notification; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertTrue; + +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.app.ActivityManager; +import android.app.AppOpsManager; +import android.app.Notification; +import android.os.UserHandle; +import android.service.notification.StatusBarNotification; +import android.support.test.filters.SmallTest; +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper; +import android.util.ArraySet; + +import com.android.internal.statusbar.NotificationVisibility; +import com.android.systemui.ForegroundServiceController; +import com.android.systemui.R; +import com.android.systemui.SysuiTestCase; +import com.android.systemui.statusbar.notification.collection.NotificationData; +import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.stack.NotificationListContainer; +import com.android.systemui.statusbar.policy.DeviceProvisionedController; +import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +@SmallTest +@RunWith(AndroidTestingRunner.class) +@TestableLooper.RunWithLooper +public class NotificationListControllerTest extends SysuiTestCase { + private NotificationListController mController; + + @Mock private NotificationEntryManager mEntryManager; + @Mock private NotificationListContainer mListContainer; + @Mock private ForegroundServiceController mForegroundServiceController; + @Mock private DeviceProvisionedController mDeviceProvisionedController; + + @Captor private ArgumentCaptor<NotificationEntryListener> mEntryListenerCaptor; + @Captor private ArgumentCaptor<DeviceProvisionedListener> mProvisionedCaptor; + + private NotificationEntryListener mEntryListener; + private DeviceProvisionedListener mProvisionedListener; + + // TODO: Remove this once EntryManager no longer needs to be mocked + private NotificationData mNotificationData = new NotificationData(); + + private int mNextNotifId = 0; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + when(mEntryManager.getNotificationData()).thenReturn(mNotificationData); + + mController = new NotificationListController( + mEntryManager, + mListContainer, + mForegroundServiceController, + mDeviceProvisionedController); + mController.bind(); + + // Capture callbacks passed to mocks + verify(mEntryManager).addNotificationEntryListener(mEntryListenerCaptor.capture()); + mEntryListener = mEntryListenerCaptor.getValue(); + verify(mDeviceProvisionedController).addCallback(mProvisionedCaptor.capture()); + mProvisionedListener = mProvisionedCaptor.getValue(); + } + + @Test + public void testCleanUpViewStateOnEntryRemoved() { + final NotificationEntry entry = buildEntry(); + mEntryListener.onEntryRemoved( + entry, + NotificationVisibility.obtain(entry.key, 0, 0, true), + false); + verify(mListContainer).cleanUpViewStateForEntry(entry); + } + + @Test + public void testCallUpdateNotificationsOnDeviceProvisionedChange() { + mProvisionedListener.onDeviceProvisionedChanged(); + verify(mEntryManager).updateNotifications(); + } + + @Test + public void testAppOps_appOpAddedToForegroundNotif() { + // GIVEN a notification associated with a foreground service + final NotificationEntry entry = buildEntry(); + mNotificationData.add(entry); + when(mForegroundServiceController.getStandardLayoutKey(anyInt(), anyString())) + .thenReturn(entry.key); + + // WHEN we are notified of a new app op + mController.updateNotificationsForAppOp( + AppOpsManager.OP_CAMERA, + entry.notification.getUid(), + entry.notification.getPackageName(), + true); + + // THEN the app op is added to the entry + assertTrue(entry.mActiveAppOps.contains(AppOpsManager.OP_CAMERA)); + // THEN updateNotifications() is called + verify(mEntryManager, times(1)).updateNotifications(); + } + + @Test + public void testAppOps_appOpAddedToUnrelatedNotif() { + // GIVEN No current foreground notifs + when(mForegroundServiceController.getStandardLayoutKey(anyInt(), anyString())) + .thenReturn(null); + + // WHEN An unrelated notification gets a new app op + mController.updateNotificationsForAppOp(AppOpsManager.OP_CAMERA, 1000, "pkg", true); + + // THEN We never call updateNotifications() + verify(mEntryManager, never()).updateNotifications(); + } + + @Test + public void testAppOps_addNotificationWithExistingAppOps() { + // GIVEN a notification with three associated app ops that is associated with a foreground + // service + final NotificationEntry entry = buildEntry(); + mNotificationData.add(entry); + ArraySet<Integer> expected = new ArraySet<>(); + expected.add(3); + expected.add(235); + expected.add(1); + when(mForegroundServiceController.getStandardLayoutKey( + entry.notification.getUserId(), + entry.notification.getPackageName())).thenReturn(entry.key); + when(mForegroundServiceController.getAppOps(entry.notification.getUserId(), + entry.notification.getPackageName())).thenReturn(expected); + + // WHEN the notification is added + mEntryListener.onBeforeNotificationAdded(entry); + + // THEN the entry is tagged with all three app ops + assertEquals(expected.size(), entry.mActiveAppOps.size()); + for (int op : expected) { + assertTrue("Entry missing op " + op, entry.mActiveAppOps.contains(op)); + } + } + + @Test + public void testAdd_addNotificationWithNoExistingAppOps() { + // GIVEN a notification with NO associated app ops + final NotificationEntry entry = buildEntry(); + + mNotificationData.add(entry); + when(mForegroundServiceController.getStandardLayoutKey( + entry.notification.getUserId(), + entry.notification.getPackageName())).thenReturn(entry.key); + when(mForegroundServiceController.getAppOps(entry.notification.getUserId(), + entry.notification.getPackageName())).thenReturn(null); + + // WHEN the notification is added + mEntryListener.onBeforeNotificationAdded(entry); + + // THEN the entry doesn't have any app ops associated with it + assertEquals(0, entry.mActiveAppOps.size()); + } + + @Test + public void testAdd_addNonForegroundNotificationWithExistingAppOps() { + // GIVEN a notification with app ops that isn't associated with a foreground service + final NotificationEntry entry = buildEntry(); + mNotificationData.add(entry); + ArraySet<Integer> ops = new ArraySet<>(); + ops.add(3); + ops.add(235); + ops.add(1); + when(mForegroundServiceController.getAppOps(entry.notification.getUserId(), + entry.notification.getPackageName())).thenReturn(ops); + when(mForegroundServiceController.getStandardLayoutKey( + entry.notification.getUserId(), + entry.notification.getPackageName())).thenReturn("something else"); + + // WHEN the notification is added + mEntryListener.onBeforeNotificationAdded(entry); + + // THEN the entry doesn't have any app ops associated with it + assertEquals(0, entry.mActiveAppOps.size()); + } + + private NotificationEntry buildEntry() { + mNextNotifId++; + + Notification.Builder n = new Notification.Builder(mContext, "") + .setSmallIcon(R.drawable.ic_person) + .setContentTitle("Title") + .setContentText("Text"); + + StatusBarNotification notification = + new StatusBarNotification( + TEST_PACKAGE_NAME, + TEST_PACKAGE_NAME, + mNextNotifId, + null, + TEST_UID, + 0, + n.build(), + new UserHandle(ActivityManager.getCurrentUser()), + null, + 0); + return new NotificationEntry(notification); + } + + private static final String TEST_PACKAGE_NAME = "test"; + private static final int TEST_UID = 0; +} diff --git a/proto/src/metrics_constants/metrics_constants.proto b/proto/src/metrics_constants/metrics_constants.proto index bb5d288f11e7..a07411d0afaf 100644 --- a/proto/src/metrics_constants/metrics_constants.proto +++ b/proto/src/metrics_constants/metrics_constants.proto @@ -6801,7 +6801,6 @@ message MetricsEvent { // ACTION: Tap & Pay -> Default Application Setting -> Use Default // OS: Q ACTION_NFC_PAYMENT_ALWAYS_SETTING = 1623; - // ---- End Q Constants, all Q constants go above this line ---- // OPEN: Settings > System > Input & Gesture > Skip song gesture // OS: Q @@ -6811,6 +6810,10 @@ message MetricsEvent { // OS: Q SETTINGS_GESTURE_SILENCE = 1625; + // OPEN: Settings > System > Input & Gesture > Tap screen gesture + // OS: Q + SETTINGS_GESTURE_TAP_SCREEN = 1626; + // ---- End Q Constants, all Q constants go above this line ---- // Add new aosp constants above this line. // END OF AOSP CONSTANTS diff --git a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java b/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java index cf9f233b8fe2..8ffaddefd3ef 100644 --- a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java +++ b/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java @@ -462,7 +462,7 @@ class TouchExplorer extends BaseEventStreamTransformation return false; } - endGestureDetection(); + endGestureDetection(true); mAms.onGesture(gestureId); @@ -472,7 +472,7 @@ class TouchExplorer extends BaseEventStreamTransformation @Override public boolean onGestureCancelled(MotionEvent event, int policyFlags) { if (mCurrentState == STATE_GESTURE_DETECTING) { - endGestureDetection(); + endGestureDetection(event.getActionMasked() == MotionEvent.ACTION_UP); return true; } else if (mCurrentState == STATE_TOUCH_EXPLORING) { // If the finger is still moving, pass the event on. @@ -804,13 +804,19 @@ class TouchExplorer extends BaseEventStreamTransformation } } - private void endGestureDetection() { + private void endGestureDetection(boolean interactionEnd) { mAms.onTouchInteractionEnd(); // Announce the end of the gesture recognition. sendAccessibilityEvent(AccessibilityEvent.TYPE_GESTURE_DETECTION_END); - // Announce the end of a the touch interaction. - sendAccessibilityEvent(AccessibilityEvent.TYPE_TOUCH_INTERACTION_END); + if (interactionEnd) { + // Announce the end of a the touch interaction. + sendAccessibilityEvent(AccessibilityEvent.TYPE_TOUCH_INTERACTION_END); + } else { + // If gesture detection is end, but user doesn't release the finger, announce the + // transition to exploration state. + sendAccessibilityEvent(AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_START); + } mExitGestureDetectionModeDelayed.cancel(); mCurrentState = STATE_TOUCH_EXPLORING; @@ -889,7 +895,6 @@ class TouchExplorer extends BaseEventStreamTransformation MotionEvent event = mInjectedPointerTracker.getLastInjectedHoverEvent(); if (event != null && event.getActionMasked() == MotionEvent.ACTION_HOVER_EXIT) { final int pointerIdBits = event.getPointerIdBits(); - sendAccessibilityEvent(AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_START); sendMotionEvent(event, MotionEvent.ACTION_HOVER_ENTER, pointerIdBits, policyFlags); } } @@ -1148,8 +1153,8 @@ class TouchExplorer extends BaseEventStreamTransformation sendAccessibilityEvent(AccessibilityEvent.TYPE_GESTURE_DETECTION_END); // Clearing puts is in touch exploration state with a finger already // down, so announce the transition to exploration state. - sendAccessibilityEvent(AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_START); clear(); + sendAccessibilityEvent(AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_START); } } diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java index ec6d20dd5c6a..c992da43fc07 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java @@ -252,9 +252,8 @@ public final class AutofillManagerService @Override // from AbstractMasterSystemService protected AutofillManagerServiceImpl newServiceLocked(@UserIdInt int resolvedUserId, boolean disabled) { - return new AutofillManagerServiceImpl(this, mLock, mRequestsHistory, - mUiLatencyHistory, mWtfHistory, resolvedUserId, mUi, mAutofillCompatState, - disabled); + return new AutofillManagerServiceImpl(this, mLock, mUiLatencyHistory, + mWtfHistory, resolvedUserId, mUi, mAutofillCompatState, disabled); } @Override // AbstractMasterSystemService @@ -291,6 +290,13 @@ public final class AutofillManagerService return mSupportedSmartSuggestionModes; } + /** + * Logs a request so it's dumped later... + */ + void logRequestLocked(@NonNull String historyItem) { + mRequestsHistory.log(historyItem); + } + // Called by AutofillManagerServiceImpl, doesn't need to check permission boolean isInstantServiceAllowed() { return mAllowInstantService; diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java index d037b081cd4d..954b67e4e2dc 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java @@ -108,7 +108,6 @@ final class AutofillManagerServiceImpl private static final Random sRandom = new Random(); - private final LocalLog mRequestsHistory; private final LocalLog mUiLatencyHistory; private final LocalLog mWtfHistory; private final FieldClassificationStrategy mFieldClassificationStrategy; @@ -166,12 +165,12 @@ final class AutofillManagerServiceImpl @Nullable private RemoteAugmentedAutofillService mRemoteAugmentedAutofillService; - AutofillManagerServiceImpl(AutofillManagerService master, Object lock, LocalLog requestsHistory, + AutofillManagerServiceImpl(AutofillManagerService master, Object lock, LocalLog uiLatencyHistory, LocalLog wtfHistory, int userId, AutoFillUI ui, - AutofillCompatState autofillCompatState, boolean disabled) { + AutofillCompatState autofillCompatState, + boolean disabled) { super(master, lock, userId); - mRequestsHistory = requestsHistory; mUiLatencyHistory = uiLatencyHistory; mWtfHistory = wtfHistory; mUi = ui; @@ -310,7 +309,7 @@ final class AutofillManagerServiceImpl + " s=" + mInfo.getServiceInfo().packageName + " u=" + mUserId + " i=" + autofillId + " b=" + virtualBounds + " hc=" + hasCallback + " f=" + flags; - mRequestsHistory.log(historyItem); + mMaster.logRequestLocked(historyItem); newSession.updateLocked(autofillId, virtualBounds, value, ACTION_START_SESSION, flags); diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index a5ef21afc23e..7dfd8fef13c2 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -2610,6 +2610,13 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState + " when server returned null for session " + this.id); } + final String historyItem = + "aug:id=" + id + " u=" + uid + " m=" + mode + + " a=" + ComponentName.flattenToShortString(mComponentName) + + " f=" + mCurrentViewId + + " s=" + remoteService.getComponentName(); + mService.getMaster().logRequestLocked(historyItem); + final AutofillValue currentValue = mViewStates.get(mCurrentViewId).getCurrentValue(); // TODO(b/111330312): we might need to add a new state in the AutofillManager to optimize diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java index dc0f6028b0f8..e4bbcd67d4df 100644 --- a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java +++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java @@ -32,6 +32,7 @@ import android.os.ResultReceiver; import android.os.ShellCallback; import android.os.UserHandle; import android.os.UserManager; +import android.util.LocalLog; import android.util.Slog; import android.view.contentcapture.IContentCaptureManager; @@ -69,6 +70,8 @@ public final class ContentCaptureManagerService extends private final LocalService mLocalService = new LocalService(); + private final LocalLog mRequestsHistory = new LocalLog(20); + public ContentCaptureManagerService(@NonNull Context context) { super(context, new FrameworkResourcesServiceNameResolver(context, com.android.internal.R.string.config_defaultContentCaptureService), @@ -154,6 +157,13 @@ public final class ContentCaptureManagerService extends } } + /** + * Logs a request so it's dumped later... + */ + void logRequestLocked(@NonNull String historyItem) { + mRequestsHistory.log(historyItem); + } + private ActivityManagerInternal getAmInternal() { synchronized (mLock) { if (mAm == null) { @@ -217,9 +227,29 @@ public final class ContentCaptureManagerService extends public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpPermission(getContext(), TAG, pw)) return; + boolean showHistory = true; + if (args != null) { + for (String arg : args) { + switch(arg) { + case "--no-history": + showHistory = false; + break; + case "--help": + pw.println("Usage: dumpsys content_capture [--no-history]"); + return; + default: + Slog.w(TAG, "Ignoring invalid dump arg: " + arg); + } + } + } + synchronized (mLock) { dumpLocked("", pw); } + if (showHistory) { + pw.println(); pw.println("Requests history:"); pw.println(); + mRequestsHistory.reverseDump(fd, pw, args); + } } @Override diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java index 1dae2ceae7d9..8d2c79bd9923 100644 --- a/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java +++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java @@ -85,7 +85,6 @@ final class ContentCapturePerUserService ContentCapturePerUserService(@NonNull ContentCaptureManagerService master, @NonNull Object lock, boolean disabled, @UserIdInt int userId) { super(master, lock, userId); - updateRemoteServiceLocked(disabled); } @@ -170,14 +169,24 @@ final class ContentCapturePerUserService @NonNull ComponentName componentName, int taskId, int displayId, @NonNull String sessionId, int uid, int flags, @NonNull IResultReceiver clientReceiver) { - if (!isEnabledLocked()) { + + final ComponentName serviceComponentName = getServiceComponentName(); + final boolean enabled = isEnabledLocked(); + final String historyItem = + "id=" + sessionId + " uid=" + uid + + " a=" + ComponentName.flattenToShortString(componentName) + + " t=" + taskId + " d=" + displayId + + " s=" + ComponentName.flattenToShortString(serviceComponentName) + + " u=" + mUserId + " f=" + flags + (enabled ? "" : " (disabled)"); + mMaster.logRequestLocked(historyItem); + + if (!enabled) { // TODO: it would be better to split in differet reasons, like // STATE_DISABLED_NO_SERVICE and STATE_DISABLED_BY_DEVICE_POLICY setClientState(clientReceiver, STATE_DISABLED | STATE_NO_SERVICE, /* binder= */ null); return; } - final ComponentName serviceComponentName = getServiceComponentName(); if (serviceComponentName == null) { // TODO(b/111276913): this happens when the system service is starting, we should // probably handle it in a more elegant way (like waiting for boot_complete or diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureServerSession.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureServerSession.java index ebe0083b398e..3c52e17ce1e8 100644 --- a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureServerSession.java +++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureServerSession.java @@ -83,6 +83,8 @@ final class ContentCaptureServerSession { */ @GuardedBy("mLock") public void sendActivitySnapshotLocked(@NonNull SnapshotData snapshotData) { + mService.getMaster().logRequestLocked("snapshot: id=" + mId); + mRemoteService.onActivitySnapshotRequest(mId, snapshotData); } diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java index 312b83c56dea..0b4c01ef90bd 100644 --- a/services/core/java/com/android/server/LocationManagerService.java +++ b/services/core/java/com/android/server/LocationManagerService.java @@ -257,6 +257,9 @@ public class LocationManagerService extends ILocationManager.Stub { packageManagerInternal.setLocationPackagesProvider( userId -> mContext.getResources().getStringArray( com.android.internal.R.array.config_locationProviderPackageNames)); + packageManagerInternal.setLocationExtraPackagesProvider( + userId -> mContext.getResources().getStringArray( + com.android.internal.R.array.config_locationExtraPackageNames)); // most startup is deferred until systemRunning() } diff --git a/services/core/java/com/android/server/TEST_MAPPING b/services/core/java/com/android/server/TEST_MAPPING index 93e1dd36797a..16b12f1f1d68 100644 --- a/services/core/java/com/android/server/TEST_MAPPING +++ b/services/core/java/com/android/server/TEST_MAPPING @@ -7,7 +7,7 @@ "include-annotation": "android.platform.test.annotations.Presubmit" }, { - "exclude-annotation": "android.support.test.filters.FlakyTest" + "exclude-annotation": "androidx.test.filters.FlakyTest" } ] } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 43deb1176fe6..089847d1ff7f 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -17867,6 +17867,15 @@ public class ActivityManagerService extends IActivityManager.Stub public void clearPendingBackup(int userId) { ActivityManagerService.this.clearPendingBackup(userId); } + + /** + * When power button is very long pressed, call this interface to do some pre-shutdown work + * like persisting database etc. + */ + @Override + public void prepareForPossibleShutdown() { + ActivityManagerService.this.prepareForPossibleShutdown(); + } } long inputDispatchingTimedOut(int pid, final boolean aboveSystem, String reason) { @@ -18123,6 +18132,18 @@ public class ActivityManagerService extends IActivityManager.Stub } } + /** + * When power button is very long pressed, call this interface to do some pre-shutdown work + * like persisting database etc. + */ + public void prepareForPossibleShutdown() { + synchronized (this) { + if (mUsageStatsService != null) { + mUsageStatsService.prepareForPossibleShutdown(); + } + } + } + @VisibleForTesting public static class Injector { private NetworkManagementInternal mNmi; diff --git a/services/core/java/com/android/server/am/CoreSettingsObserver.java b/services/core/java/com/android/server/am/CoreSettingsObserver.java index d7cb2bd36bde..d3953b58296c 100644 --- a/services/core/java/com/android/server/am/CoreSettingsObserver.java +++ b/services/core/java/com/android/server/am/CoreSettingsObserver.java @@ -67,9 +67,10 @@ final class CoreSettingsObserver extends ContentObserver { sGlobalSettingToTypeMap.put(Settings.Global.GPU_DEBUG_LAYERS_GLES, String.class); sGlobalSettingToTypeMap.put(Settings.Global.GPU_DEBUG_LAYER_APP, String.class); sGlobalSettingToTypeMap.put(Settings.Global.SMS_ACCESS_RESTRICTION_ENABLED, int.class); + sGlobalSettingToTypeMap.put(Settings.Global.GUP_DEV_ALL_APPS, int.class); sGlobalSettingToTypeMap.put(Settings.Global.GUP_DEV_OPT_IN_APPS, String.class); sGlobalSettingToTypeMap.put(Settings.Global.GUP_DEV_OPT_OUT_APPS, String.class); - sGlobalSettingToTypeMap.put(Settings.Global.GUP_BLACK_LIST, String.class); + sGlobalSettingToTypeMap.put(Settings.Global.GUP_BLACKLIST, String.class); // add other global settings here... } diff --git a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java index ecc3d2da8226..174ecfa12ee6 100644 --- a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java +++ b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java @@ -116,6 +116,7 @@ public abstract class BiometricServiceBase extends SystemService protected HashMap<Integer, PerformanceStats> mPerformanceMap = new HashMap<>(); // Transactions that make use of CryptoObjects are tracked by mCryptoPerformaceMap. protected HashMap<Integer, PerformanceStats> mCryptoPerformanceMap = new HashMap<>(); + protected int mHALDeathCount; protected class PerformanceStats { public int accept; // number of accepted biometrics @@ -596,6 +597,7 @@ public abstract class BiometricServiceBase extends SystemService public void serviceDied(long cookie) { Slog.e(getTag(), "HAL died"); mMetricsLogger.count(getMetrics().tagHalDied(), 1); + mHALDeathCount++; handleError(getHalDeviceId(), BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE, 0 /*vendorCode */); } diff --git a/services/core/java/com/android/server/biometrics/face/FaceService.java b/services/core/java/com/android/server/biometrics/face/FaceService.java index 5a9c1aca081a..a2aacdde4d9f 100644 --- a/services/core/java/com/android/server/biometrics/face/FaceService.java +++ b/services/core/java/com/android/server/biometrics/face/FaceService.java @@ -675,6 +675,12 @@ public class FaceService extends BiometricServiceBase { } @Override + public void serviceDied(long cookie) { + super.serviceDied(cookie); + mDaemon = null; + } + + @Override protected void updateActiveGroup(int userId, String clientPackage) { IBiometricsFace daemon = getFaceDaemon(); @@ -864,6 +870,8 @@ public class FaceService extends BiometricServiceBase { Slog.e(TAG, "dump formatting failure", e); } pw.println(dump); + pw.println("HAL Deaths: " + mHALDeathCount); + mHALDeathCount = 0; } private void dumpProto(FileDescriptor fd) { diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java index 1613dc97225b..3db6a74a1c6c 100644 --- a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java @@ -777,6 +777,12 @@ public class FingerprintService extends BiometricServiceBase { } @Override + public void serviceDied(long cookie) { + super.serviceDied(cookie); + mDaemon = null; + } + + @Override protected void updateActiveGroup(int userId, String clientPackage) { IBiometricsFingerprint daemon = getFingerprintDaemon(); @@ -1074,6 +1080,8 @@ public class FingerprintService extends BiometricServiceBase { Slog.e(TAG, "dump formatting failure", e); } pw.println(dump); + pw.println("HAL Deaths: " + mHALDeathCount); + mHALDeathCount = 0; } private void dumpProto(FileDescriptor fd) { diff --git a/services/core/java/com/android/server/connectivity/PacManager.java b/services/core/java/com/android/server/connectivity/PacManager.java index 3ea9810f2d76..97896889f243 100644 --- a/services/core/java/com/android/server/connectivity/PacManager.java +++ b/services/core/java/com/android/server/connectivity/PacManager.java @@ -282,6 +282,7 @@ public class PacManager { private void setCurrentProxyScript(String script) { if (mProxyService == null) { Log.e(TAG, "setCurrentProxyScript: no proxy service"); + return; } try { mProxyService.setPacFile(script); diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java index eb4e662b2c82..414f6bbfb995 100755 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java @@ -56,11 +56,6 @@ abstract class HdmiCecLocalDevice { // Within the timer, a received <User Control Pressed> will start "Press and Hold" behavior. // When it expires, we can assume <User Control Release> is received. private static final int FOLLOWER_SAFETY_TIMEOUT = 550; - /** - * Return value of {@link #getLocalPortFromPhysicalAddress(int)} - */ - private static final int TARGET_NOT_UNDER_LOCAL_DEVICE = -1; - private static final int TARGET_SAME_PHYSICAL_ADDRESS = 0; protected final HdmiControlService mService; protected final int mDeviceType; @@ -1061,47 +1056,6 @@ abstract class HdmiCecLocalDevice { pw.println(String.format("mActiveRoutingPath: 0x%04x", mActiveRoutingPath)); } - /** - * Method to parse target physical address to the port number on the current device. - * - * <p>This check assumes target address is valid. - * @param targetPhysicalAddress is the physical address of the target device - * @return - * If the target device is under the current device, return the port number of current device - * that the target device is connected to. - * - * <p>If the target device has the same physical address as the current device, return - * {@link #TARGET_SAME_PHYSICAL_ADDRESS}. - * - * <p>If the target device is not under the current device, return - * {@link #TARGET_NOT_UNDER_LOCAL_DEVICE}. - */ - protected int getLocalPortFromPhysicalAddress(int targetPhysicalAddress) { - int myPhysicalAddress = mService.getPhysicalAddress(); - if (myPhysicalAddress == targetPhysicalAddress) { - return TARGET_SAME_PHYSICAL_ADDRESS; - } - int finalMask = 0xF000; - int mask; - int port = 0; - for (mask = 0x0F00; mask > 0x000F; mask >>= 4) { - if ((myPhysicalAddress & mask) == 0) { - port = mask & targetPhysicalAddress; - break; - } else { - finalMask |= mask; - } - } - if (finalMask != 0xFFFF && (finalMask & targetPhysicalAddress) == myPhysicalAddress) { - while (mask != 0x000F) { - mask >>= 4; - port >>= 4; - } - return port; - } - return TARGET_NOT_UNDER_LOCAL_DEVICE; - } - /** Calculates the physical address for {@code activePortId}. * * <p>This method assumes current device physical address is valid. diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java index 71075f3d71ce..63214ed651b9 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java @@ -41,7 +41,15 @@ import com.android.internal.util.IndentingPrintWriter; import com.android.server.hdmi.Constants.AudioCodec; import com.android.server.hdmi.DeviceDiscoveryAction.DeviceDiscoveryCallback; import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly; +import com.android.server.hdmi.HdmiUtils.CodecSad; +import com.android.server.hdmi.HdmiUtils.DeviceConfig; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Arrays; @@ -105,6 +113,8 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { mTvInputs.put(1, "com.droidlogic.tvinput/.services.Hdmi3InputService/HW7"); } + private static final String SHORT_AUDIO_DESCRIPTOR_CONFIG_PATH = "/vendor/etc/sadConfig.xml"; + /** * Called when a device is newly added or a new device is detected or * an existing device is updated. @@ -258,7 +268,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { mTvSystemAudioModeSupport = false; // Record the last state of System Audio Control before going to standby synchronized (mLock) { - SystemProperties.set( + mService.writeStringSetting( Constants.PROPERTY_LAST_SYSTEM_AUDIO_CONTROL, mSystemAudioActivated ? "true" : "false"); } @@ -320,7 +330,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { @ServiceThreadOnly protected void setPreferredAddress(int addr) { assertRunOnServiceThread(); - SystemProperties.set( + mService.writeStringSetting( Constants.PROPERTY_PREFERRED_ADDRESS_AUDIO_SYSTEM, String.valueOf(addr)); } @@ -459,7 +469,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { protected boolean handleRequestArcInitiate(HdmiCecMessage message) { assertRunOnServiceThread(); removeAction(ArcInitiationActionFromAvr.class); - if (!SystemProperties.getBoolean(Constants.PROPERTY_ARC_SUPPORT, true)) { + if (!mService.readBooleanSetting(Constants.PROPERTY_ARC_SUPPORT, true)) { mService.maySendFeatureAbortCommand(message, Constants.ABORT_UNRECOGNIZED_OPCODE); } else if (!isDirectConnectToTv()) { HdmiLogger.debug("AVR device is not directly connected with TV"); @@ -498,13 +508,35 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { mService.maySendFeatureAbortCommand(message, Constants.ABORT_NOT_IN_CORRECT_MODE); return true; } - AudioDeviceInfo deviceInfo = getSystemAudioDeviceInfo(); - if (deviceInfo == null) { - mService.maySendFeatureAbortCommand(message, Constants.ABORT_UNABLE_TO_DETERMINE); - return true; + + List<DeviceConfig> config = null; + File file = new File(SHORT_AUDIO_DESCRIPTOR_CONFIG_PATH); + if (file.exists()) { + try { + InputStream in = new FileInputStream(file); + config = HdmiUtils.ShortAudioDescriptorXmlParser.parse(in); + in.close(); + } catch (IOException e) { + Slog.e(TAG, "Error reading file: " + file, e); + } catch (XmlPullParserException e) { + Slog.e(TAG, "Unable to parse file: " + file, e); + } } + @AudioCodec int[] audioFormatCodes = parseAudioFormatCodes(message.getParams()); - byte[] sadBytes = getSupportedShortAudioDescriptors(deviceInfo, audioFormatCodes); + byte[] sadBytes; + if (config != null && config.size() > 0) { + sadBytes = getSupportedShortAudioDescriptorsFromConfig(config, audioFormatCodes); + } else { + AudioDeviceInfo deviceInfo = getSystemAudioDeviceInfo(); + if (deviceInfo == null) { + mService.maySendFeatureAbortCommand(message, Constants.ABORT_UNABLE_TO_DETERMINE); + return true; + } + + sadBytes = getSupportedShortAudioDescriptors(deviceInfo, audioFormatCodes); + } + if (sadBytes.length == 0) { mService.maySendFeatureAbortCommand(message, Constants.ABORT_INVALID_OPERAND); } else { @@ -531,6 +563,42 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { } } } + return getShortAudioDescriptorBytes(sads); + } + + private byte[] getSupportedShortAudioDescriptorsFromConfig( + List<DeviceConfig> deviceConfig, @AudioCodec int[] audioFormatCodes) { + DeviceConfig deviceConfigToUse = null; + for (DeviceConfig device : deviceConfig) { + // TODO(amyjojo) use PROPERTY_SYSTEM_AUDIO_MODE_AUDIO_PORT to get the audio device name + if (device.name.equals("VX_AUDIO_DEVICE_IN_HDMI_ARC")) { + deviceConfigToUse = device; + break; + } + } + if (deviceConfigToUse == null) { + // TODO(amyjojo) use PROPERTY_SYSTEM_AUDIO_MODE_AUDIO_PORT to get the audio device name + Slog.w(TAG, "sadConfig.xml does not have required device info for " + + "VX_AUDIO_DEVICE_IN_HDMI_ARC"); + return new byte[0]; + } + HashMap<Integer, byte[]> map = new HashMap<>(); + ArrayList<byte[]> sads = new ArrayList<>(audioFormatCodes.length); + for (CodecSad codecSad : deviceConfigToUse.supportedCodecs) { + map.put(codecSad.audioCodec, codecSad.sad); + } + for (int i = 0; i < audioFormatCodes.length; i++) { + if (map.containsKey(audioFormatCodes[i])) { + byte[] sad = map.get(audioFormatCodes[i]); + if (sad != null && sad.length == 3) { + sads.add(sad); + } + } + } + return getShortAudioDescriptorBytes(sads); + } + + private byte[] getShortAudioDescriptorBytes(ArrayList<byte[]> sads) { // Short Audio Descriptors are always 3 bytes long. byte[] bytes = new byte[sads.size() * 3]; int index = 0; @@ -761,7 +829,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { boolean currentMuteStatus = mService.getAudioManager().isStreamMute(AudioManager.STREAM_MUSIC); if (currentMuteStatus == newSystemAudioMode) { - if (SystemProperties.getBoolean( + if (mService.readBooleanSetting( Constants.PROPERTY_SYSTEM_AUDIO_MODE_MUTING_ENABLE, true) || newSystemAudioMode) { mService.getAudioManager() diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java index 32288de15a00..7a0c27906122 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java @@ -100,7 +100,7 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { @ServiceThreadOnly protected void setPreferredAddress(int addr) { assertRunOnServiceThread(); - SystemProperties.set(Constants.PROPERTY_PREFERRED_ADDRESS_PLAYBACK, + mService.writeStringSetting(Constants.PROPERTY_PREFERRED_ADDRESS_PLAYBACK, String.valueOf(addr)); } diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index 486faf3e9fa5..46219d5cbe8a 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -646,6 +646,7 @@ public class HdmiControlService extends SystemService { return enabled ? ENABLED : DISABLED; } + @VisibleForTesting boolean readBooleanSetting(String key, boolean defVal) { ContentResolver cr = getContext().getContentResolver(); return Global.getInt(cr, key, toInt(defVal)) == ENABLED; @@ -656,6 +657,11 @@ public class HdmiControlService extends SystemService { Global.putInt(cr, key, toInt(value)); } + void writeStringSetting(String key, String value) { + ContentResolver cr = getContext().getContentResolver(); + Global.putString(cr, key, value); + } + private void initializeCec(int initiatedBy) { mAddressAllocated = false; mCecController.setOption(OptionKey.SYSTEM_CEC_CONTROL, true); diff --git a/services/core/java/com/android/server/hdmi/HdmiUtils.java b/services/core/java/com/android/server/hdmi/HdmiUtils.java index 11e557c024ce..e44f1d1522ec 100644 --- a/services/core/java/com/android/server/hdmi/HdmiUtils.java +++ b/services/core/java/com/android/server/hdmi/HdmiUtils.java @@ -16,23 +16,35 @@ package com.android.server.hdmi; +import android.annotation.Nullable; import android.hardware.hdmi.HdmiDeviceInfo; import android.util.Slog; import android.util.SparseArray; +import android.util.Xml; +import com.android.internal.util.HexDump; import com.android.internal.util.IndentingPrintWriter; +import com.android.server.hdmi.Constants.AudioCodec; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; - +import java.util.Objects; /** * Various utilities to handle HDMI CEC messages. */ final class HdmiUtils { + private static final String TAG = "HdmiUtils"; + private static final int[] ADDRESS_TO_TYPE = { HdmiDeviceInfo.DEVICE_TV, // ADDR_TV HdmiDeviceInfo.DEVICE_RECORDER, // ADDR_RECORDER_1 @@ -69,6 +81,12 @@ final class HdmiUtils { "Secondary_TV", }; + /** + * Return value of {@link #getLocalPortFromPhysicalAddress(int, int)} + */ + static final int TARGET_NOT_UNDER_LOCAL_DEVICE = -1; + static final int TARGET_SAME_PHYSICAL_ADDRESS = 0; + private HdmiUtils() { /* cannot be instantiated */ } /** @@ -392,6 +410,203 @@ final class HdmiUtils { pw.decreaseIndent(); } + /** + * Method to parse target physical address to the port number on the current device. + * + * <p>This check assumes target address is valid. + * + * @param targetPhysicalAddress is the physical address of the target device + * @param myPhysicalAddress is the physical address of the current device + * @return + * If the target device is under the current device, return the port number of current device + * that the target device is connected to. This also applies to the devices that are indirectly + * connected to the current device. + * + * <p>If the target device has the same physical address as the current device, return + * {@link #TARGET_SAME_PHYSICAL_ADDRESS}. + * + * <p>If the target device is not under the current device, return + * {@link #TARGET_NOT_UNDER_LOCAL_DEVICE}. + */ + public static int getLocalPortFromPhysicalAddress( + int targetPhysicalAddress, int myPhysicalAddress) { + if (myPhysicalAddress == targetPhysicalAddress) { + return TARGET_SAME_PHYSICAL_ADDRESS; + } + + int mask = 0xF000; + int finalMask = 0xF000; + int maskedAddress = myPhysicalAddress; + + while (maskedAddress != 0) { + maskedAddress = myPhysicalAddress & mask; + finalMask |= mask; + mask >>= 4; + } + + int portAddress = targetPhysicalAddress & finalMask; + if ((portAddress & (finalMask << 4)) != myPhysicalAddress) { + return TARGET_NOT_UNDER_LOCAL_DEVICE; + } + + mask <<= 4; + int port = portAddress & mask; + while ((port >> 4) != 0) { + port >>= 4; + } + return port; + } + + public static class ShortAudioDescriptorXmlParser { + // We don't use namespaces + private static final String NS = null; + + // return a list of devices config + public static List<DeviceConfig> parse(InputStream in) + throws XmlPullParserException, IOException { + XmlPullParser parser = Xml.newPullParser(); + parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); + parser.setInput(in, null); + parser.nextTag(); + return readDevices(parser); + } + + private static void skip(XmlPullParser parser) throws XmlPullParserException, IOException { + if (parser.getEventType() != XmlPullParser.START_TAG) { + throw new IllegalStateException(); + } + int depth = 1; + while (depth != 0) { + switch (parser.next()) { + case XmlPullParser.END_TAG: + depth--; + break; + case XmlPullParser.START_TAG: + depth++; + break; + } + } + } + + private static List<DeviceConfig> readDevices(XmlPullParser parser) + throws XmlPullParserException, IOException { + List<DeviceConfig> devices = new ArrayList<>(); + + parser.require(XmlPullParser.START_TAG, NS, "config"); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.getEventType() != XmlPullParser.START_TAG) { + continue; + } + String name = parser.getName(); + // Starts by looking for the device tag + if (name.equals("device")) { + String deviceType = parser.getAttributeValue(null, "type"); + DeviceConfig config = null; + if (deviceType != null) { + config = readDeviceConfig(parser, deviceType); + } + if (config != null) { + devices.add(config); + } + } else { + skip(parser); + } + } + return devices; + } + + // Processes device tags in the config. + @Nullable + private static DeviceConfig readDeviceConfig(XmlPullParser parser, String deviceType) + throws XmlPullParserException, IOException { + List<CodecSad> codecSads = new ArrayList<>(); + int format; + byte[] descriptor; + + parser.require(XmlPullParser.START_TAG, NS, "device"); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.getEventType() != XmlPullParser.START_TAG) { + continue; + } + String tagName = parser.getName(); + + // Starts by looking for the supportedFormat tag + if (tagName.equals("supportedFormat")) { + String codecAttriValue = parser.getAttributeValue(null, "format"); + String sadAttriValue = parser.getAttributeValue(null, "descriptor"); + format = (codecAttriValue) == null + ? Constants.AUDIO_CODEC_NONE : formatNameToNum(codecAttriValue); + descriptor = readSad(sadAttriValue); + if (format != Constants.AUDIO_CODEC_NONE && descriptor != null) { + codecSads.add(new CodecSad(format, descriptor)); + } + parser.nextTag(); + parser.require(XmlPullParser.END_TAG, NS, "supportedFormat"); + } else { + skip(parser); + } + } + if (codecSads.size() == 0) { + return null; + } + return new DeviceConfig(deviceType, codecSads); + } + + // Processes sad attribute in the supportedFormat. + @Nullable + private static byte[] readSad(String sad) { + if (sad == null || sad.length() == 0) { + return null; + } + byte[] sadBytes = HexDump.hexStringToByteArray(sad); + if (sadBytes.length != 3) { + Slog.w(TAG, "SAD byte array length is not 3. Length = " + sadBytes.length); + return null; + } + return sadBytes; + } + + @AudioCodec + private static int formatNameToNum(String codecAttriValue) { + switch (codecAttriValue) { + case "AUDIO_FORMAT_NONE": + return Constants.AUDIO_CODEC_NONE; + case "AUDIO_FORMAT_LPCM": + return Constants.AUDIO_CODEC_LPCM; + case "AUDIO_FORMAT_DD": + return Constants.AUDIO_CODEC_DD; + case "AUDIO_FORMAT_MPEG1": + return Constants.AUDIO_CODEC_MPEG1; + case "AUDIO_FORMAT_MP3": + return Constants.AUDIO_CODEC_MP3; + case "AUDIO_FORMAT_MPEG2": + return Constants.AUDIO_CODEC_MPEG2; + case "AUDIO_FORMAT_AAC": + return Constants.AUDIO_CODEC_AAC; + case "AUDIO_FORMAT_DTS": + return Constants.AUDIO_CODEC_DTS; + case "AUDIO_FORMAT_ATRAC": + return Constants.AUDIO_CODEC_ATRAC; + case "AUDIO_FORMAT_ONEBITAUDIO": + return Constants.AUDIO_CODEC_ONEBITAUDIO; + case "AUDIO_FORMAT_DDP": + return Constants.AUDIO_CODEC_DDP; + case "AUDIO_FORMAT_DTSHD": + return Constants.AUDIO_CODEC_DTSHD; + case "AUDIO_FORMAT_TRUEHD": + return Constants.AUDIO_CODEC_TRUEHD; + case "AUDIO_FORMAT_DST": + return Constants.AUDIO_CODEC_DST; + case "AUDIO_FORMAT_WMAPRO": + return Constants.AUDIO_CODEC_WMAPRO; + case "AUDIO_FORMAT_MAX": + return Constants.AUDIO_CODEC_MAX; + default: + return Constants.AUDIO_CODEC_NONE; + } + } + } + // Device configuration of its supported Codecs and their Short Audio Descriptors. public static class DeviceConfig { /** Name of the device. Should be {@link Constants.AudioDevice}. **/ @@ -399,10 +614,27 @@ final class HdmiUtils { /** List of a {@link CodecSad}. **/ public final List<CodecSad> supportedCodecs; - private DeviceConfig(String name, List<CodecSad> supportedCodecs) { + public DeviceConfig(String name, List<CodecSad> supportedCodecs) { this.name = name; this.supportedCodecs = supportedCodecs; } + + @Override + public boolean equals(Object obj) { + if (obj instanceof DeviceConfig) { + DeviceConfig that = (DeviceConfig) obj; + return that.name.equals(this.name) + && that.supportedCodecs.equals(this.supportedCodecs); + } + return false; + } + + @Override + public int hashCode() { + return Objects.hash( + name, + supportedCodecs.hashCode()); + } } // Short Audio Descriptor of a specific Codec @@ -419,5 +651,27 @@ final class HdmiUtils { this.audioCodec = audioCodec; this.sad = sad; } + + public CodecSad(int audioCodec, String sad) { + this.audioCodec = audioCodec; + this.sad = HexDump.hexStringToByteArray(sad); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof CodecSad) { + CodecSad that = (CodecSad) obj; + return that.audioCodec == this.audioCodec + && Arrays.equals(that.sad, this.sad); + } + return false; + } + + @Override + public int hashCode() { + return Objects.hash( + audioCodec, + Arrays.hashCode(sad)); + } } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 69323902edc8..36d1af268faf 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -1342,6 +1342,7 @@ public class PackageManagerService extends IPackageManager.Stub final @Nullable String mSystemTextClassifierPackage; final @Nullable String mWellbeingPackage; final @Nullable String mDocumenterPackage; + final @Nullable String mConfiguratorPackage; final @NonNull String mServicesSystemSharedLibraryPackageName; final @NonNull String mSharedSystemSharedLibraryPackageName; @@ -2865,6 +2866,8 @@ public class PackageManagerService extends IPackageManager.Stub mWellbeingPackage = getWellbeingPackageName(); mDocumenterPackage = getDocumenterPackageName(); + mConfiguratorPackage = + mContext.getString(R.string.config_deviceConfiguratorPackageName); // Now that we know all of the shared libraries, update all clients to have // the correct library paths. @@ -19135,7 +19138,7 @@ public class PackageManagerService extends IPackageManager.Stub // writer synchronized (mPackages) { PackageParser.Package pkg = mPackages.get(packageName); - if (pkg == null || pkg.applicationInfo.uid != callingUid) { + if (pkg == null || !isCallerSameApp(packageName, callingUid)) { if (mContext.checkCallingOrSelfPermission( android.Manifest.permission.SET_PREFERRED_APPLICATIONS) != PackageManager.PERMISSION_GRANTED) { @@ -23122,6 +23125,8 @@ public class PackageManagerService extends IPackageManager.Stub return mWellbeingPackage; case PackageManagerInternal.PACKAGE_DOCUMENTER: return mDocumenterPackage; + case PackageManagerInternal.PACKAGE_CONFIGURATOR: + return mConfiguratorPackage; } return null; } @@ -23138,6 +23143,11 @@ public class PackageManagerService extends IPackageManager.Stub } @Override + public void setLocationExtraPackagesProvider(PackagesProvider provider) { + mDefaultPermissionPolicy.setLocationExtraPackagesProvider(provider); + } + + @Override public void setVoiceInteractionPackagesProvider(PackagesProvider provider) { mDefaultPermissionPolicy.setVoiceInteractionPackagesProvider(provider); } diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 95da2091828d..b0f232607d88 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -2790,13 +2790,13 @@ public final class Settings { // dataPath - path to package's data path // seinfo - seinfo label for the app (assigned at install time) // gids - supplementary gids this app launches with + // profileableFromShellFlag - 0 or 1 if the package is profileable from shell. // // NOTE: We prefer not to expose all ApplicationInfo flags for now. // // DO NOT MODIFY THIS FORMAT UNLESS YOU CAN ALSO MODIFY ITS USERS // FROM NATIVE CODE. AT THE MOMENT, LOOK AT THE FOLLOWING SOURCES: - // frameworks/base/libs/packagelistparser - // system/core/run-as/run-as.c + // system/core/libpackagelistparser // sb.setLength(0); sb.append(ai.packageName); @@ -2816,6 +2816,8 @@ public final class Settings { } else { sb.append("none"); } + sb.append(" "); + sb.append(ai.isProfileableByShell() ? "1" : "0"); sb.append("\n"); writer.append(sb); } diff --git a/services/core/java/com/android/server/pm/permission/BasePermission.java b/services/core/java/com/android/server/pm/permission/BasePermission.java index 3a49412357d8..17f83479a3b1 100644 --- a/services/core/java/com/android/server/pm/permission/BasePermission.java +++ b/services/core/java/com/android/server/pm/permission/BasePermission.java @@ -247,6 +247,10 @@ public final class BasePermission { public boolean isDocumenter() { return (protectionLevel & PermissionInfo.PROTECTION_FLAG_DOCUMENTER) != 0; } + public boolean isConfigurator() { + return (protectionLevel & PermissionInfo.PROTECTION_FLAG_CONFIGURATOR) + != 0; + } public void transfer(@NonNull String origPackageName, @NonNull String newPackageName) { if (!origPackageName.equals(sourcePackageName)) { diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java index 789664d82332..ceaf69d72108 100644 --- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java +++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java @@ -225,6 +225,7 @@ public final class DefaultPermissionGrantPolicy { private final Handler mHandler; private PackagesProvider mLocationPackagesProvider; + private PackagesProvider mLocationExtraPackagesProvider; private PackagesProvider mVoiceInteractionPackagesProvider; private PackagesProvider mSmsAppPackagesProvider; private PackagesProvider mDialerAppPackagesProvider; @@ -270,6 +271,13 @@ public final class DefaultPermissionGrantPolicy { } } + /** Sets the provider for loction extra packages. */ + public void setLocationExtraPackagesProvider(PackagesProvider provider) { + synchronized (mLock) { + mLocationExtraPackagesProvider = provider; + } + } + public void setVoiceInteractionPackagesProvider(PackagesProvider provider) { synchronized (mLock) { mVoiceInteractionPackagesProvider = provider; @@ -403,6 +411,7 @@ public final class DefaultPermissionGrantPolicy { Log.i(TAG, "Granting permissions to default platform handlers for user " + userId); final PackagesProvider locationPackagesProvider; + final PackagesProvider locationExtraPackagesProvider; final PackagesProvider voiceInteractionPackagesProvider; final PackagesProvider smsAppPackagesProvider; final PackagesProvider dialerAppPackagesProvider; @@ -412,6 +421,7 @@ public final class DefaultPermissionGrantPolicy { synchronized (mLock) { locationPackagesProvider = mLocationPackagesProvider; + locationExtraPackagesProvider = mLocationExtraPackagesProvider; voiceInteractionPackagesProvider = mVoiceInteractionPackagesProvider; smsAppPackagesProvider = mSmsAppPackagesProvider; dialerAppPackagesProvider = mDialerAppPackagesProvider; @@ -424,6 +434,8 @@ public final class DefaultPermissionGrantPolicy { ? voiceInteractionPackagesProvider.getPackages(userId) : null; String[] locationPackageNames = (locationPackagesProvider != null) ? locationPackagesProvider.getPackages(userId) : null; + String[] locationExtraPackageNames = (locationExtraPackagesProvider != null) + ? locationExtraPackagesProvider.getPackages(userId) : null; String[] smsAppPackageNames = (smsAppPackagesProvider != null) ? smsAppPackagesProvider.getPackages(userId) : null; String[] dialerAppPackageNames = (dialerAppPackagesProvider != null) @@ -638,6 +650,12 @@ public final class DefaultPermissionGrantPolicy { LOCATION_PERMISSIONS, ACTIVITY_RECOGNITION_PERMISSIONS); } } + if (locationExtraPackageNames != null) { + // Also grant location permission to location extra packages. + for (String packageName : locationExtraPackageNames) { + grantPermissionsToSystemPackage(packageName, userId, LOCATION_PERMISSIONS); + } + } // Music Intent musicIntent = new Intent(Intent.ACTION_VIEW) diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index 93964cb09ae6..30b5e49bc3fd 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -1640,6 +1640,13 @@ public class PermissionManagerService { // Special permissions for the system default text classifier. allowed = true; } + if (!allowed && bp.isConfigurator() + && pkg.packageName.equals(mPackageManagerInt.getKnownPackageName( + PackageManagerInternal.PACKAGE_CONFIGURATOR, + UserHandle.USER_SYSTEM))) { + // Special permissions for the device configurator. + allowed = true; + } if (!allowed && bp.isWellbeing() && pkg.packageName.equals(mPackageManagerInt.getKnownPackageName( PackageManagerInternal.PACKAGE_WELLBEING, UserHandle.USER_SYSTEM))) { diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 2060aef37044..6b111a0fa4fb 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -84,8 +84,10 @@ import static android.view.WindowManagerGlobal.ADD_OKAY; import static android.view.WindowManagerGlobal.ADD_PERMISSION_DENIED; import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVERED; -import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVER_ABSENT; -import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_UNCOVERED; +import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs + .CAMERA_LENS_COVER_ABSENT; +import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs + .CAMERA_LENS_UNCOVERED; import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.LID_CLOSED; import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.LID_OPEN; import static com.android.server.wm.WindowManagerPolicyProto.KEYGUARD_DELEGATE; @@ -478,6 +480,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { int mShortPressOnSleepBehavior; int mShortPressOnWindowBehavior; boolean mHasSoftInput = false; + boolean mHapticTextHandleEnabled; boolean mUseTvRouting; int mVeryLongPressTimeout; boolean mAllowStartActivityForLongPressOnPowerDuringSetup; @@ -565,6 +568,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { private boolean mScreenshotChordPowerKeyTriggered; private long mScreenshotChordPowerKeyTime; + private static final long MOVING_DISPLAY_TO_TOP_DURATION_MILLIS = 10; + private volatile boolean mMovingDisplayToTopKeyTriggered; + private volatile long mMovingDisplayToTopKeyTime; + // Ringer toggle should reuse timing and triggering from screenshot power and a11y vol up private int mRingerToggleChord = VOLUME_HUSH_OFF; @@ -604,7 +611,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { private boolean mAodShowing; private boolean mPerDisplayFocusEnabled = false; - private int mTopFocusedDisplayId = INVALID_DISPLAY; + private volatile int mTopFocusedDisplayId = INVALID_DISPLAY; private static final int MSG_ENABLE_POINTER_LOCATION = 1; private static final int MSG_DISABLE_POINTER_LOCATION = 2; @@ -632,6 +639,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { private static final int MSG_POWER_VERY_LONG_PRESS = 25; private static final int MSG_NOTIFY_USER_ACTIVITY = 26; private static final int MSG_RINGER_TOGGLE_CHORD = 27; + private static final int MSG_MOVE_DISPLAY_TO_TOP = 28; private class PolicyHandler extends Handler { @Override @@ -727,6 +735,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { case MSG_RINGER_TOGGLE_CHORD: handleRingerChordGesture(); break; + case MSG_MOVE_DISPLAY_TO_TOP: + mWindowManagerFuncs.moveDisplayToTop(msg.arg1); + mMovingDisplayToTopKeyTriggered = false; + break; } } } @@ -808,6 +820,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { } }; + private Runnable mPossibleVeryLongPressReboot = new Runnable() { + @Override + public void run() { + mActivityManagerInternal.prepareForPossibleShutdown(); + } + }; + private void handleRingerChordGesture() { if (mRingerToggleChord == VOLUME_HUSH_OFF) { return; @@ -953,6 +972,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { // Inform the StatusBar; but do not allow it to consume the event. sendSystemKeyToStatusBarAsync(event.getKeyCode()); + schedulePossibleVeryLongPressReboot(); + // If the power key has still not yet been handled, then detect short // press, long press, or multi press and decide what to do. mPowerKeyHandled = hungUp || mScreenshotChordVolumeDownKeyTriggered @@ -1056,6 +1077,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (hasVeryLongPressOnPowerBehavior()) { mHandler.removeMessages(MSG_POWER_VERY_LONG_PRESS); } + cancelPossibleVeryLongPressReboot(); } private void cancelPendingBackKeyAction() { @@ -1815,6 +1837,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { mAllowStartActivityForLongPressOnPowerDuringSetup = mContext.getResources().getBoolean( com.android.internal.R.bool.config_allowStartActivityForLongPressOnPowerInSetup); + mHapticTextHandleEnabled = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_enableHapticTextHandle); + mUseTvRouting = AudioSystem.getPlatformType(mContext) == AudioSystem.PLATFORM_TELEVISION; mHandleVolumeKeysInWM = mContext.getResources().getBoolean( @@ -2558,12 +2583,25 @@ public class PhoneWindowManager implements WindowManagerPolicy { final int eventDisplayId = event.getDisplayId(); if (result == 0 && !mPerDisplayFocusEnabled && eventDisplayId != INVALID_DISPLAY && eventDisplayId != mTopFocusedDisplayId) { - // Someone tries to send a key event to a display which doesn't have a focused window. - // We drop the event here, or it will cause ANR. - // TODO (b/121057974): The user may be confused about why the key doesn't work, so we - // may need to deal with this problem. - Slog.i(TAG, "Dropping this event targeting display #" + eventDisplayId - + " because the focus is on display #" + mTopFocusedDisplayId); + // An event is targeting a non-focused display. Try to move the display to top so that + // it can become the focused display to interact with the user. + final long eventDownTime = event.getDownTime(); + if (mMovingDisplayToTopKeyTime < eventDownTime) { + // We have not handled this event yet. Move the display to top, and then tell + // dispatcher to try again later. + mMovingDisplayToTopKeyTime = eventDownTime; + mMovingDisplayToTopKeyTriggered = true; + mHandler.sendMessage( + mHandler.obtainMessage(MSG_MOVE_DISPLAY_TO_TOP, eventDisplayId, 0)); + return MOVING_DISPLAY_TO_TOP_DURATION_MILLIS; + } else if (mMovingDisplayToTopKeyTriggered) { + // The message has not been handled yet. Tell dispatcher to try again later. + return MOVING_DISPLAY_TO_TOP_DURATION_MILLIS; + } + // The target display is still not the top focused display. Drop the event because the + // display may not contain any window which can receive keys. + Slog.w(TAG, "Dropping key targeting non-focused display #" + eventDisplayId + + " keyCode=" + KeyEvent.keyCodeToString(event.getKeyCode())); return -1; } return result; @@ -4901,6 +4939,15 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } + private void schedulePossibleVeryLongPressReboot() { + mHandler.removeCallbacks(mPossibleVeryLongPressReboot); + mHandler.postDelayed(mPossibleVeryLongPressReboot, mVeryLongPressTimeout); + } + + private void cancelPossibleVeryLongPressReboot() { + mHandler.removeCallbacks(mPossibleVeryLongPressReboot); + } + // TODO (multidisplay): Support multiple displays in WindowManagerPolicy. private void updateScreenOffSleepToken(boolean acquire) { if (acquire) { @@ -5158,8 +5205,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { case HapticFeedbackConstants.CLOCK_TICK: case HapticFeedbackConstants.CONTEXT_CLICK: return VibrationEffect.get(VibrationEffect.EFFECT_TICK); - case HapticFeedbackConstants.KEYBOARD_RELEASE: case HapticFeedbackConstants.TEXT_HANDLE_MOVE: + if (!mHapticTextHandleEnabled) { + return null; + } + case HapticFeedbackConstants.KEYBOARD_RELEASE: case HapticFeedbackConstants.VIRTUAL_KEY_RELEASE: case HapticFeedbackConstants.ENTRY_BUMP: case HapticFeedbackConstants.DRAG_CROSSING: @@ -5324,11 +5374,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { pw.println(mAllowStartActivityForLongPressOnPowerDuringSetup); pw.print(prefix); pw.print("mHasSoftInput="); pw.print(mHasSoftInput); - pw.print(" mDismissImeOnBackKeyPressed="); pw.println(mDismissImeOnBackKeyPressed); + pw.print(" mHapticTextHandleEnabled="); pw.println(mHapticTextHandleEnabled); + pw.print(prefix); + pw.print("mDismissImeOnBackKeyPressed="); pw.print(mDismissImeOnBackKeyPressed); + pw.print(" mIncallPowerBehavior="); + pw.println(incallPowerBehaviorToString(mIncallPowerBehavior)); pw.print(prefix); - pw.print("mIncallPowerBehavior="); - pw.print(incallPowerBehaviorToString(mIncallPowerBehavior)); - pw.print(" mIncallBackBehavior="); + pw.print("mIncallBackBehavior="); pw.print(incallBackBehaviorToString(mIncallBackBehavior)); pw.print(" mEndcallBehavior="); pw.println(endcallBehaviorToString(mEndcallBehavior)); diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java index 3da325c55b32..c37254b22ea5 100644 --- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java +++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java @@ -634,6 +634,12 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { * Notifies window manager that user is switched. */ void onUserSwitched(); + + /** + * Hint to window manager that the user is interacting with a display that should be treated + * as the top display. + */ + void moveDisplayToTop(int displayId); } /** diff --git a/services/core/java/com/android/server/policy/role/LegacyRoleResolutionPolicy.java b/services/core/java/com/android/server/policy/role/LegacyRoleResolutionPolicy.java index 45c975b26956..055c941f8b0a 100644 --- a/services/core/java/com/android/server/policy/role/LegacyRoleResolutionPolicy.java +++ b/services/core/java/com/android/server/policy/role/LegacyRoleResolutionPolicy.java @@ -62,6 +62,8 @@ public class LegacyRoleResolutionPolicy implements RoleManagerService.RoleHolder mContext.getContentResolver(), Settings.Secure.SMS_DEFAULT_APPLICATION, userId); + // TODO: STOPSHIP: Remove the following code once we remove default_sms_application + // and use the new config_defaultRoleHolders. if (result == null) { Collection<SmsApplication.SmsApplicationData> applications = SmsApplication.getApplicationCollectionAsUser(mContext, userId); diff --git a/services/core/java/com/android/server/role/RoleManagerService.java b/services/core/java/com/android/server/role/RoleManagerService.java index c0ec3672c665..5516b234925b 100644 --- a/services/core/java/com/android/server/role/RoleManagerService.java +++ b/services/core/java/com/android/server/role/RoleManagerService.java @@ -229,9 +229,12 @@ public class RoleManagerService extends SystemService implements RoleUserState.C // Any role for which we have a record are already migrated RoleUserState userState = getOrCreateUserState(userId); if (!userState.isRoleAvailable(role)) { - userState.addRoleName(role); List<String> roleHolders = mLegacyRoleResolver.getRoleHolders(role, userId); + if (roleHolders.isEmpty()) { + return; + } Slog.i(LOG_TAG, "Migrating " + role + ", legacy holders: " + roleHolders); + userState.addRoleName(role); int size = roleHolders.size(); for (int i = 0; i < size; i++) { userState.addRoleHolder(role, roleHolders.get(i)); diff --git a/services/core/java/com/android/server/wm/ActivityDisplay.java b/services/core/java/com/android/server/wm/ActivityDisplay.java index 1f638c7f2e5d..65d66f44b5dd 100644 --- a/services/core/java/com/android/server/wm/ActivityDisplay.java +++ b/services/core/java/com/android/server/wm/ActivityDisplay.java @@ -278,12 +278,12 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack> } // Since positionChildAt() is called during the creation process of pinned stacks, - // ActivityStack#getWindowContainerController() can be null. In this special case, + // ActivityStack#getStack() can be null. In this special case, // since DisplayContest#positionStackAt() is called in TaskStack#onConfigurationChanged(), // we don't have to call WindowContainerController#positionChildAt() here. - if (stack.getWindowContainerController() != null && mDisplayContent != null) { + if (stack.getTaskStack() != null && mDisplayContent != null) { mDisplayContent.positionStackAt(insertPosition, - stack.getWindowContainerController().mContainer, includingParents); + stack.getTaskStack(), includingParents); } if (!wasContained) { stack.setParent(this); @@ -450,13 +450,12 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack> @VisibleForTesting <T extends ActivityStack> T createStackUnchecked(int windowingMode, int activityType, int stackId, boolean onTop) { - if (windowingMode == WINDOWING_MODE_PINNED) { - return (T) new PinnedActivityStack(this, stackId, - mRootActivityContainer.mStackSupervisor, onTop); + if (windowingMode == WINDOWING_MODE_PINNED && activityType != ACTIVITY_TYPE_STANDARD) { + throw new IllegalArgumentException("Stack with windowing mode cannot with non standard " + + "activity type."); } return (T) new ActivityStack(this, stackId, - mRootActivityContainer.mStackSupervisor, windowingMode, activityType, - onTop); + mRootActivityContainer.mStackSupervisor, windowingMode, activityType, onTop); } /** @@ -626,6 +625,10 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack> return; } + // Collect the stacks that are necessary to be removed instead of performing the removal + // by looping mStacks, so that we don't miss any stacks after the stack size changed or + // stacks reordered. + final ArrayList<ActivityStack> stacks = new ArrayList<>(); for (int j = windowingModes.length - 1 ; j >= 0; --j) { final int windowingMode = windowingModes[j]; for (int i = mStacks.size() - 1; i >= 0; --i) { @@ -636,9 +639,13 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack> if (stack.getWindowingMode() != windowingMode) { continue; } - mRootActivityContainer.mStackSupervisor.removeStack(stack); + stacks.add(stack); } } + + for (int i = stacks.size() - 1; i >= 0; --i) { + mRootActivityContainer.mStackSupervisor.removeStack(stacks.get(i)); + } } void removeStacksWithActivityTypes(int... activityTypes) { @@ -646,15 +653,23 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack> return; } + // Collect the stacks that are necessary to be removed instead of performing the removal + // by looping mStacks, so that we don't miss any stacks after the stack size changed or + // stacks reordered. + final ArrayList<ActivityStack> stacks = new ArrayList<>(); for (int j = activityTypes.length - 1 ; j >= 0; --j) { final int activityType = activityTypes[j]; for (int i = mStacks.size() - 1; i >= 0; --i) { final ActivityStack stack = mStacks.get(i); if (stack.getActivityType() == activityType) { - mRootActivityContainer.mStackSupervisor.removeStack(stack); + stacks.add(stack); } } } + + for (int i = stacks.size() - 1; i >= 0; --i) { + mRootActivityContainer.mStackSupervisor.removeStack(stacks.get(i)); + } } void onStackWindowingModeChanged(ActivityStack stack) { @@ -1019,8 +1034,8 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack> return mSplitScreenPrimaryStack != null; } - PinnedActivityStack getPinnedStack() { - return (PinnedActivityStack) mPinnedStack; + ActivityStack getPinnedStack() { + return mPinnedStack; } boolean hasPinnedStack() { diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 4d7de9058105..891c3da90b93 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -114,6 +114,7 @@ import android.app.ActivityManagerInternal; import android.app.ActivityOptions; import android.app.AppGlobals; import android.app.IActivityController; +import android.app.RemoteAction; import android.app.ResultInfo; import android.app.WindowConfiguration.ActivityType; import android.app.WindowConfiguration.WindowingMode; @@ -173,8 +174,7 @@ import java.util.Set; /** * State and management of a single stack of activities. */ -class ActivityStack<T extends StackWindowController> extends ConfigurationContainer - implements StackWindowListener { +class ActivityStack extends ConfigurationContainer { private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityStack" : TAG_ATM; private static final String TAG_ADD_REMOVE = TAG + POSTFIX_ADD_REMOVE; private static final String TAG_APP = TAG + POSTFIX_APP; @@ -297,8 +297,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai static final int REMOVE_TASK_MODE_MOVING_TO_TOP = 2; final ActivityTaskManagerService mService; - private final WindowManagerService mWindowManager; - T mWindowContainerController; + final WindowManagerService mWindowManager; /** * The back history of all previous (and possibly still @@ -397,6 +396,9 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai static final int DESTROY_ACTIVITIES_MSG = FIRST_ACTIVITY_STACK_MSG + 5; static final int TRANSLUCENT_TIMEOUT_MSG = FIRST_ACTIVITY_STACK_MSG + 6; + // TODO: remove after unification. + TaskStack mTaskStack; + private static class ScheduleDestroyArgs { final WindowProcessController mOwner; final String mReason; @@ -495,21 +497,30 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai // stacks on a wrong display. mDisplayId = display.mDisplayId; setActivityType(activityType); - mWindowContainerController = createStackWindowController(display.mDisplayId, onTop, - mTmpRect2); + createTaskStack(display.mDisplayId, onTop, mTmpRect2); setWindowingMode(windowingMode, false /* animate */, false /* showRecents */, false /* enteringSplitScreenMode */, false /* deferEnsuringVisibility */, true /* creating */); display.addChild(this, onTop ? POSITION_TOP : POSITION_BOTTOM); } - T createStackWindowController(int displayId, boolean onTop, Rect outBounds) { - return (T) new StackWindowController(mStackId, this, displayId, onTop, outBounds, - mRootActivityContainer.mWindowManager); + void createTaskStack(int displayId, boolean onTop, Rect outBounds) { + final DisplayContent dc = mWindowManager.mRoot.getDisplayContent(displayId); + if (dc == null) { + throw new IllegalArgumentException("Trying to add stackId=" + mStackId + + " to unknown displayId=" + displayId); + } + mTaskStack = new TaskStack(mWindowManager, mStackId, this); + dc.setStackOnDisplay(mStackId, onTop, mTaskStack); + if (mTaskStack.matchParentBounds()) { + outBounds.setEmpty(); + } else { + mTaskStack.getRawBounds(outBounds); + } } - T getWindowContainerController() { - return mWindowContainerController; + TaskStack getTaskStack() { + return mTaskStack; } /** @@ -553,6 +564,9 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai if (display == null) { return; } + if (getTaskStack() == null) { + return; + } // Update bounds if applicable boolean hasNewOverrideBounds = false; @@ -560,8 +574,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai if (getRequestedOverrideWindowingMode() == WINDOWING_MODE_PINNED) { // Pinned calculation already includes rotation mTmpRect2.set(mTmpRect); - hasNewOverrideBounds = getWindowContainerController().mContainer - .calculatePinnedBoundsForConfigChange(mTmpRect2); + hasNewOverrideBounds = getTaskStack().calculatePinnedBoundsForConfigChange(mTmpRect2); } else { final int newRotation = getWindowConfiguration().getRotation(); if (!matchParentBounds()) { @@ -588,7 +601,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai || getRequestedOverrideWindowingMode() == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY) { mTmpRect2.set(mTmpRect); - getWindowContainerController().mContainer + getTaskStack() .calculateDockedBoundsForConfigChange(newParentConfig, mTmpRect2); hasNewOverrideBounds = true; } @@ -786,7 +799,11 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai mTmpRect2.setEmpty(); if (windowingMode != WINDOWING_MODE_FULLSCREEN) { - mWindowContainerController.getRawBounds(mTmpRect2); + if (mTaskStack.matchParentBounds()) { + mTmpRect2.setEmpty(); + } else { + mTaskStack.getRawBounds(mTmpRect2); + } } if (!Objects.equals(getRequestedOverrideBounds(), mTmpRect2)) { @@ -843,7 +860,12 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai // Reparent the window container before we try to update the position when adding it to // the new display below mTmpRect2.setEmpty(); - mWindowContainerController.reparent(activityDisplay.mDisplayId, mTmpRect2, onTop); + if (mTaskStack == null) { + // TODO: Remove after unification. + Log.w(TAG, "Task stack is not valid when reparenting."); + } else { + mTaskStack.reparent(activityDisplay.mDisplayId, mTmpRect2, onTop); + } setBounds(mTmpRect2.isEmpty() ? null : mTmpRect2); activityDisplay.addChild(this, onTop ? POSITION_TOP : POSITION_BOTTOM); if (!displayRemoved) { @@ -876,8 +898,10 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai /** Removes the stack completely. Also calls WindowManager to do the same on its side. */ void remove() { removeFromDisplay(); - mWindowContainerController.removeContainer(); - mWindowContainerController = null; + if (mTaskStack != null) { + mTaskStack.removeIfPossible(); + mTaskStack = null; + } onParentChanged(); } @@ -890,26 +914,35 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai */ void getStackDockedModeBounds(Rect dockedBounds, Rect currentTempTaskBounds, Rect outStackBounds, Rect outTempTaskBounds) { - mWindowContainerController.getStackDockedModeBounds(getParent().getConfiguration(), - dockedBounds, currentTempTaskBounds, - outStackBounds, outTempTaskBounds); + if (mTaskStack != null) { + mTaskStack.getStackDockedModeBoundsLocked(getParent().getConfiguration(), dockedBounds, + currentTempTaskBounds, outStackBounds, outTempTaskBounds); + } else { + outStackBounds.setEmpty(); + outTempTaskBounds.setEmpty(); + } } void prepareFreezingTaskBounds() { - mWindowContainerController.prepareFreezingTaskBounds(); + if (mTaskStack != null) { + // TODO: This cannot be false after unification. + mTaskStack.prepareFreezingTaskBounds(); + } } void getWindowContainerBounds(Rect outBounds) { - if (mWindowContainerController != null) { - mWindowContainerController.getBounds(outBounds); + if (mTaskStack != null) { + mTaskStack.getBounds(outBounds); return; } outBounds.setEmpty(); } void positionChildWindowContainerAtTop(TaskRecord child) { - mWindowContainerController.positionChildAtTop(child.getTask(), - true /* includingParents */); + if (mTaskStack != null) { + // TODO: Remove after unification. This cannot be false after that. + mTaskStack.positionChildAtTop(child.getTask(), true /* includingParents */); + } } void positionChildWindowContainerAtBottom(TaskRecord child) { @@ -918,14 +951,27 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai // task to bottom, the next focusable stack on the same display should be focused. final ActivityStack nextFocusableStack = getDisplay().getNextFocusableStack( child.getStack(), true /* ignoreCurrent */); - mWindowContainerController.positionChildAtBottom(child.getTask(), - nextFocusableStack == null /* includingParents */); + if (mTaskStack != null) { + // TODO: Remove after unification. This cannot be false after that. + mTaskStack.positionChildAtBottom(child.getTask(), + nextFocusableStack == null /* includingParents */); + } } /** * Returns whether to defer the scheduling of the multi-window mode. */ boolean deferScheduleMultiWindowModeChanged() { + if (inPinnedWindowingMode()) { + // For the pinned stack, the deferring of the multi-window mode changed is tied to the + // transition animation into picture-in-picture, and is called once the animation + // completes, or is interrupted in a way that would leave the stack in a non-fullscreen + // state. + // @see BoundsAnimationController + // @see BoundsAnimationControllerTests + if (getTaskStack() == null) return false; + return getTaskStack().deferScheduleMultiWindowModeChanged(); + } return false; } @@ -2994,7 +3040,10 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai position = getAdjustedPositionForTask(task, position, null /* starting */); mTaskHistory.remove(task); mTaskHistory.add(position, task); - mWindowContainerController.positionChildAt(task.getTask(), position); + if (mTaskStack != null) { + // TODO: this could not be false after unification. + mTaskStack.positionChildAt(task.getTask(), position); + } updateTaskMovement(task, true); } @@ -4909,8 +4958,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai } // TODO: Figure-out a way to consolidate with resize() method below. - @Override - public void requestResize(Rect bounds) { + void requestResize(Rect bounds) { mService.resizeStack(mStackId, bounds, true /* allowResizeInDockedMode */, false /* preserveWindows */, false /* animate */, -1 /* animationDuration */); @@ -4948,7 +4996,8 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai } void onPipAnimationEndResize() { - mWindowContainerController.onPipAnimationEndResize(); + if (mTaskStack == null) return; + mTaskStack.onPipAnimationEndResize(); } @@ -5494,6 +5543,65 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai } } + + Rect getDefaultPictureInPictureBounds(float aspectRatio) { + if (getTaskStack() == null) return null; + return getTaskStack().getPictureInPictureBounds(aspectRatio, null /* currentStackBounds */); + } + + void animateResizePinnedStack(Rect sourceHintBounds, Rect toBounds, int animationDuration, + boolean fromFullscreen) { + if (!inPinnedWindowingMode()) return; + if (skipResizeAnimation(toBounds == null /* toFullscreen */)) { + mService.moveTasksToFullscreenStack(mStackId, true /* onTop */); + } else { + if (getTaskStack() == null) return; + getTaskStack().animateResizePinnedStack(toBounds, sourceHintBounds, + animationDuration, fromFullscreen); + } + } + + private boolean skipResizeAnimation(boolean toFullscreen) { + if (!toFullscreen) { + return false; + } + final Configuration parentConfig = getParent().getConfiguration(); + final ActivityRecord top = topRunningNonOverlayTaskActivity(); + return top != null && !top.isConfigurationCompatible(parentConfig); + } + + void setPictureInPictureAspectRatio(float aspectRatio) { + if (getTaskStack() == null) return; + getTaskStack().setPictureInPictureAspectRatio(aspectRatio); + } + + void setPictureInPictureActions(List<RemoteAction> actions) { + if (getTaskStack() == null) return; + getTaskStack().setPictureInPictureActions(actions); + } + + boolean isAnimatingBoundsToFullscreen() { + if (getTaskStack() == null) return false; + return getTaskStack().isAnimatingBoundsToFullscreen(); + } + + public void updatePictureInPictureModeForPinnedStackAnimation(Rect targetStackBounds, + boolean forceUpdate) { + // It is guaranteed that the activities requiring the update will be in the pinned stack at + // this point (either reparented before the animation into PiP, or before reparenting after + // the animation out of PiP) + synchronized (mService.mGlobalLock) { + if (!isAttached()) { + return; + } + ArrayList<TaskRecord> tasks = getAllTasks(); + for (int i = 0; i < tasks.size(); i++) { + mStackSupervisor.updatePictureInPictureMode(tasks.get(i), targetStackBounds, + forceUpdate); + } + } + } + public int getStackId() { return mStackId; } diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java index a50ae8431cb0..3a288ca5560d 100644 --- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java @@ -1674,8 +1674,8 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { } void resizePinnedStackLocked(Rect pinnedBounds, Rect tempPinnedTaskBounds) { - // TODO(multi-display): Pinned stack display should be passed in. - final PinnedActivityStack stack = + // TODO(multi-display): The display containing the stack should be passed in. + final ActivityStack stack = mRootActivityContainer.getDefaultDisplay().getPinnedStack(); if (stack == null) { Slog.w(TAG, "resizePinnedStackLocked: pinned stack not found"); @@ -1686,7 +1686,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { // another AM call that is holding the AMS lock. In such a case, the pinnedBounds may be // incorrect if AMS.resizeStackWithBoundsFromWindowManager() is already called while waiting // for the AMS lock to be freed. So check and make sure these bounds are still good. - final PinnedStackWindowController stackController = stack.getWindowContainerController(); + final TaskStack stackController = stack.getTaskStack(); if (stackController.pinnedStackResizeDisallowed()) { return; } @@ -1730,15 +1730,14 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { * invisible as well and added to the stopping list. After which we process the * stopping list by handling the idle. */ - final PinnedActivityStack pinnedStack = (PinnedActivityStack) stack; - pinnedStack.mForceHidden = true; - pinnedStack.ensureActivitiesVisibleLocked(null, 0, PRESERVE_WINDOWS); - pinnedStack.mForceHidden = false; + stack.mForceHidden = true; + stack.ensureActivitiesVisibleLocked(null, 0, PRESERVE_WINDOWS); + stack.mForceHidden = false; activityIdleInternalLocked(null, false /* fromTimeout */, true /* processPausingActivites */, null /* configuration */); // Move all the tasks to the bottom of the fullscreen stack - moveTasksToFullscreenStackLocked(pinnedStack, !ON_TOP); + moveTasksToFullscreenStackLocked(stack, !ON_TOP); } else { for (int i = tasks.size() - 1; i >= 0; i--) { removeTaskByIdLocked(tasks.get(i).taskId, true /* killProcess */, @@ -2642,6 +2641,9 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { try { mService.moveTaskToFrontLocked(task.taskId, 0, options, true /* fromRecents */); + // Apply options to prevent pendingOptions be taken by client to make sure + // the override pending app transition will be applied immediately. + targetActivity.applyOptionsLocked(); } finally { mActivityMetricsLogger.notifyActivityLaunched(START_TASK_TO_FRONT, targetActivity); diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 2cd4921a6672..6a495d4e9683 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -82,13 +82,10 @@ import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.HEA import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.HOME_PROC; import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.LAUNCHING_ACTIVITY; import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.PREVIOUS_PROC; -import static com.android.server.am.ActivityManagerServiceDumpProcessesProto - .PREVIOUS_PROC_VISIBLE_TIME_MS; +import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.PREVIOUS_PROC_VISIBLE_TIME_MS; import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.SCREEN_COMPAT_PACKAGES; -import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.ScreenCompatPackage - .MODE; -import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.ScreenCompatPackage - .PACKAGE; +import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.ScreenCompatPackage.MODE; +import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.ScreenCompatPackage.PACKAGE; import static com.android.server.wm.ActivityStack.REMOVE_TASK_MODE_DESTROYING; import static com.android.server.wm.ActivityStackSupervisor.DEFER_RESUME; import static com.android.server.wm.ActivityStackSupervisor.ON_TOP; @@ -2408,7 +2405,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { try { synchronized (mGlobalLock) { if (animate) { - final PinnedActivityStack stack = mRootActivityContainer.getStack(stackId); + final ActivityStack stack = mRootActivityContainer.getStack(stackId); if (stack == null) { Slog.w(TAG, "resizeStack: stackId " + stackId + " not found."); return; @@ -3713,7 +3710,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { final long ident = Binder.clearCallingIdentity(); try { synchronized (mGlobalLock) { - final PinnedActivityStack stack = + final ActivityStack stack = mRootActivityContainer.getDefaultDisplay().getPinnedStack(); if (stack == null) { Slog.w(TAG, "dismissPip: pinned stack not found."); @@ -3835,9 +3832,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { // If we are animating to fullscreen then we have already dispatched the PIP mode // changed, so we should reflect that check here as well. - final PinnedActivityStack stack = r.getActivityStack(); - final PinnedStackWindowController windowController = stack.getWindowContainerController(); - return !windowController.mContainer.isAnimatingBoundsToFullscreen(); + final TaskStack taskStack = r.getActivityStack().getTaskStack(); + return !taskStack.isAnimatingBoundsToFullscreen(); } @Override @@ -3871,7 +3867,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { r.pictureInPictureArgs.getSourceRectHint()); mRootActivityContainer.moveActivityToPinnedStack( r, sourceBounds, aspectRatio, "enterPictureInPictureMode"); - final PinnedActivityStack stack = r.getActivityStack(); + final ActivityStack stack = r.getActivityStack(); stack.setPictureInPictureAspectRatio(aspectRatio); stack.setPictureInPictureActions(actions); MetricsLoggerWrapper.logPictureInPictureEnter(mContext, r.appInfo.uid, @@ -3915,7 +3911,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { // If the activity is already in picture-in-picture, update the pinned stack now // if it is not already expanding to fullscreen. Otherwise, the arguments will // be used the next time the activity enters PiP - final PinnedActivityStack stack = r.getActivityStack(); + final ActivityStack stack = r.getActivityStack(); if (!stack.isAnimatingBoundsToFullscreen()) { stack.setPictureInPictureAspectRatio( r.pictureInPictureArgs.getAspectRatio()); diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 45bb94b1f43b..6527ca0e751d 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -328,14 +328,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo private int mLastOrientation = SCREEN_ORIENTATION_UNSPECIFIED; /** - * Flag indicating that the application is receiving an orientation that has different metrics - * than it expected. E.g. Portrait instead of Landscape. - * - * @see #updateRotationUnchecked() - */ - private boolean mAltOrientation = false; - - /** * Orientation forced by some window. If there is no visible window that specifies orientation * it is set to {@link android.content.pm.ActivityInfo#SCREEN_ORIENTATION_UNSPECIFIED}. * @@ -1085,10 +1077,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo return mLastOrientation; } - boolean getAltOrientation() { - return mAltOrientation; - } - int getLastWindowForcedOrientation() { return mLastWindowForcedOrientation; } @@ -1130,15 +1118,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo boolean rotationNeedsUpdate() { final int lastOrientation = getLastOrientation(); final int oldRotation = getRotation(); - final boolean oldAltOrientation = getAltOrientation(); final int rotation = mDisplayRotation.rotationForOrientation(lastOrientation, oldRotation); - final boolean altOrientation = !mDisplayRotation.rotationHasCompatibleMetrics( - lastOrientation, rotation); - if (oldRotation == rotation && oldAltOrientation == altOrientation) { - return false; - } - return true; + return oldRotation != rotation; } /** @@ -1336,7 +1318,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo final int oldRotation = mRotation; final int lastOrientation = mLastOrientation; - final boolean oldAltOrientation = mAltOrientation; final int rotation = mDisplayRotation.rotationForOrientation(lastOrientation, oldRotation); if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Computed rotation=" + rotation + " for display id=" + mDisplayId + " based on lastOrientation=" + lastOrientation @@ -1368,35 +1349,26 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } final boolean rotateSeamlessly = mayRotateSeamlessly; - // TODO: Implement forced rotation changes. - // Set mAltOrientation to indicate that the application is receiving - // an orientation that has different metrics than it expected. - // eg. Portrait instead of Landscape. - - final boolean altOrientation = !mDisplayRotation.rotationHasCompatibleMetrics( - lastOrientation, rotation); - if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Display id=" + mDisplayId + " selected orientation " + lastOrientation + ", got rotation " + rotation + " which has " - + (altOrientation ? "incompatible" : "compatible") + " metrics"); + + " metrics"); - if (oldRotation == rotation && oldAltOrientation == altOrientation) { + if (oldRotation == rotation) { // No change. return false; } if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Display id=" + mDisplayId + " rotation changed to " + rotation - + (altOrientation ? " (alt)" : "") + " from " + oldRotation - + (oldAltOrientation ? " (alt)" : "") + ", lastOrientation=" + lastOrientation); + + " from " + oldRotation + + ", lastOrientation=" + lastOrientation); if (DisplayContent.deltaRotation(rotation, oldRotation) != 2) { mWaitingForConfig = true; } mRotation = rotation; - mAltOrientation = altOrientation; mWmService.mWindowsFreezingScreen = WINDOWS_FREEZING_SCREENS_ACTIVE; mWmService.mH.sendNewMessageDelayed(WindowManagerService.H.WINDOW_FREEZE_TIMEOUT, @@ -1538,26 +1510,8 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo private DisplayInfo updateDisplayAndOrientation(int uiMode) { // Use the effective "visual" dimensions based on current rotation final boolean rotated = (mRotation == ROTATION_90 || mRotation == ROTATION_270); - final int realdw = rotated ? mBaseDisplayHeight : mBaseDisplayWidth; - final int realdh = rotated ? mBaseDisplayWidth : mBaseDisplayHeight; - int dw = realdw; - int dh = realdh; - - if (mAltOrientation) { - if (realdw > realdh) { - // Turn landscape into portrait. - int maxw = (int)(realdh/1.3f); - if (maxw < realdw) { - dw = maxw; - } - } else { - // Turn portrait into landscape. - int maxh = (int)(realdw/1.3f); - if (maxh < realdh) { - dh = maxh; - } - } - } + final int dw = rotated ? mBaseDisplayHeight : mBaseDisplayWidth; + final int dh = rotated ? mBaseDisplayWidth : mBaseDisplayHeight; // Update application display metrics. final WmDisplayCutout wmDisplayCutout = calculateDisplayCutoutForRotation(mRotation); @@ -2309,13 +2263,12 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo out.set(mDisplayFrames.mStable); } - TaskStack createStack(int stackId, boolean onTop, StackWindowController controller) { - if (DEBUG_STACK) Slog.d(TAG_WM, "Create new stackId=" + stackId + " on displayId=" - + mDisplayId); + void setStackOnDisplay(int stackId, boolean onTop, TaskStack stack) { + if (DEBUG_STACK) { + Slog.d(TAG_WM, "Create new stackId=" + stackId + " on displayId=" + mDisplayId); + } - final TaskStack stack = new TaskStack(mWmService, stackId, controller); mTaskStackContainers.addStackToDisplay(stack, onTop); - return stack; } void moveStackToDisplay(TaskStack stack, boolean onTop) { @@ -4017,7 +3970,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo /** * Adds the stack to this container. - * @see DisplayContent#createStack(int, boolean, StackWindowController) */ void addStackToDisplay(TaskStack stack, boolean onTop) { addStackReferenceIfNeeded(stack); diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java index 7aabc15d9860..bc165dceb544 100644 --- a/services/core/java/com/android/server/wm/DisplayRotation.java +++ b/services/core/java/com/android/server/wm/DisplayRotation.java @@ -676,36 +676,6 @@ public class DisplayRotation { return rotation == mPortraitRotation || rotation == mUpsideDownRotation; } - /** - * Given an orientation constant and a rotation, returns true if the rotation - * has compatible metrics to the requested orientation. For example, if - * the application requested landscape and got seascape, then the rotation - * has compatible metrics; if the application requested portrait and got landscape, - * then the rotation has incompatible metrics; if the application did not specify - * a preference, then anything goes. - * - * @param orientation An orientation constant, such as - * {@link android.content.pm.ActivityInfo#SCREEN_ORIENTATION_LANDSCAPE}. - * @param rotation The rotation to check. - * @return True if the rotation is compatible with the requested orientation. - */ - boolean rotationHasCompatibleMetrics(int orientation, int rotation) { - switch (orientation) { - case ActivityInfo.SCREEN_ORIENTATION_PORTRAIT: - case ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT: - case ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT: - return isAnyPortrait(rotation); - - case ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE: - case ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE: - case ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE: - return isLandscapeOrSeascape(rotation); - - default: - return true; - } - } - private boolean isValidRotationChoice(final int preferredRotation) { // Determine if the given app orientation is compatible with the provided rotation choice. switch (mCurrentAppOrientation) { diff --git a/services/core/java/com/android/server/wm/LaunchParamsPersister.java b/services/core/java/com/android/server/wm/LaunchParamsPersister.java index 3062d34780b6..86dc66dbca3b 100644 --- a/services/core/java/com/android/server/wm/LaunchParamsPersister.java +++ b/services/core/java/com/android/server/wm/LaunchParamsPersister.java @@ -221,7 +221,7 @@ class LaunchParamsPersister { } private boolean saveTaskToLaunchParam(TaskRecord task, PersistableLaunchParams params) { - final ActivityStack<?> stack = task.getStack(); + final ActivityStack stack = task.getStack(); final int displayId = stack.mDisplayId; final ActivityDisplay display = mSupervisor.mRootActivityContainer.getActivityDisplay(displayId); diff --git a/services/core/java/com/android/server/wm/PinnedActivityStack.java b/services/core/java/com/android/server/wm/PinnedActivityStack.java deleted file mode 100644 index 2a05af4f473c..000000000000 --- a/services/core/java/com/android/server/wm/PinnedActivityStack.java +++ /dev/null @@ -1,111 +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.server.wm; - -import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; -import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; - -import android.app.RemoteAction; -import android.content.res.Configuration; -import android.graphics.Rect; - -import java.util.ArrayList; -import java.util.List; - -/** - * State and management of the pinned stack of activities. - */ -class PinnedActivityStack extends ActivityStack<PinnedStackWindowController> - implements PinnedStackWindowListener { - - PinnedActivityStack(ActivityDisplay display, int stackId, ActivityStackSupervisor supervisor, - boolean onTop) { - super(display, stackId, supervisor, WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, onTop); - } - - @Override - PinnedStackWindowController createStackWindowController(int displayId, boolean onTop, - Rect outBounds) { - return new PinnedStackWindowController(mStackId, this, displayId, onTop, outBounds, - mRootActivityContainer.mWindowManager); - } - - Rect getDefaultPictureInPictureBounds(float aspectRatio) { - return getWindowContainerController().getPictureInPictureBounds(aspectRatio, - null /* currentStackBounds */); - } - - void animateResizePinnedStack(Rect sourceHintBounds, Rect toBounds, int animationDuration, - boolean fromFullscreen) { - if (skipResizeAnimation(toBounds == null /* toFullscreen */)) { - mService.moveTasksToFullscreenStack(mStackId, true /* onTop */); - } else { - getWindowContainerController().animateResizePinnedStack(toBounds, sourceHintBounds, - animationDuration, fromFullscreen); - } - } - - private boolean skipResizeAnimation(boolean toFullscreen) { - if (!toFullscreen) { - return false; - } - final Configuration parentConfig = getParent().getConfiguration(); - final ActivityRecord top = topRunningNonOverlayTaskActivity(); - return top != null && !top.isConfigurationCompatible(parentConfig); - } - - void setPictureInPictureAspectRatio(float aspectRatio) { - getWindowContainerController().setPictureInPictureAspectRatio(aspectRatio); - } - - void setPictureInPictureActions(List<RemoteAction> actions) { - getWindowContainerController().setPictureInPictureActions(actions); - } - - boolean isAnimatingBoundsToFullscreen() { - return getWindowContainerController().mContainer.isAnimatingBoundsToFullscreen(); - } - - /** - * Returns whether to defer the scheduling of the multi-window mode. - */ - boolean deferScheduleMultiWindowModeChanged() { - // For the pinned stack, the deferring of the multi-window mode changed is tied to the - // transition animation into picture-in-picture, and is called once the animation completes, - // or is interrupted in a way that would leave the stack in a non-fullscreen state. - // @see BoundsAnimationController - // @see BoundsAnimationControllerTests - return mWindowContainerController.deferScheduleMultiWindowModeChanged(); - } - - public void updatePictureInPictureModeForPinnedStackAnimation(Rect targetStackBounds, - boolean forceUpdate) { - // It is guaranteed that the activities requiring the update will be in the pinned stack at - // this point (either reparented before the animation into PiP, or before reparenting after - // the animation out of PiP) - synchronized (mService.mGlobalLock) { - if (!isAttached()) { - return; - } - ArrayList<TaskRecord> tasks = getAllTasks(); - for (int i = 0; i < tasks.size(); i++ ) { - mStackSupervisor.updatePictureInPictureMode(tasks.get(i), targetStackBounds, - forceUpdate); - } - } - } -} diff --git a/services/core/java/com/android/server/wm/PinnedStackWindowController.java b/services/core/java/com/android/server/wm/PinnedStackWindowController.java deleted file mode 100644 index 518e39ba9d58..000000000000 --- a/services/core/java/com/android/server/wm/PinnedStackWindowController.java +++ /dev/null @@ -1,205 +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.server.wm; - -import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; -import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; - -import static com.android.server.wm.BoundsAnimationController.NO_PIP_MODE_CHANGED_CALLBACKS; -import static com.android.server.wm.BoundsAnimationController.SCHEDULE_PIP_MODE_CHANGED_ON_END; -import static com.android.server.wm.BoundsAnimationController.SCHEDULE_PIP_MODE_CHANGED_ON_START; -import static com.android.server.wm.BoundsAnimationController.SchedulePipModeChangedState; - -import android.app.RemoteAction; -import android.graphics.Rect; - -import java.util.List; - -/** - * Controller for the pinned stack container. See {@link StackWindowController}. - */ -public class PinnedStackWindowController extends StackWindowController { - - private Rect mTmpFromBounds = new Rect(); - private Rect mTmpToBounds = new Rect(); - - public PinnedStackWindowController(int stackId, PinnedStackWindowListener listener, - int displayId, boolean onTop, Rect outBounds, WindowManagerService service) { - super(stackId, listener, displayId, onTop, outBounds, service); - } - - /** - * @return the {@param currentStackBounds} transformed to the give {@param aspectRatio}. If - * {@param currentStackBounds} is null, then the {@param aspectRatio} is applied to the - * default bounds. - */ - public Rect getPictureInPictureBounds(float aspectRatio, Rect stackBounds) { - synchronized (mGlobalLock) { - if (!mService.mSupportsPictureInPicture || mContainer == null) { - return null; - } - - final DisplayContent displayContent = mContainer.getDisplayContent(); - if (displayContent == null) { - return null; - } - - final PinnedStackController pinnedStackController = - displayContent.getPinnedStackController(); - if (stackBounds == null) { - // Calculate the aspect ratio bounds from the default bounds - stackBounds = pinnedStackController.getDefaultOrLastSavedBounds(); - } - - if (pinnedStackController.isValidPictureInPictureAspectRatio(aspectRatio)) { - return pinnedStackController.transformBoundsToAspectRatio(stackBounds, aspectRatio, - true /* useCurrentMinEdgeSize */); - } else { - return stackBounds; - } - } - } - - /** - * Animates the pinned stack. - */ - public void animateResizePinnedStack(Rect toBounds, Rect sourceHintBounds, - int animationDuration, boolean fromFullscreen) { - synchronized (mGlobalLock) { - if (mContainer == null) { - throw new IllegalArgumentException("Pinned stack container not found :("); - } - - // Get the from-bounds - final Rect fromBounds = new Rect(); - mContainer.getBounds(fromBounds); - - // Get non-null fullscreen to-bounds for animating if the bounds are null - @SchedulePipModeChangedState int schedulePipModeChangedState = - NO_PIP_MODE_CHANGED_CALLBACKS; - final boolean toFullscreen = toBounds == null; - if (toFullscreen) { - if (fromFullscreen) { - throw new IllegalArgumentException("Should not defer scheduling PiP mode" - + " change on animation to fullscreen."); - } - schedulePipModeChangedState = SCHEDULE_PIP_MODE_CHANGED_ON_START; - - mService.getStackBounds( - WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, mTmpToBounds); - if (!mTmpToBounds.isEmpty()) { - // If there is a fullscreen bounds, use that - toBounds = new Rect(mTmpToBounds); - } else { - // Otherwise, use the display bounds - toBounds = new Rect(); - mContainer.getDisplayContent().getBounds(toBounds); - } - } else if (fromFullscreen) { - schedulePipModeChangedState = SCHEDULE_PIP_MODE_CHANGED_ON_END; - } - - mContainer.setAnimationFinalBounds(sourceHintBounds, toBounds, toFullscreen); - - final Rect finalToBounds = toBounds; - final @SchedulePipModeChangedState int finalSchedulePipModeChangedState = - schedulePipModeChangedState; - final DisplayContent displayContent = mContainer.getDisplayContent(); - displayContent.mBoundsAnimationController.getHandler().post(() -> { - if (mContainer == null) { - return; - } - displayContent.mBoundsAnimationController.animateBounds(mContainer, fromBounds, - finalToBounds, animationDuration, finalSchedulePipModeChangedState, - fromFullscreen, toFullscreen); - }); - } - } - - /** - * Sets the current picture-in-picture aspect ratio. - */ - public void setPictureInPictureAspectRatio(float aspectRatio) { - synchronized (mGlobalLock) { - if (!mService.mSupportsPictureInPicture || mContainer == null) { - return; - } - - final PinnedStackController pinnedStackController = - mContainer.getDisplayContent().getPinnedStackController(); - - if (Float.compare(aspectRatio, pinnedStackController.getAspectRatio()) != 0) { - mContainer.getAnimationOrCurrentBounds(mTmpFromBounds); - mTmpToBounds.set(mTmpFromBounds); - getPictureInPictureBounds(aspectRatio, mTmpToBounds); - if (!mTmpToBounds.equals(mTmpFromBounds)) { - animateResizePinnedStack(mTmpToBounds, null /* sourceHintBounds */, - -1 /* duration */, false /* fromFullscreen */); - } - pinnedStackController.setAspectRatio( - pinnedStackController.isValidPictureInPictureAspectRatio(aspectRatio) - ? aspectRatio : -1f); - } - } - } - - /** - * Sets the current picture-in-picture actions. - */ - public void setPictureInPictureActions(List<RemoteAction> actions) { - synchronized (mGlobalLock) { - if (!mService.mSupportsPictureInPicture || mContainer == null) { - return; - } - - mContainer.getDisplayContent().getPinnedStackController().setActions(actions); - } - } - - /** - * @return whether the multi-window mode change should be deferred as a part of a transition - * from fullscreen to non-fullscreen bounds. - */ - public boolean deferScheduleMultiWindowModeChanged() { - synchronized (mGlobalLock) { - return mContainer.deferScheduleMultiWindowModeChanged(); - } - } - - /** - * @return whether the stack can be resized from the bounds animation. - */ - public boolean pinnedStackResizeDisallowed() { - synchronized (mGlobalLock) { - return mContainer.pinnedStackResizeDisallowed(); - } - } - - /** - * The following calls are made from WM to AM. - */ - - /** Calls directly into activity manager so window manager lock shouldn't held. */ - public void updatePictureInPictureModeForPinnedStackAnimation(Rect targetStackBounds, - boolean forceUpdate) { - if (mListener != null) { - PinnedStackWindowListener listener = (PinnedStackWindowListener) mListener; - listener.updatePictureInPictureModeForPinnedStackAnimation(targetStackBounds, - forceUpdate); - } - } -} diff --git a/services/core/java/com/android/server/wm/PinnedStackWindowListener.java b/services/core/java/com/android/server/wm/PinnedStackWindowListener.java deleted file mode 100644 index 33e8a60329bf..000000000000 --- a/services/core/java/com/android/server/wm/PinnedStackWindowListener.java +++ /dev/null @@ -1,33 +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.server.wm; - -import android.graphics.Rect; - -/** - * Interface used by the creator of {@link PinnedStackWindowController} to listen to changes with - * the stack container. - */ -public interface PinnedStackWindowListener extends StackWindowListener { - - /** - * Called when the stack container pinned stack animation will change the picture-in-picture - * mode. This is a direct call into ActivityManager. - */ - default void updatePictureInPictureModeForPinnedStackAnimation(Rect targetStackBounds, - boolean forceUpdate) {} -} diff --git a/services/core/java/com/android/server/wm/RootActivityContainer.java b/services/core/java/com/android/server/wm/RootActivityContainer.java index f55c7c96e325..9b7214120aed 100644 --- a/services/core/java/com/android/server/wm/RootActivityContainer.java +++ b/services/core/java/com/android/server/wm/RootActivityContainer.java @@ -234,7 +234,7 @@ class RootActivityContainer extends ConfigurationContainer mWindowManager = wm; setWindowContainer(mWindowManager.mRoot); mDisplayManager = mService.mContext.getSystemService(DisplayManager.class); - mDisplayManager.registerDisplayListener(this, mService.mH); + mDisplayManager.registerDisplayListener(this, mService.mUiHandler); mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class); final Display[] displays = mDisplayManager.getDisplays(); @@ -955,7 +955,7 @@ class RootActivityContainer extends ConfigurationContainer mWindowManager.deferSurfaceLayout(); final ActivityDisplay display = r.getActivityStack().getDisplay(); - PinnedActivityStack stack = display.getPinnedStack(); + ActivityStack stack = display.getPinnedStack(); // This will clear the pinned stack by moving an existing task to the full screen stack, // ensuring only one task is present. diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java index 937c9d9fc809..58cf73a9a2bd 100644 --- a/services/core/java/com/android/server/wm/Session.java +++ b/services/core/java/com/android/server/wm/Session.java @@ -47,10 +47,9 @@ import android.view.IWindowId; import android.view.IWindowSession; import android.view.IWindowSessionCallback; import android.view.InputChannel; -import android.view.Surface; +import android.view.InsetsState; import android.view.SurfaceControl; import android.view.SurfaceSession; -import android.view.InsetsState; import android.view.WindowManager; import com.android.internal.os.logging.MetricsLoggerWrapper; @@ -432,7 +431,7 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { @Override public void insetsModified(IWindow window, InsetsState state) { - synchronized (mService.mWindowMap) { + synchronized (mService.mGlobalLock) { final WindowState windowState = mService.windowForClientLocked(this, window, false /* throwOnError */); if (windowState != null) { diff --git a/services/core/java/com/android/server/wm/StackWindowController.java b/services/core/java/com/android/server/wm/StackWindowController.java deleted file mode 100644 index ada807b1ff3c..000000000000 --- a/services/core/java/com/android/server/wm/StackWindowController.java +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright (C) 2016 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.wm; - -import static com.android.server.wm.WindowContainer.POSITION_BOTTOM; -import static com.android.server.wm.WindowContainer.POSITION_TOP; -import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK; -import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; - -import android.content.res.Configuration; -import android.graphics.Rect; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; -import android.util.Slog; -import android.util.SparseArray; - -import com.android.internal.annotations.VisibleForTesting; - -import java.lang.ref.WeakReference; - -/** - * Controller for the stack container. This is created by activity manager to link activity stacks - * to the stack container they use in window manager. - * - * Test class: {@link StackWindowControllerTests} - */ -public class StackWindowController - extends WindowContainerController<TaskStack, StackWindowListener> { - - private final int mStackId; - - private final H mHandler; - - final Rect mTmpBounds = new Rect(); - - public StackWindowController(int stackId, StackWindowListener listener, int displayId, - boolean onTop, Rect outBounds) { - this(stackId, listener, displayId, onTop, outBounds, WindowManagerService.getInstance()); - } - - @VisibleForTesting - public StackWindowController(int stackId, StackWindowListener listener, - int displayId, boolean onTop, Rect outBounds, WindowManagerService service) { - super(listener, service); - mStackId = stackId; - mHandler = new H(new WeakReference<>(this), service.mH.getLooper()); - - final DisplayContent dc = mRoot.getDisplayContent(displayId); - if (dc == null) { - throw new IllegalArgumentException("Trying to add stackId=" + stackId - + " to unknown displayId=" + displayId); - } - - dc.createStack(stackId, onTop, this); - getRawBounds(outBounds); - } - - @Override - public void removeContainer() { - if (mContainer != null) { - mContainer.removeIfPossible(); - super.removeContainer(); - } - } - - void reparent(int displayId, Rect outStackBounds, boolean onTop) { - if (mContainer == null) { - throw new IllegalArgumentException("Trying to move unknown stackId=" + mStackId - + " to displayId=" + displayId); - } - - final DisplayContent targetDc = mRoot.getDisplayContent(displayId); - if (targetDc == null) { - throw new IllegalArgumentException("Trying to move stackId=" + mStackId - + " to unknown displayId=" + displayId); - } - - targetDc.moveStackToDisplay(mContainer, onTop); - getRawBounds(outStackBounds); - } - - void positionChildAt(Task child, int position) { - if (DEBUG_STACK) { - Slog.i(TAG_WM, "positionChildAt: positioning task=" + child + " at " + position); - } - if (child == null) { - if (DEBUG_STACK) { - Slog.i(TAG_WM, "positionChildAt: could not find task=" + this); - } - return; - } - if (mContainer == null) { - if (DEBUG_STACK) { - Slog.i(TAG_WM, "positionChildAt: could not find stack for task=" + mContainer); - } - return; - } - child.positionAt(position); - mContainer.getDisplayContent().layoutAndAssignWindowLayersIfNeeded(); - } - - void positionChildAtTop(Task child, boolean includingParents) { - if (child == null) { - // TODO: Fix the call-points that cause this to happen. - return; - } - - mContainer.positionChildAt(POSITION_TOP, child, includingParents); - - final DisplayContent displayContent = mContainer.getDisplayContent(); - if (displayContent.mAppTransition.isTransitionSet()) { - child.setSendingToBottom(false); - } - displayContent.layoutAndAssignWindowLayersIfNeeded(); - } - - void positionChildAtBottom(Task child, boolean includingParents) { - if (child == null) { - // TODO: Fix the call-points that cause this to happen. - return; - } - - mContainer.positionChildAt(POSITION_BOTTOM, child, includingParents); - - if (mContainer.getDisplayContent().mAppTransition.isTransitionSet()) { - child.setSendingToBottom(true); - } - mContainer.getDisplayContent().layoutAndAssignWindowLayersIfNeeded(); - } - - /** - * Re-sizes a stack and its containing tasks. - * - * @param bounds New stack bounds. Passing in null sets the bounds to fullscreen. - * @param taskBounds Bounds for tasks in the resized stack, keyed by task id. - * @param taskTempInsetBounds Inset bounds for individual tasks, keyed by task id. - */ - public void resize(Rect bounds, SparseArray<Rect> taskBounds, - SparseArray<Rect> taskTempInsetBounds) { - if (mContainer == null) { - throw new IllegalArgumentException("resizeStack: stack " + this + " not found."); - } - // We might trigger a configuration change. Save the current task bounds for freezing. - mContainer.prepareFreezingTaskBounds(); - if (mContainer.setBounds(bounds, taskBounds, taskTempInsetBounds) - && mContainer.isVisible()) { - mContainer.getDisplayContent().setLayoutNeeded(); - mService.mWindowPlacerLocked.performSurfacePlacement(); - } - } - - public void onPipAnimationEndResize() { - mContainer.onPipAnimationEndResize(); - } - - /** - * @see TaskStack.getStackDockedModeBoundsLocked(ConfigurationContainer, Rect, Rect, Rect) - */ - public void getStackDockedModeBounds(Configuration parentConfig, Rect dockedBounds, - Rect currentTempTaskBounds, - Rect outStackBounds, Rect outTempTaskBounds) { - if (mContainer != null) { - mContainer.getStackDockedModeBoundsLocked(parentConfig, dockedBounds, - currentTempTaskBounds, outStackBounds, outTempTaskBounds); - return; - } - outStackBounds.setEmpty(); - outTempTaskBounds.setEmpty(); - } - - public void prepareFreezingTaskBounds() { - if (mContainer == null) { - throw new IllegalArgumentException("prepareFreezingTaskBounds: stack " + this - + " not found."); - } - mContainer.prepareFreezingTaskBounds(); - } - - public void getRawBounds(Rect outBounds) { - if (mContainer.matchParentBounds()) { - outBounds.setEmpty(); - } else { - mContainer.getRawBounds(outBounds); - } - } - - public void getBounds(Rect outBounds) { - if (mContainer != null) { - mContainer.getBounds(outBounds); - return; - } - outBounds.setEmpty(); - } - - void requestResize(Rect bounds) { - mHandler.obtainMessage(H.REQUEST_RESIZE, bounds).sendToTarget(); - } - - @Override - public String toString() { - return "{StackWindowController stackId=" + mStackId + "}"; - } - - private static final class H extends Handler { - - static final int REQUEST_RESIZE = 0; - - private final WeakReference<StackWindowController> mController; - - H(WeakReference<StackWindowController> controller, Looper looper) { - super(looper); - mController = controller; - } - - @Override - public void handleMessage(Message msg) { - final StackWindowController controller = mController.get(); - final StackWindowListener listener = (controller != null) - ? controller.mListener : null; - if (listener == null) { - return; - } - switch (msg.what) { - case REQUEST_RESIZE: - listener.requestResize((Rect) msg.obj); - break; - } - } - } -} diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index d334bd298ada..a7dd55b8a160 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -209,26 +209,14 @@ class Task extends WindowContainer<AppWindowToken> implements ConfigurationConta super.removeImmediately(); } - void reparent(StackWindowController stackController, int position, boolean moveParents) { - if (DEBUG_STACK) { - Slog.i(TAG_WM, "reparent: moving taskId=" + mTaskId - + " to stack=" + stackController + " at " + position); - } - final TaskStack stack = stackController.mContainer; - if (stack == null) { - throw new IllegalArgumentException("reparent: could not find stack=" - + stackController); - } - reparent(stack, position, moveParents); - getDisplayContent().layoutAndAssignWindowLayersIfNeeded(); - } - - void reparent(TaskStack stack, int position, boolean moveParents) { if (stack == mStack) { throw new IllegalArgumentException( "task=" + this + " already child of stack=" + mStack); } + if (stack == null) { + throw new IllegalArgumentException("reparent: could not find stack."); + } if (DEBUG_STACK) Slog.i(TAG, "reParentTask: removing taskId=" + mTaskId + " from stack=" + mStack); EventLog.writeEvent(WM_TASK_REMOVED, mTaskId, "reParentTask"); @@ -254,6 +242,7 @@ class Task extends WindowContainer<AppWindowToken> implements ConfigurationConta onDisplayChanged(displayContent); prevDisplayContent.setLayoutNeeded(); } + getDisplayContent().layoutAndAssignWindowLayersIfNeeded(); } /** @see ActivityTaskManagerService#positionTaskInStack(int, int, int). */ diff --git a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java index 6acd8641271c..f3050a903c70 100644 --- a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java +++ b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java @@ -709,7 +709,7 @@ class TaskLaunchParamsModifier implements LaunchParamsModifier { final List<TaskRecord> tasksToCheck = new ArrayList<>(); for (int i = 0; i < display.getChildCount(); ++i) { - ActivityStack<?> stack = display.getChildAt(i); + final ActivityStack stack = display.getChildAt(i); if (!stack.inFreeformWindowingMode()) { continue; } diff --git a/services/core/java/com/android/server/wm/TaskRecord.java b/services/core/java/com/android/server/wm/TaskRecord.java index e9448588a03c..69dcaf473b12 100644 --- a/services/core/java/com/android/server/wm/TaskRecord.java +++ b/services/core/java/com/android/server/wm/TaskRecord.java @@ -455,17 +455,10 @@ class TaskRecord extends ConfigurationContainer { } final Rect bounds = updateOverrideConfigurationFromLaunchBounds(); - final StackWindowController stackController = getStack().getWindowContainerController(); + final TaskStack stack = getStack().getTaskStack(); - if (DEBUG_STACK) { - Slog.i(TAG_WM, "TaskRecord: taskId=" + taskId - + " stack=" + stackController + " bounds=" + bounds); - } - - final TaskStack stack = stackController.mContainer; if (stack == null) { - throw new IllegalArgumentException("TaskRecord: invalid stack=" - + stackController); + throw new IllegalArgumentException("TaskRecord: invalid stack=" + mStack); } EventLog.writeEvent(WM_TASK_CREATED, taskId, stack.mStackId); mTask = new Task(taskId, stack, userId, mService.mWindowManager, mResizeMode, @@ -742,7 +735,7 @@ class TaskRecord extends ConfigurationContainer { // Must reparent first in window manager to avoid a situation where AM can delete the // we are coming from in WM before we reparent because it became empty. - mTask.reparent(toStack.getWindowContainerController(), position, + mTask.reparent(toStack.getTaskStack(), position, moveStackMode == REPARENT_MOVE_STACK_TO_FRONT); final boolean moveStackToFront = moveStackMode == REPARENT_MOVE_STACK_TO_FRONT diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index ee74bdfaa113..8ed7d04f026d 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -21,6 +21,7 @@ import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LE import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT; import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.PINNED_WINDOWING_MODE_ELEVATION_IN_DIP; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; @@ -33,6 +34,10 @@ import static android.view.WindowManager.DOCKED_LEFT; import static android.view.WindowManager.DOCKED_RIGHT; import static android.view.WindowManager.DOCKED_TOP; +import static com.android.server.wm.BoundsAnimationController.NO_PIP_MODE_CHANGED_CALLBACKS; +import static com.android.server.wm.BoundsAnimationController.SCHEDULE_PIP_MODE_CHANGED_ON_END; +import static com.android.server.wm.BoundsAnimationController.SCHEDULE_PIP_MODE_CHANGED_ON_START; +import static com.android.server.wm.BoundsAnimationController.SchedulePipModeChangedState; import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_DOCKED_DIVIDER; import static com.android.server.wm.StackProto.ADJUSTED_BOUNDS; import static com.android.server.wm.StackProto.ADJUSTED_FOR_IME; @@ -47,10 +52,12 @@ import static com.android.server.wm.StackProto.ID; import static com.android.server.wm.StackProto.MINIMIZE_AMOUNT; import static com.android.server.wm.StackProto.TASKS; import static com.android.server.wm.StackProto.WINDOW_CONTAINER; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_MOVEMENT; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import android.annotation.CallSuper; +import android.app.RemoteAction; import android.content.res.Configuration; import android.graphics.Point; import android.graphics.Rect; @@ -71,9 +78,10 @@ import com.android.internal.policy.DockedDividerUtils; import com.android.server.EventLogTags; import java.io.PrintWriter; +import java.util.List; public class TaskStack extends WindowContainer<Task> implements - BoundsAnimationTarget { + BoundsAnimationTarget, ConfigurationContainerListener { /** Minimum size of an adjusted stack bounds relative to original stack bounds. Used to * restrict IME adjustment so that a min portion of top stack remains visible.*/ private static final float ADJUSTED_STACK_FRACTION_MIN = 0.3f; @@ -93,6 +101,10 @@ public class TaskStack extends WindowContainer<Task> implements private Rect mTmpRect2 = new Rect(); private Rect mTmpRect3 = new Rect(); + /** For Pinned stack controlling. */ + private Rect mTmpFromBounds = new Rect(); + private Rect mTmpToBounds = new Rect(); + /** Stack bounds adjusted to screen content area (taking into account IM windows, etc.) */ private final Rect mAdjustedBounds = new Rect(); @@ -141,6 +153,9 @@ public class TaskStack extends WindowContainer<Task> implements private Dimmer mDimmer = new Dimmer(this); + // TODO: remove after unification. + ActivityStack mActivityStack; + /** * For {@link #prepareSurfaces}. */ @@ -150,10 +165,11 @@ public class TaskStack extends WindowContainer<Task> implements private final AnimatingAppWindowTokenRegistry mAnimatingAppWindowTokenRegistry = new AnimatingAppWindowTokenRegistry(); - TaskStack(WindowManagerService service, int stackId, StackWindowController controller) { + TaskStack(WindowManagerService service, int stackId, ActivityStack activityStack) { super(service); mStackId = stackId; - setController(controller); + mActivityStack = activityStack; + activityStack.registerConfigurationChangeListener(this); mDockedStackMinimizeThickness = service.mContext.getResources().getDimensionPixelSize( com.android.internal.R.dimen.docked_stack_minimize_thickness); EventLog.writeEvent(EventLogTags.WM_STACK_CREATED, stackId); @@ -572,6 +588,49 @@ public class TaskStack extends WindowContainer<Task> implements positionChildAt(position, task, moveParents /* includingParents */, showForAllUsers); } + void positionChildAt(Task child, int position) { + if (DEBUG_STACK) { + Slog.i(TAG_WM, "positionChildAt: positioning task=" + child + " at " + position); + } + if (child == null) { + if (DEBUG_STACK) { + Slog.i(TAG_WM, "positionChildAt: could not find task=" + this); + } + return; + } + child.positionAt(position); + getDisplayContent().layoutAndAssignWindowLayersIfNeeded(); + } + + void positionChildAtTop(Task child, boolean includingParents) { + if (child == null) { + // TODO: Fix the call-points that cause this to happen. + return; + } + + positionChildAt(POSITION_TOP, child, includingParents); + + final DisplayContent displayContent = getDisplayContent(); + if (displayContent.mAppTransition.isTransitionSet()) { + child.setSendingToBottom(false); + } + displayContent.layoutAndAssignWindowLayersIfNeeded(); + } + + void positionChildAtBottom(Task child, boolean includingParents) { + if (child == null) { + // TODO: Fix the call-points that cause this to happen. + return; + } + + positionChildAt(POSITION_BOTTOM, child, includingParents); + + if (getDisplayContent().mAppTransition.isTransitionSet()) { + child.setSendingToBottom(true); + } + getDisplayContent().layoutAndAssignWindowLayersIfNeeded(); + } + @Override void positionChildAt(int position, Task child, boolean includingParents) { positionChildAt(position, child, includingParents, child.showForAllUsers()); @@ -596,6 +655,21 @@ public class TaskStack extends WindowContainer<Task> implements EventLog.writeEvent(EventLogTags.WM_TASK_MOVED, child.mTaskId, toTop, targetPosition); } + void reparent(int displayId, Rect outStackBounds, boolean onTop) { + final DisplayContent targetDc = mWmService.mRoot.getDisplayContent(displayId); + if (targetDc == null) { + throw new IllegalArgumentException("Trying to move stackId=" + mStackId + + " to unknown displayId=" + displayId); + } + + targetDc.moveStackToDisplay(this, onTop); + if (matchParentBounds()) { + outStackBounds.setEmpty(); + } else { + getRawBounds(outStackBounds); + } + } + // TODO: We should really have users as a window container in the hierarchy so that we don't // have to do complicated things like we are doing in this method. private int findPositionForTask(Task task, int targetPosition, boolean showForAllUsers, @@ -725,6 +799,23 @@ public class TaskStack extends WindowContainer<Task> implements } /** + * Re-sizes a stack and its containing tasks. + * + * @param bounds New stack bounds. Passing in null sets the bounds to fullscreen. + * @param taskBounds Bounds for tasks in the resized stack, keyed by task id. + * @param taskTempInsetBounds Inset bounds for individual tasks, keyed by task id. + */ + void resize(Rect bounds, SparseArray<Rect> taskBounds, + SparseArray<Rect> taskTempInsetBounds) { + // We might trigger a configuration change. Save the current task bounds for freezing. + prepareFreezingTaskBounds(); + if (setBounds(bounds, taskBounds, taskTempInsetBounds) && isVisible()) { + getDisplayContent().setLayoutNeeded(); + mWmService.mWindowPlacerLocked.performSurfacePlacement(); + } + } + + /** * Calculate an amount by which to expand the stack bounds in each direction. * Used to make room for shadows in the pinned windowing mode. */ @@ -929,12 +1020,7 @@ public class TaskStack extends WindowContainer<Task> implements (dockedStack == null || dockedStack == this) ? null : dockedStack.getRawBounds(); getStackDockedModeBoundsLocked(mDisplayContent.getConfiguration(), dockedBounds, null /* currentTempTaskBounds */, bounds, tempBounds); - getController().requestResize(bounds); - } - - @Override - StackWindowController getController() { - return (StackWindowController) super.getController(); + mActivityStack.requestResize(bounds); } @Override @@ -947,6 +1033,14 @@ public class TaskStack extends WindowContainer<Task> implements } @Override + void removeImmediately() { + if (mActivityStack != null) { + mActivityStack.unregisterConfigurationChangeListener(this); + } + super.removeImmediately(); + } + + @Override void onParentSet() { super.onParentSet(); @@ -1572,14 +1666,13 @@ public class TaskStack extends WindowContainer<Task> implements // I don't believe you... } - final PinnedStackWindowController controller = - (PinnedStackWindowController) getController(); - if (schedulePipModeChangedCallback && controller != null) { + if (schedulePipModeChangedCallback && mActivityStack != null) { // We need to schedule the PiP mode change before the animation up. It is possible // in this case for the animation down to not have been completed, so always // force-schedule and update to the client to ensure that it is notified that it // is no longer in picture-in-picture mode - controller.updatePictureInPictureModeForPinnedStackAnimation(null, forceUpdate); + mActivityStack.updatePictureInPictureModeForPinnedStackAnimation(null, + forceUpdate); } } return true; @@ -1592,12 +1685,10 @@ public class TaskStack extends WindowContainer<Task> implements // Update to the final bounds if requested. This is done here instead of in the bounds // animator to allow us to coordinate this after we notify the PiP mode changed - final PinnedStackWindowController controller = - (PinnedStackWindowController) getController(); - if (schedulePipModeChangedCallback && controller != null) { + if (schedulePipModeChangedCallback) { // We need to schedule the PiP mode change after the animation down, so use the // final bounds - controller.updatePictureInPictureModeForPinnedStackAnimation( + mActivityStack.updatePictureInPictureModeForPinnedStackAnimation( mBoundsAnimationTarget, false /* forceUpdate */); } @@ -1624,6 +1715,135 @@ public class TaskStack extends WindowContainer<Task> implements } } + /** + * @return the current stack bounds transformed to the given {@param aspectRatio}. If + * the default bounds is {@code null}, then the {@param aspectRatio} is applied to the + * default bounds. + */ + Rect getPictureInPictureBounds(float aspectRatio, Rect stackBounds) { + if (!mWmService.mSupportsPictureInPicture) { + return null; + } + + final DisplayContent displayContent = getDisplayContent(); + if (displayContent == null) { + return null; + } + + if (!inPinnedWindowingMode()) { + return null; + } + + final PinnedStackController pinnedStackController = + displayContent.getPinnedStackController(); + if (stackBounds == null) { + // Calculate the aspect ratio bounds from the default bounds + stackBounds = pinnedStackController.getDefaultOrLastSavedBounds(); + } + + if (pinnedStackController.isValidPictureInPictureAspectRatio(aspectRatio)) { + return pinnedStackController.transformBoundsToAspectRatio(stackBounds, aspectRatio, + true /* useCurrentMinEdgeSize */); + } else { + return stackBounds; + } + } + + /** + * Animates the pinned stack. + */ + void animateResizePinnedStack(Rect toBounds, Rect sourceHintBounds, + int animationDuration, boolean fromFullscreen) { + if (!inPinnedWindowingMode()) { + return; + } + // Get the from-bounds + final Rect fromBounds = new Rect(); + getBounds(fromBounds); + + // Get non-null fullscreen to-bounds for animating if the bounds are null + @SchedulePipModeChangedState int schedulePipModeChangedState = + NO_PIP_MODE_CHANGED_CALLBACKS; + final boolean toFullscreen = toBounds == null; + if (toFullscreen) { + if (fromFullscreen) { + throw new IllegalArgumentException("Should not defer scheduling PiP mode" + + " change on animation to fullscreen."); + } + schedulePipModeChangedState = SCHEDULE_PIP_MODE_CHANGED_ON_START; + + mWmService.getStackBounds( + WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, mTmpToBounds); + if (!mTmpToBounds.isEmpty()) { + // If there is a fullscreen bounds, use that + toBounds = new Rect(mTmpToBounds); + } else { + // Otherwise, use the display bounds + toBounds = new Rect(); + getDisplayContent().getBounds(toBounds); + } + } else if (fromFullscreen) { + schedulePipModeChangedState = SCHEDULE_PIP_MODE_CHANGED_ON_END; + } + + setAnimationFinalBounds(sourceHintBounds, toBounds, toFullscreen); + + final Rect finalToBounds = toBounds; + final @SchedulePipModeChangedState int finalSchedulePipModeChangedState = + schedulePipModeChangedState; + final DisplayContent displayContent = getDisplayContent(); + displayContent.mBoundsAnimationController.getHandler().post(() -> { + displayContent.mBoundsAnimationController.animateBounds(this, fromBounds, + finalToBounds, animationDuration, finalSchedulePipModeChangedState, + fromFullscreen, toFullscreen); + }); + } + + /** + * Sets the current picture-in-picture aspect ratio. + */ + void setPictureInPictureAspectRatio(float aspectRatio) { + if (!mWmService.mSupportsPictureInPicture) { + return; + } + + if (!inPinnedWindowingMode()) { + return; + } + + final PinnedStackController pinnedStackController = + getDisplayContent().getPinnedStackController(); + + if (Float.compare(aspectRatio, pinnedStackController.getAspectRatio()) == 0) { + return; + } + getAnimationOrCurrentBounds(mTmpFromBounds); + mTmpToBounds.set(mTmpFromBounds); + getPictureInPictureBounds(aspectRatio, mTmpToBounds); + if (!mTmpToBounds.equals(mTmpFromBounds)) { + animateResizePinnedStack(mTmpToBounds, null /* sourceHintBounds */, + -1 /* duration */, false /* fromFullscreen */); + } + pinnedStackController.setAspectRatio( + pinnedStackController.isValidPictureInPictureAspectRatio(aspectRatio) + ? aspectRatio : -1f); + } + + /** + * Sets the current picture-in-picture actions. + */ + void setPictureInPictureActions(List<RemoteAction> actions) { + if (!mWmService.mSupportsPictureInPicture) { + return; + } + + if (!inPinnedWindowingMode()) { + return; + } + + getDisplayContent().getPinnedStackController().setActions(actions); + } + @Override public boolean isAttached() { synchronized (mWmService.mGlobalLock) { diff --git a/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java b/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java index b2194190f4f4..905787051de8 100644 --- a/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java +++ b/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java @@ -67,7 +67,7 @@ public class TaskTapPointerEventListener implements PointerEventListener { return; } WindowContainer parent = mDisplayContent.getParent(); - if (parent != null) { + if (parent != null && parent.getTopChild() != mDisplayContent) { parent.positionChildAt(WindowContainer.POSITION_TOP, mDisplayContent, true /* includingParents */); } diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 25e61f876722..19058776d187 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -437,6 +437,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< if (mChildren.peekLast() != child) { mChildren.remove(child); mChildren.add(child); + onChildPositionChanged(); } if (includingParents && getParent() != null) { getParent().positionChildAt(POSITION_TOP, this /* child */, @@ -447,6 +448,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< if (mChildren.peekFirst() != child) { mChildren.remove(child); mChildren.addFirst(child); + onChildPositionChanged(); } if (includingParents && getParent() != null) { getParent().positionChildAt(POSITION_BOTTOM, this /* child */, @@ -460,8 +462,8 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< // doing this adjustment here and remove any adjustments in the callers. mChildren.remove(child); mChildren.add(position, child); + onChildPositionChanged(); } - onChildPositionChanged(); } /** diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 90506e744250..fda7a85c1270 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -723,7 +723,7 @@ public class WindowManagerService extends IWindowManager.Stub void updateSystemUiSettings() { boolean changed; - synchronized (mWindowMap) { + synchronized (mGlobalLock) { changed = ImmersiveModeConfirmation.loadSetting(mCurrentUserId, mContext) || PolicyControl.reloadFromSetting(mContext); } @@ -2629,12 +2629,23 @@ public class WindowManagerService extends IWindowManager.Stub @Override public void onUserSwitched() { mSettingsObserver.updateSystemUiSettings(); - synchronized (mWindowMap) { + synchronized (mGlobalLock) { // force a re-application of focused window sysui visibility on each display. mRoot.forAllDisplayPolicies(DisplayPolicy::resetSystemUiVisibilityLw); } } + @Override + public void moveDisplayToTop(int displayId) { + synchronized (mGlobalLock) { + final DisplayContent displayContent = mRoot.getDisplayContent(displayId); + if (displayContent != null && mRoot.getTopChild() != displayContent) { + mRoot.positionChildAt(WindowContainer.POSITION_TOP, displayContent, + true /* includingParents */); + } + } + } + /** * Starts deferring layout passes. Useful when doing multiple changes but to optimize * performance, only one layout pass should be done. This can be called multiple times, and @@ -5932,8 +5943,6 @@ public class WindowManagerService extends IWindowManager.Stub pw.print(" apps="); pw.print(mAppsFreezingScreen); final DisplayContent defaultDisplayContent = getDefaultDisplayContentLocked(); pw.print(" mRotation="); pw.print(defaultDisplayContent.getRotation()); - pw.print(" mAltOrientation="); - pw.println(defaultDisplayContent.getAltOrientation()); pw.print(" mLastWindowForcedOrientation="); pw.print(defaultDisplayContent.getLastWindowForcedOrientation()); pw.print(" mLastOrientation="); @@ -6379,7 +6388,7 @@ public class WindowManagerService extends IWindowManager.Stub } void setForceDesktopModeOnExternalDisplays(boolean forceDesktopModeOnExternalDisplays) { - synchronized (mWindowMap) { + synchronized (mGlobalLock) { mForceDesktopModeOnExternalDisplays = forceDesktopModeOnExternalDisplays; } } diff --git a/services/net/java/android/net/shared/LinkPropertiesParcelableUtil.java b/services/net/java/android/net/shared/LinkPropertiesParcelableUtil.java new file mode 100644 index 000000000000..5b77f543c62b --- /dev/null +++ b/services/net/java/android/net/shared/LinkPropertiesParcelableUtil.java @@ -0,0 +1,222 @@ +/* + * Copyright (C) 2019 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.net.shared; + +import static android.net.shared.ParcelableUtil.fromParcelableArray; +import static android.net.shared.ParcelableUtil.toParcelableArray; + +import android.annotation.Nullable; +import android.net.InetAddresses; +import android.net.IpPrefix; +import android.net.IpPrefixParcelable; +import android.net.LinkAddress; +import android.net.LinkAddressParcelable; +import android.net.LinkProperties; +import android.net.LinkPropertiesParcelable; +import android.net.ProxyInfo; +import android.net.ProxyInfoParcelable; +import android.net.RouteInfo; +import android.net.RouteInfoParcelable; +import android.net.Uri; + +import java.net.InetAddress; +import java.util.Arrays; + +/** + * Collection of utility methods to convert to and from stable AIDL parcelables for LinkProperties + * and its attributes. + * @hide + */ +public final class LinkPropertiesParcelableUtil { + + /** + * Convert a ProxyInfo to a ProxyInfoParcelable + */ + public static ProxyInfoParcelable toStableParcelable(@Nullable ProxyInfo proxyInfo) { + if (proxyInfo == null) { + return null; + } + final ProxyInfoParcelable parcel = new ProxyInfoParcelable(); + parcel.host = proxyInfo.getHost(); + parcel.port = proxyInfo.getPort(); + parcel.exclusionList = proxyInfo.getExclusionList(); + parcel.pacFileUrl = proxyInfo.getPacFileUrl().toString(); + return parcel; + } + + /** + * Convert a ProxyInfoParcelable to a ProxyInfo + */ + public static ProxyInfo fromStableParcelable(@Nullable ProxyInfoParcelable parcel) { + if (parcel == null) { + return null; + } + if (Uri.EMPTY.toString().equals(parcel.pacFileUrl)) { + return ProxyInfo.buildDirectProxy( + parcel.host, parcel.port, Arrays.asList(parcel.exclusionList)); + } else { + return ProxyInfo.buildPacProxy(Uri.parse(parcel.pacFileUrl)); + } + } + + /** + * Convert an IpPrefixParcelable to an IpPrefix + */ + public static IpPrefixParcelable toStableParcelable(@Nullable IpPrefix ipPrefix) { + if (ipPrefix == null) { + return null; + } + final IpPrefixParcelable parcel = new IpPrefixParcelable(); + parcel.address = ipPrefix.getAddress().getHostAddress(); + parcel.prefixLength = ipPrefix.getPrefixLength(); + return parcel; + } + + /** + * Convert an IpPrefix to an IpPrefixParcelable + */ + public static IpPrefix fromStableParcelable(@Nullable IpPrefixParcelable parcel) { + if (parcel == null) { + return null; + } + return new IpPrefix(InetAddresses.parseNumericAddress(parcel.address), parcel.prefixLength); + } + + /** + * Convert a RouteInfoParcelable to a RouteInfo + */ + public static RouteInfoParcelable toStableParcelable(@Nullable RouteInfo routeInfo) { + if (routeInfo == null) { + return null; + } + final RouteInfoParcelable parcel = new RouteInfoParcelable(); + parcel.destination = toStableParcelable(routeInfo.getDestination()); + parcel.gatewayAddr = routeInfo.getGateway().getHostAddress(); + parcel.ifaceName = routeInfo.getInterface(); + parcel.type = routeInfo.getType(); + return parcel; + } + + /** + * Convert a RouteInfo to a RouteInfoParcelable + */ + public static RouteInfo fromStableParcelable(@Nullable RouteInfoParcelable parcel) { + if (parcel == null) { + return null; + } + final IpPrefix destination = fromStableParcelable(parcel.destination); + return new RouteInfo( + destination, InetAddresses.parseNumericAddress(parcel.gatewayAddr), + parcel.ifaceName, parcel.type); + } + + /** + * Convert a LinkAddressParcelable to a LinkAddress + */ + public static LinkAddressParcelable toStableParcelable(@Nullable LinkAddress la) { + if (la == null) { + return null; + } + final LinkAddressParcelable parcel = new LinkAddressParcelable(); + parcel.address = la.getAddress().getHostAddress(); + parcel.prefixLength = la.getPrefixLength(); + parcel.flags = la.getFlags(); + parcel.scope = la.getScope(); + return parcel; + } + + /** + * Convert a LinkAddress to a LinkAddressParcelable + */ + public static LinkAddress fromStableParcelable(@Nullable LinkAddressParcelable parcel) { + if (parcel == null) { + return null; + } + return new LinkAddress( + InetAddresses.parseNumericAddress(parcel.address), + parcel.prefixLength, + parcel.flags, + parcel.scope); + } + + /** + * Convert a LinkProperties to a LinkPropertiesParcelable + */ + public static LinkPropertiesParcelable toStableParcelable(@Nullable LinkProperties lp) { + if (lp == null) { + return null; + } + final LinkPropertiesParcelable parcel = new LinkPropertiesParcelable(); + parcel.ifaceName = lp.getInterfaceName(); + parcel.linkAddresses = toParcelableArray( + lp.getLinkAddresses(), + LinkPropertiesParcelableUtil::toStableParcelable, + LinkAddressParcelable.class); + parcel.dnses = toParcelableArray( + lp.getDnsServers(), InetAddress::getHostAddress, String.class); + parcel.pcscfs = toParcelableArray( + lp.getPcscfServers(), InetAddress::getHostAddress, String.class); + parcel.validatedPrivateDnses = toParcelableArray( + lp.getValidatedPrivateDnsServers(), InetAddress::getHostAddress, String.class); + parcel.usePrivateDns = lp.isPrivateDnsActive(); + parcel.privateDnsServerName = lp.getPrivateDnsServerName(); + parcel.domains = lp.getDomains(); + parcel.routes = toParcelableArray( + lp.getRoutes(), LinkPropertiesParcelableUtil::toStableParcelable, + RouteInfoParcelable.class); + parcel.httpProxy = toStableParcelable(lp.getHttpProxy()); + parcel.mtu = lp.getMtu(); + parcel.tcpBufferSizes = lp.getTcpBufferSizes(); + parcel.nat64Prefix = toStableParcelable(lp.getNat64Prefix()); + parcel.stackedLinks = toParcelableArray( + lp.getStackedLinks(), LinkPropertiesParcelableUtil::toStableParcelable, + LinkPropertiesParcelable.class); + return parcel; + } + + /** + * Convert a LinkPropertiesParcelable to a LinkProperties + */ + public static LinkProperties fromStableParcelable(@Nullable LinkPropertiesParcelable parcel) { + if (parcel == null) { + return null; + } + final LinkProperties lp = new LinkProperties(); + lp.setInterfaceName(parcel.ifaceName); + lp.setLinkAddresses(fromParcelableArray(parcel.linkAddresses, + LinkPropertiesParcelableUtil::fromStableParcelable)); + lp.setDnsServers(fromParcelableArray(parcel.dnses, InetAddresses::parseNumericAddress)); + lp.setPcscfServers(fromParcelableArray(parcel.pcscfs, InetAddresses::parseNumericAddress)); + lp.setValidatedPrivateDnsServers( + fromParcelableArray(parcel.validatedPrivateDnses, + InetAddresses::parseNumericAddress)); + lp.setUsePrivateDns(parcel.usePrivateDns); + lp.setPrivateDnsServerName(parcel.privateDnsServerName); + lp.setDomains(parcel.domains); + for (RouteInfoParcelable route : parcel.routes) { + lp.addRoute(fromStableParcelable(route)); + } + lp.setHttpProxy(fromStableParcelable(parcel.httpProxy)); + lp.setMtu(parcel.mtu); + lp.setTcpBufferSizes(parcel.tcpBufferSizes); + lp.setNat64Prefix(fromStableParcelable(parcel.nat64Prefix)); + for (LinkPropertiesParcelable stackedLink : parcel.stackedLinks) { + lp.addStackedLink(fromStableParcelable(stackedLink)); + } + return lp; + } +} diff --git a/services/net/java/android/net/shared/ParcelableUtil.java b/services/net/java/android/net/shared/ParcelableUtil.java new file mode 100644 index 000000000000..a18976c9eee6 --- /dev/null +++ b/services/net/java/android/net/shared/ParcelableUtil.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2019 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.net.shared; + +import android.annotation.NonNull; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; + +/** + * Utility methods to help convert to/from stable parcelables. + * @hide + */ +public final class ParcelableUtil { + // Below methods could be implemented easily with streams, but streams are frowned upon in + // frameworks code. + + /** + * Convert a list of BaseType items to an array of ParcelableType items using the specified + * converter function. + */ + public static <ParcelableType, BaseType> ParcelableType[] toParcelableArray( + @NonNull List<BaseType> base, + @NonNull Function<BaseType, ParcelableType> conv, + @NonNull Class<ParcelableType> parcelClass) { + final ParcelableType[] out = (ParcelableType[]) Array.newInstance(parcelClass, base.size()); + int i = 0; + for (BaseType b : base) { + out[i] = conv.apply(b); + i++; + } + return out; + } + + /** + * Convert an array of ParcelableType items to a list of BaseType items using the specified + * converter function. + */ + public static <ParcelableType, BaseType> ArrayList<BaseType> fromParcelableArray( + @NonNull ParcelableType[] parceled, @NonNull Function<ParcelableType, BaseType> conv) { + final ArrayList<BaseType> out = new ArrayList<>(parceled.length); + for (ParcelableType t : parceled) { + out.add(conv.apply(t)); + } + return out; + } +} diff --git a/services/tests/servicestests/src/com/android/server/hdmi/ArcInitiationActionFromAvrTest.java b/services/tests/servicestests/src/com/android/server/hdmi/ArcInitiationActionFromAvrTest.java index 8b0e8abf069d..eb9b98ec65f7 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/ArcInitiationActionFromAvrTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/ArcInitiationActionFromAvrTest.java @@ -30,6 +30,7 @@ import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -147,6 +148,7 @@ public class ArcInitiationActionFromAvrTest { mTestLooper.dispatchAll(); } + @Ignore("b/120845532") @Test public void arcInitiation_requestActiveSource() { mSendCecCommandSuccess = true; diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java index 93a09dc3ff04..5d8131f35eb7 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java @@ -40,7 +40,6 @@ import androidx.test.filters.SmallTest; import com.android.server.hdmi.HdmiCecController.AllocateAddressCallback; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -142,7 +141,6 @@ public class HdmiCecControllerTest { assertEquals(ADDR_UNREGISTERED, mLogicalAddress); } - @Ignore("b/110413065 Support multiple device types 4 and 5.") @Test public void testAllocatLogicalAddress_PlaybackPreferredNotOccupied() { mHdmiCecController.allocateLogicalAddress(DEVICE_PLAYBACK, ADDR_PLAYBACK_1, mCallback); @@ -158,7 +156,6 @@ public class HdmiCecControllerTest { assertEquals(ADDR_PLAYBACK_2, mLogicalAddress); } - @Ignore("b/110413065 Support multiple device types 4 and 5.") @Test public void testAllocatLogicalAddress_PlaybackNoPreferredNotOcuppied() { mHdmiCecController.allocateLogicalAddress(DEVICE_PLAYBACK, ADDR_UNREGISTERED, mCallback); diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java index 3b51a2a70f83..3a6cdc2ad7c9 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java @@ -21,6 +21,7 @@ import static android.hardware.hdmi.HdmiControlManager.DEVICE_EVENT_UPDATE_DEVIC import static com.android.server.hdmi.Constants.ADDR_AUDIO_SYSTEM; import static com.android.server.hdmi.Constants.ADDR_BROADCAST; import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_1; +import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_2; import static com.android.server.hdmi.Constants.ADDR_TUNER_1; import static com.android.server.hdmi.Constants.ADDR_TV; import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC; @@ -29,9 +30,9 @@ import static com.android.server.hdmi.HdmiControlService.STANDBY_SCREEN_OFF; import static com.google.common.truth.Truth.assertThat; import android.hardware.hdmi.HdmiDeviceInfo; +import android.hardware.hdmi.HdmiPortInfo; import android.media.AudioManager; import android.os.Looper; -import android.os.SystemProperties; import android.os.test.TestLooper; import androidx.test.InstrumentationRegistry; @@ -46,7 +47,6 @@ import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import java.util.ArrayList; - @SmallTest @RunWith(JUnit4.class) /** Tests for {@link HdmiCecLocalDeviceAudioSystem} class. */ @@ -67,9 +67,15 @@ public class HdmiCecLocalDeviceAudioSystemTest { private int mMusicVolume; private int mMusicMaxVolume; private boolean mMusicMute; - private int mAvrPhysicalAddress; + private static final int SELF_PHYSICAL_ADDRESS = 0x2000; + private static final int HDMI_1_PHYSICAL_ADDRESS = 0x2100; + private static final int HDMI_2_PHYSICAL_ADDRESS = 0x2200; + private static final int HDMI_3_PHYSICAL_ADDRESS = 0x2300; private int mInvokeDeviceEventState; private HdmiDeviceInfo mDeviceInfo; + private boolean mMutingEnabled; + private boolean mArcSupport; + private HdmiPortInfo[] mHdmiPortInfo; @Before public void setUp() { @@ -141,9 +147,20 @@ public class HdmiCecLocalDeviceAudioSystemTest { } @Override - int pathToPortId(int path) { - // port id is not useful for the test right now - return 1; + void writeStringSetting(String key, String value) { + // do nothing + } + + @Override + boolean readBooleanSetting(String key, boolean defVal) { + switch (key) { + case Constants.PROPERTY_SYSTEM_AUDIO_MODE_MUTING_ENABLE: + return mMutingEnabled; + case Constants.PROPERTY_ARC_SUPPORT: + return mArcSupport; + default: + return defVal; + } } }; @@ -154,11 +171,17 @@ public class HdmiCecLocalDeviceAudioSystemTest { void setIsActiveSource(boolean on) { mIsActiveSource = on; } + + @Override + protected int getPreferredAddress() { + return ADDR_PLAYBACK_1; + } }; mHdmiCecLocalDeviceAudioSystem.init(); mHdmiCecLocalDevicePlayback.init(); mHdmiControlService.setIoLooper(mMyLooper); mNativeWrapper = new FakeNativeWrapper(); + mNativeWrapper.setPhysicalAddress(SELF_PHYSICAL_ADDRESS); mHdmiCecController = HdmiCecController.createWithNativeWrapper(mHdmiControlService, mNativeWrapper); mHdmiControlService.setCecController(mHdmiCecController); @@ -166,15 +189,28 @@ public class HdmiCecLocalDeviceAudioSystemTest { mHdmiControlService.setMessageValidator(new HdmiCecMessageValidator(mHdmiControlService)); mLocalDevices.add(mHdmiCecLocalDeviceAudioSystem); mLocalDevices.add(mHdmiCecLocalDevicePlayback); + mHdmiCecLocalDeviceAudioSystem.setRoutingControlFeatureEnables(true); + mHdmiPortInfo = new HdmiPortInfo[4]; + mHdmiPortInfo[0] = + new HdmiPortInfo( + 0, HdmiPortInfo.PORT_INPUT, SELF_PHYSICAL_ADDRESS, true, false, false); + mHdmiPortInfo[1] = + new HdmiPortInfo( + 2, HdmiPortInfo.PORT_INPUT, HDMI_1_PHYSICAL_ADDRESS, true, false, false); + mHdmiPortInfo[2] = + new HdmiPortInfo( + 1, HdmiPortInfo.PORT_INPUT, HDMI_2_PHYSICAL_ADDRESS, true, false, false); + mHdmiPortInfo[3] = + new HdmiPortInfo( + 4, HdmiPortInfo.PORT_INPUT, HDMI_3_PHYSICAL_ADDRESS, true, false, false); + mNativeWrapper.setPortInfo(mHdmiPortInfo); mHdmiControlService.initPortInfo(); // No TV device interacts with AVR so system audio control won't be turned on here mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mTestLooper.dispatchAll(); mNativeWrapper.clearResultMessages(); - mAvrPhysicalAddress = 0x2000; - mNativeWrapper.setPhysicalAddress(mAvrPhysicalAddress); - SystemProperties.set(Constants.PROPERTY_ARC_SUPPORT, "true"); - SystemProperties.set(Constants.PROPERTY_SYSTEM_AUDIO_MODE_MUTING_ENABLE, "true"); + mMutingEnabled = true; + mArcSupport = true; mInvokeDeviceEventState = 0; mDeviceInfo = null; } @@ -244,6 +280,8 @@ public class HdmiCecLocalDeviceAudioSystemTest { assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage); } + // Testing device has sadConfig.xml + @Ignore("b/120845532") @Test public void handleRequestShortAudioDescriptor_noAudioDeviceInfo() throws Exception { HdmiCecMessage expectedMessage = @@ -414,51 +452,6 @@ public class HdmiCecLocalDeviceAudioSystemTest { } @Test - public void pathToPort_isMe() throws Exception { - int targetPhysicalAddress = 0x1000; - mNativeWrapper.setPhysicalAddress(0x1000); - assertThat(mHdmiCecLocalDeviceAudioSystem - .getLocalPortFromPhysicalAddress(targetPhysicalAddress)) - .isEqualTo(0); - } - - @Test - public void pathToPort_isBelow() throws Exception { - int targetPhysicalAddress = 0x1100; - mNativeWrapper.setPhysicalAddress(0x1000); - assertThat(mHdmiCecLocalDeviceAudioSystem - .getLocalPortFromPhysicalAddress(targetPhysicalAddress)) - .isEqualTo(1); - } - - @Test - public void pathToPort_neitherMeNorBelow() throws Exception { - int targetPhysicalAddress = 0x3000; - mNativeWrapper.setPhysicalAddress(0x2000); - assertThat(mHdmiCecLocalDeviceAudioSystem - .getLocalPortFromPhysicalAddress(targetPhysicalAddress)) - .isEqualTo(-1); - - targetPhysicalAddress = 0x2200; - mNativeWrapper.setPhysicalAddress(0x3300); - assertThat(mHdmiCecLocalDeviceAudioSystem - .getLocalPortFromPhysicalAddress(targetPhysicalAddress)) - .isEqualTo(-1); - - targetPhysicalAddress = 0x2213; - mNativeWrapper.setPhysicalAddress(0x2212); - assertThat(mHdmiCecLocalDeviceAudioSystem - .getLocalPortFromPhysicalAddress(targetPhysicalAddress)) - .isEqualTo(-1); - - targetPhysicalAddress = 0x2340; - mNativeWrapper.setPhysicalAddress(0x2310); - assertThat(mHdmiCecLocalDeviceAudioSystem - .getLocalPortFromPhysicalAddress(targetPhysicalAddress)) - .isEqualTo(-1); - } - - @Test public void handleRequestArcInitiate_isNotDirectConnectedToTv() throws Exception { HdmiCecMessage message = HdmiCecMessageBuilder.buildRequestArcInitiation(ADDR_TV, ADDR_AUDIO_SYSTEM); @@ -530,7 +523,7 @@ public class HdmiCecLocalDeviceAudioSystemTest { ADDR_TV, Constants.MESSAGE_REQUEST_ARC_INITIATION, Constants.ABORT_UNRECOGNIZED_OPCODE); - SystemProperties.set(Constants.PROPERTY_ARC_SUPPORT, "false"); + mArcSupport = false; assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message)).isTrue(); mTestLooper.dispatchAll(); @@ -541,7 +534,7 @@ public class HdmiCecLocalDeviceAudioSystemTest { HdmiCecMessage message = HdmiCecMessageBuilder.buildSystemAudioModeRequest( ADDR_TUNER_1, ADDR_AUDIO_SYSTEM, - mAvrPhysicalAddress, true); + SELF_PHYSICAL_ADDRESS, true); HdmiCecMessage expectedMessage = HdmiCecMessageBuilder.buildFeatureAbortCommand( ADDR_AUDIO_SYSTEM, @@ -559,7 +552,7 @@ public class HdmiCecLocalDeviceAudioSystemTest { HdmiCecMessage message = HdmiCecMessageBuilder.buildSystemAudioModeRequest( ADDR_TUNER_1, ADDR_AUDIO_SYSTEM, - mAvrPhysicalAddress, true); + SELF_PHYSICAL_ADDRESS, true); HdmiCecMessage expectedMessage = HdmiCecMessageBuilder.buildSetSystemAudioMode( ADDR_AUDIO_SYSTEM, Constants.ADDR_BROADCAST, true); @@ -585,15 +578,14 @@ public class HdmiCecLocalDeviceAudioSystemTest { .isEqualTo(expectedActiveSource); } - @Ignore("b/110413065 Support multiple device types 4 and 5.") @Test public void handleRoutingChange_currentActivePortIsHome() { HdmiCecMessage message = - HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x3000, mAvrPhysicalAddress); + HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x3000, SELF_PHYSICAL_ADDRESS); HdmiCecMessage expectedMessage = - HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, mAvrPhysicalAddress); - ActiveSource expectedActiveSource = ActiveSource.of(ADDR_PLAYBACK_1, mAvrPhysicalAddress); + HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, SELF_PHYSICAL_ADDRESS); + ActiveSource expectedActiveSource = ActiveSource.of(ADDR_PLAYBACK_1, SELF_PHYSICAL_ADDRESS); int expectedLocalActivePort = Constants.CEC_SWITCH_HOME; assertThat(mHdmiCecLocalDeviceAudioSystem.handleRoutingChange(message)).isTrue(); @@ -608,17 +600,18 @@ public class HdmiCecLocalDeviceAudioSystemTest { @Test public void handleRoutingInformation_currentActivePortIsHDMI1() { HdmiCecMessage message = - HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x2000); - mHdmiCecLocalDeviceAudioSystem.setRoutingPort(Constants.CEC_SWITCH_HDMI1); + HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, SELF_PHYSICAL_ADDRESS); + mHdmiCecLocalDeviceAudioSystem.setRoutingPort(mHdmiPortInfo[1].getId()); HdmiCecMessage expectedMessage = - HdmiCecMessageBuilder.buildRoutingInformation(ADDR_AUDIO_SYSTEM, 0x2100); + HdmiCecMessageBuilder.buildRoutingInformation( + ADDR_AUDIO_SYSTEM, HDMI_1_PHYSICAL_ADDRESS); assertThat(mHdmiCecLocalDeviceAudioSystem.handleRoutingInformation(message)).isTrue(); mTestLooper.dispatchAll(); assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage); } - @Ignore("b/110413065 Support multiple device types 4 and 5.") + @Ignore("b/120845532") @Test public void handleRoutingChange_homeIsActive_playbackSendActiveSource() { HdmiCecMessage message = @@ -667,7 +660,7 @@ public class HdmiCecLocalDeviceAudioSystemTest { mHdmiCecLocalDeviceAudioSystem.addDeviceInfo(oldDevice); HdmiDeviceInfo differentDevice = new HdmiDeviceInfo( - ADDR_PLAYBACK_1, 0x2100, 4, HdmiDeviceInfo.DEVICE_PLAYBACK, + ADDR_PLAYBACK_1, 0x2300, 4, HdmiDeviceInfo.DEVICE_PLAYBACK, Constants.UNKNOWN_VENDOR_ID, HdmiUtils.getDefaultDeviceName(ADDR_PLAYBACK_1)); mHdmiCecLocalDeviceAudioSystem.updateCecDevice(differentDevice); @@ -686,14 +679,13 @@ public class HdmiCecLocalDeviceAudioSystemTest { mHdmiCecLocalDeviceAudioSystem.addDeviceInfo(oldDevice); HdmiDeviceInfo differentDevice = new HdmiDeviceInfo( - ADDR_PLAYBACK_1, 0x2200, 1, HdmiDeviceInfo.DEVICE_PLAYBACK, - Constants.UNKNOWN_VENDOR_ID, HdmiUtils.getDefaultDeviceName(ADDR_PLAYBACK_1)); + ADDR_PLAYBACK_2, 0x2200, 1, HdmiDeviceInfo.DEVICE_PLAYBACK, + Constants.UNKNOWN_VENDOR_ID, HdmiUtils.getDefaultDeviceName(ADDR_PLAYBACK_2)); HdmiCecMessage reportPhysicalAddress = HdmiCecMessageBuilder .buildReportPhysicalAddressCommand( - ADDR_PLAYBACK_1, 0x2200, HdmiDeviceInfo.DEVICE_PLAYBACK); + ADDR_PLAYBACK_2, 0x2200, HdmiDeviceInfo.DEVICE_PLAYBACK); mHdmiCecLocalDeviceAudioSystem.handleReportPhysicalAddress(reportPhysicalAddress); - mHdmiCecLocalDeviceAudioSystem.addDeviceInfo(oldDevice); mTestLooper.dispatchAll(); assertThat(mDeviceInfo).isEqualTo(differentDevice); assertThat(mHdmiCecLocalDeviceAudioSystem diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java index 792c617b99ea..feae4eed7eb1 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java @@ -81,7 +81,8 @@ public class HdmiCecLocalDevicePlaybackTest { mNativeWrapper.setPhysicalAddress(mPlaybackPhysicalAddress); } - @Ignore + // Playback device does not handle routing control related feature right now + @Ignore("b/120845532") @Test public void handleSetStreamPath_underCurrentDevice() { assertThat(mHdmiCecLocalDevicePlayback.getLocalActivePath()).isEqualTo(0); diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java index 67ce13fdef72..1f660742122d 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java @@ -179,6 +179,7 @@ public class HdmiControlServiceTest { @Test public void pathToPort_pathExists_weAreNonTv() { mNativeWrapper.setPhysicalAddress(0x2000); + mHdmiControlService.initPortInfo(); assertThat(mHdmiControlService.pathToPortId(0x2120)).isEqualTo(1); assertThat(mHdmiControlService.pathToPortId(0x2234)).isEqualTo(2); } @@ -186,6 +187,7 @@ public class HdmiControlServiceTest { @Test public void pathToPort_pathExists_weAreTv() { mNativeWrapper.setPhysicalAddress(0x0000); + mHdmiControlService.initPortInfo(); assertThat(mHdmiControlService.pathToPortId(0x2120)).isEqualTo(3); assertThat(mHdmiControlService.pathToPortId(0x3234)).isEqualTo(4); } @@ -193,6 +195,7 @@ public class HdmiControlServiceTest { @Test public void pathToPort_pathInvalid() { mNativeWrapper.setPhysicalAddress(0x2000); + mHdmiControlService.initPortInfo(); assertThat(mHdmiControlService.pathToPortId(0x1000)).isEqualTo(Constants.INVALID_PORT_ID); } } diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiUtilsTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiUtilsTest.java new file mode 100644 index 000000000000..985c6476d767 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiUtilsTest.java @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2018 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.google.common.truth.Truth.assertThat; + +import android.util.Slog; + +import androidx.test.filters.SmallTest; + +import com.android.server.hdmi.HdmiUtils.CodecSad; +import com.android.server.hdmi.HdmiUtils.DeviceConfig; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; + +@SmallTest +@RunWith(JUnit4.class) +/** Tests for {@link HdmiUtils} class. */ +public class HdmiUtilsTest { + + private static final String TAG = "HdmiUtilsTest"; + + private final String mExampleXML = + "<!-- A sample Short Audio Descriptor configuration xml -->" + + "<config version=\"1.0\" xmlns:xi=\"http://www.w3.org/2001/XInclude\">" + + "<device type=\"VX_AUDIO_DEVICE_IN_HDMI_ARC\">" + + "<supportedFormat format=\"AUDIO_FORMAT_LPCM\" descriptor=\"011a03\"/>" + + "<supportedFormat format=\"AUDIO_FORMAT_DD\" descriptor=\"0d0506\"/>" + + "</device>" + + "<device type=\"AUDIO_DEVICE_IN_SPDIF\">" + + "<supportedFormat format=\"AUDIO_FORMAT_LPCM\" descriptor=\"010203\"/>" + + "<supportedFormat format=\"AUDIO_FORMAT_DD\" descriptor=\"040506\"/>" + + "</device>" + + "</config>"; + + @Test + public void pathToPort_isMe() { + int targetPhysicalAddress = 0x1000; + int myPhysicalAddress = 0x1000; + assertThat(HdmiUtils.getLocalPortFromPhysicalAddress( + targetPhysicalAddress, myPhysicalAddress)).isEqualTo( + HdmiUtils.TARGET_SAME_PHYSICAL_ADDRESS); + } + + @Test + public void pathToPort_isDirectlyBelow() { + int targetPhysicalAddress = 0x1100; + int myPhysicalAddress = 0x1000; + assertThat(HdmiUtils.getLocalPortFromPhysicalAddress( + targetPhysicalAddress, myPhysicalAddress)).isEqualTo(1); + } + + @Test + public void pathToPort_isBelow() { + int targetPhysicalAddress = 0x1110; + int myPhysicalAddress = 0x1000; + assertThat(HdmiUtils.getLocalPortFromPhysicalAddress( + targetPhysicalAddress, myPhysicalAddress)).isEqualTo(1); + } + + @Test + public void pathToPort_neitherMeNorBelow() { + int targetPhysicalAddress = 0x3000; + int myPhysicalAddress = 0x2000; + assertThat(HdmiUtils.getLocalPortFromPhysicalAddress( + targetPhysicalAddress, myPhysicalAddress)).isEqualTo( + HdmiUtils.TARGET_NOT_UNDER_LOCAL_DEVICE); + + targetPhysicalAddress = 0x2200; + myPhysicalAddress = 0x3300; + assertThat(HdmiUtils.getLocalPortFromPhysicalAddress( + targetPhysicalAddress, myPhysicalAddress)).isEqualTo( + HdmiUtils.TARGET_NOT_UNDER_LOCAL_DEVICE); + + targetPhysicalAddress = 0x2213; + myPhysicalAddress = 0x2212; + assertThat(HdmiUtils.getLocalPortFromPhysicalAddress( + targetPhysicalAddress, myPhysicalAddress)).isEqualTo( + HdmiUtils.TARGET_NOT_UNDER_LOCAL_DEVICE); + + targetPhysicalAddress = 0x2340; + myPhysicalAddress = 0x2310; + assertThat(HdmiUtils.getLocalPortFromPhysicalAddress( + targetPhysicalAddress, myPhysicalAddress)).isEqualTo( + HdmiUtils.TARGET_NOT_UNDER_LOCAL_DEVICE); + } + + @Test + public void parseSampleXML() { + List<DeviceConfig> config = new ArrayList<>(); + try { + config = HdmiUtils.ShortAudioDescriptorXmlParser.parse( + new ByteArrayInputStream(mExampleXML.getBytes(StandardCharsets.UTF_8))); + } catch (IOException e) { + Slog.e(TAG, e.getMessage(), e); + } catch (XmlPullParserException e) { + Slog.e(TAG, e.getMessage(), e); + } + + CodecSad expectedCodec1 = new CodecSad(Constants.AUDIO_CODEC_LPCM, "011a03"); + CodecSad expectedCodec2 = new CodecSad(Constants.AUDIO_CODEC_DD, "0d0506"); + CodecSad expectedCodec3 = new CodecSad(Constants.AUDIO_CODEC_LPCM, "010203"); + CodecSad expectedCodec4 = new CodecSad(Constants.AUDIO_CODEC_DD, "040506"); + + List<CodecSad> expectedList1 = new ArrayList<>(); + expectedList1.add(expectedCodec1); + expectedList1.add(expectedCodec2); + + List<CodecSad> expectedList2 = new ArrayList<>(); + expectedList2.add(expectedCodec3); + expectedList2.add(expectedCodec4); + + DeviceConfig expectedDevice1 = new DeviceConfig( + "VX_AUDIO_DEVICE_IN_HDMI_ARC", expectedList1); + DeviceConfig expectedDevice2 = new DeviceConfig( + "AUDIO_DEVICE_IN_SPDIF", expectedList2); + + List<DeviceConfig> expectedConfig = new ArrayList<>(); + expectedConfig.add(expectedDevice1); + expectedConfig.add(expectedDevice2); + + assertThat(config).isEqualTo(expectedConfig); + } +} diff --git a/services/tests/servicestests/src/com/android/server/hdmi/SystemAudioInitiationActionFromAvrTest.java b/services/tests/servicestests/src/com/android/server/hdmi/SystemAudioInitiationActionFromAvrTest.java index bd297eecf25c..440a49ab81fc 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/SystemAudioInitiationActionFromAvrTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/SystemAudioInitiationActionFromAvrTest.java @@ -31,6 +31,7 @@ import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -150,6 +151,11 @@ public class SystemAudioInitiationActionFromAvrTest { int sourceAddress, int physicalAddress) { mBroadcastActiveSource = true; } + + @Override + int pathToPortId(int path) { + return -1; + } }; mHdmiCecLocalDeviceAudioSystem = new HdmiCecLocalDeviceAudioSystem(hdmiControlService) { @@ -270,6 +276,7 @@ public class SystemAudioInitiationActionFromAvrTest { assertTrue(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()); } + @Ignore("b/120845532") @Test public void testIsPlaybackDevice_cannotReceiveActiveSource() { resetTestVariables(); @@ -282,10 +289,10 @@ public class SystemAudioInitiationActionFromAvrTest { mTestLooper.dispatchAll(); assertThat(mMsgRequestActiveSourceCount).isEqualTo(1); - assertThat(mMsgSetSystemAudioModeCount).isEqualTo(1); + assertThat(mBroadcastActiveSource).isTrue(); assertThat(mQueryTvSystemAudioModeSupportCount).isEqualTo(1); + assertThat(mMsgSetSystemAudioModeCount).isEqualTo(1); assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isTrue(); - assertThat(mBroadcastActiveSource).isTrue(); } private void resetTestVariables() { 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 823b7a5ee545..3ebc6ad9b906 100644 --- a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java @@ -544,6 +544,18 @@ public class UserManagerTest extends AndroidTestCase { switchUser(-1, UserHandle.of(startUser), false); } + public void testSwitchUserByHandle_ThrowsException() { + synchronized (mUserSwitchLock) { + try { + ActivityManager am = getContext().getSystemService(ActivityManager.class); + am.switchUser(null); + fail("Expected IllegalArgumentException on passing in a null UserHandle."); + } catch (IllegalArgumentException expected) { + // Do nothing - exception is expected. + } + } + } + @MediumTest public void testConcurrentUserCreate() throws Exception { int userCount = mUserManager.getUserCount(); diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java index 5bf3d2dabe24..56f4a8544f00 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java @@ -36,6 +36,9 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; 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 android.platform.test.annotations.Presubmit; @@ -54,11 +57,6 @@ import org.junit.Test; @Presubmit public class ActivityDisplayTests extends ActivityTestsBase { - @Before - public void setUp() throws Exception { - setupActivityTaskManagerService(); - } - @Test public void testLastFocusedStackIsUpdatedWhenMovingStack() { // Create a stack at bottom. @@ -277,4 +275,60 @@ public class ActivityDisplayTests extends ActivityTestsBase { assertTrue(anotherAlwaysOnTopStack.isAlwaysOnTop()); assertEquals(anotherAlwaysOnTopStack, display.getChildAt(topPosition - 1)); } + + @Test + public void testRemoveStackInWindowingModes() { + removeStackTests(() -> mRootActivityContainer.removeStacksInWindowingModes( + WINDOWING_MODE_FULLSCREEN)); + } + + @Test + public void testRemoveStackWithActivityTypes() { + removeStackTests( + () -> mRootActivityContainer.removeStacksWithActivityTypes(ACTIVITY_TYPE_STANDARD)); + } + + private void removeStackTests(Runnable runnable) { + final ActivityDisplay display = mRootActivityContainer.getDefaultDisplay(); + final ActivityStack stack1 = display.createStack(WINDOWING_MODE_FULLSCREEN, + ACTIVITY_TYPE_STANDARD, ON_TOP); + final ActivityStack stack2 = display.createStack(WINDOWING_MODE_FULLSCREEN, + ACTIVITY_TYPE_STANDARD, ON_TOP); + final ActivityStack stack3 = display.createStack(WINDOWING_MODE_FULLSCREEN, + ACTIVITY_TYPE_STANDARD, ON_TOP); + final ActivityStack stack4 = display.createStack(WINDOWING_MODE_FULLSCREEN, + ACTIVITY_TYPE_STANDARD, ON_TOP); + final TaskRecord task1 = new TaskBuilder(mService.mStackSupervisor).setStack( + stack1).setTaskId(1).build(); + final TaskRecord task2 = new TaskBuilder(mService.mStackSupervisor).setStack( + stack2).setTaskId(2).build(); + final TaskRecord task3 = new TaskBuilder(mService.mStackSupervisor).setStack( + stack3).setTaskId(3).build(); + final TaskRecord task4 = new TaskBuilder(mService.mStackSupervisor).setStack( + stack4).setTaskId(4).build(); + + // Reordering stacks while removing stacks. + doAnswer(invocation -> { + display.positionChildAtTop(stack3, false); + return true; + }).when(mSupervisor).removeTaskByIdLocked(eq(task4.taskId), anyBoolean(), anyBoolean(), + any()); + + // Removing stacks from the display while removing stacks. + doAnswer(invocation -> { + display.removeChild(stack2); + return true; + }).when(mSupervisor).removeTaskByIdLocked(eq(task2.taskId), anyBoolean(), anyBoolean(), + any()); + + runnable.run(); + verify(mSupervisor).removeTaskByIdLocked(eq(task4.taskId), anyBoolean(), anyBoolean(), + any()); + verify(mSupervisor).removeTaskByIdLocked(eq(task3.taskId), anyBoolean(), anyBoolean(), + any()); + verify(mSupervisor).removeTaskByIdLocked(eq(task2.taskId), anyBoolean(), anyBoolean(), + any()); + verify(mSupervisor).removeTaskByIdLocked(eq(task1.taskId), anyBoolean(), anyBoolean(), + any()); + } } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java index cac9cf69ce4d..ee228610ab21 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java @@ -70,8 +70,6 @@ public class ActivityMetricsLaunchObserverTests extends ActivityTestsBase { @Before public void setUpAMLO() throws Exception { - setupActivityTaskManagerService(); - mLaunchObserver = mock(ActivityMetricsLaunchObserver.class); // ActivityStackSupervisor always creates its own instance of ActivityMetricsLogger. diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index d1609c3955bf..ee97bb25523c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -69,8 +69,7 @@ public class ActivityRecordTests extends ActivityTestsBase { @Before public void setUp() throws Exception { - setupActivityTaskManagerService(); - mStack = new StackBuilder(mRootActivityContainer).build(); + mStack = (TestActivityStack) new StackBuilder(mRootActivityContainer).build(); mTask = mStack.getChildAt(0); mActivity = mTask.getTopActivity(); } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStackSupervisorTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStackSupervisorTests.java index f7b5d26ac87e..59e71c417439 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStackSupervisorTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStackSupervisorTests.java @@ -64,7 +64,6 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase { @Before public void setUp() throws Exception { - setupActivityTaskManagerService(); mFullscreenStack = mRootActivityContainer.getDefaultDisplay().createStack( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); } 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 9d5f687b83a7..35c1edeace2d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java @@ -75,7 +75,6 @@ public class ActivityStackTests extends ActivityTestsBase { @Before public void setUp() throws Exception { - setupActivityTaskManagerService(); mDefaultDisplay = mRootActivityContainer.getDefaultDisplay(); mStack = spy(mDefaultDisplay.createStack(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, true /* onTop */)); @@ -266,13 +265,13 @@ public class ActivityStackTests extends ActivityTestsBase { // Do not move display to back because there is still another stack. stack2.moveToBack("testMoveStackToBackIncludingParent", stack2.topTask()); - verify(stack2.getWindowContainerController()).positionChildAtBottom(any(), + verify(stack2.getTaskStack()).positionChildAtBottom(any(), eq(false) /* includingParents */); // Also move display to back because there is only one stack left. display.removeChild(stack1); stack2.moveToBack("testMoveStackToBackIncludingParent", stack2.topTask()); - verify(stack2.getWindowContainerController()).positionChildAtBottom(any(), + verify(stack2.getTaskStack()).positionChildAtBottom(any(), eq(true) /* includingParents */); } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStartControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStartControllerTests.java index 2ba2fdbcb959..96db38b14ad5 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStartControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStartControllerTests.java @@ -56,7 +56,6 @@ public class ActivityStartControllerTests extends ActivityTestsBase { @Before public void setUp() throws Exception { - mService = createActivityTaskManagerService(); mFactory = mock(Factory.class); mController = new ActivityStartController(mService, mService.mStackSupervisor, mFactory); mStarter = spy(new ActivityStarter(mController, mService, diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java index ec88718dab5d..a381023590c3 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java @@ -117,7 +117,6 @@ public class ActivityStarterTests extends ActivityTestsBase { @Before public void setUp() throws Exception { - setupActivityTaskManagerService(); mController = mock(ActivityStartController.class); mActivityMetricsLogger = mock(ActivityMetricsLogger.class); clearInvocations(mActivityMetricsLogger); @@ -143,7 +142,7 @@ public class ActivityStarterTests extends ActivityTestsBase { .setStack(mService.mRootActivityContainer.getDefaultDisplay().createStack( WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */)) .build(); - assertThat((Object) task2.getStack()).isInstanceOf(PinnedActivityStack.class); + assertThat((Object) task2.getStack()).isInstanceOf(ActivityStack.class); mStarter.updateBounds(task2, bounds); verify(mService, times(1)).resizeStack(eq(task2.getStack().mStackId), diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java index 5589ca1be815..68df87e3e27d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java @@ -39,9 +39,6 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.server.wm.ActivityStack.REMOVE_TASK_MODE_DESTROYING; import static com.android.server.wm.ActivityStackSupervisor.ON_TOP; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doCallRealMethod; - import android.app.ActivityManagerInternal; import android.app.ActivityOptions; import android.app.IApplicationThread; @@ -66,11 +63,11 @@ import android.view.Display; import android.view.DisplayInfo; import com.android.internal.app.IVoiceInteractor; -import com.android.server.appop.AppOpsService; import com.android.server.AttributeCache; import com.android.server.ServiceThread; import com.android.server.am.ActivityManagerService; import com.android.server.am.PendingIntentController; +import com.android.server.appop.AppOpsService; import com.android.server.firewall.IntentFirewall; import com.android.server.uri.UriGrantsManagerInternal; @@ -114,6 +111,10 @@ class ActivityTestsBase { @Before public void setUpBase() { mTestInjector.setUp(); + + mService = new TestActivityTaskManagerService(mContext); + mSupervisor = mService.mStackSupervisor; + mRootActivityContainer = mService.mRootActivityContainer; } @After @@ -125,17 +126,6 @@ class ActivityTestsBase { } } - ActivityTaskManagerService createActivityTaskManagerService() { - mService = new TestActivityTaskManagerService(mContext); - mSupervisor = mService.mStackSupervisor; - mRootActivityContainer = mService.mRootActivityContainer; - return mService; - } - - void setupActivityTaskManagerService() { - createActivityTaskManagerService(); - } - /** Creates a {@link TestActivityDisplay}. */ TestActivityDisplay createNewActivityDisplay() { return TestActivityDisplay.create(mSupervisor, sNextDisplayId++); @@ -377,7 +367,7 @@ class ActivityTestsBase { mStack.addTask(task, true, "creating test task"); task.setStack(mStack); task.setTask(); - mStack.getWindowContainerController().mContainer.addChild(task.mTask, 0); + mStack.getTaskStack().addChild(task.mTask, 0); } task.touchActiveTime(); @@ -632,7 +622,7 @@ class ActivityTestsBase { @SuppressWarnings("TypeParameterUnusedInFormals") @Override - <T extends ActivityStack> T createStackUnchecked(int windowingMode, int activityType, + ActivityStack createStackUnchecked(int windowingMode, int activityType, int stackId, boolean onTop) { return new StackBuilder(mSupervisor.mRootActivityContainer).setDisplay(this) .setWindowingMode(windowingMode).setActivityType(activityType) @@ -681,10 +671,9 @@ class ActivityTestsBase { * method is called. Note that its functionality depends on the implementations of the * construction arguments. */ - protected static class TestActivityStack<T extends StackWindowController> - extends ActivityStack<T> { + protected static class TestActivityStack + extends ActivityStack { private int mOnActivityRemovedFromStackCount = 0; - private T mContainerController; static final int IS_TRANSLUCENT_UNSET = 0; static final int IS_TRANSLUCENT_FALSE = 1; @@ -724,20 +713,20 @@ class ActivityTestsBase { } @Override - protected T createStackWindowController(int displayId, boolean onTop, Rect outBounds) { - mContainerController = (T) WindowTestUtils.createMockStackWindowContainerController(); + protected void createTaskStack(int displayId, boolean onTop, Rect outBounds) { + mTaskStack = WindowTestUtils.createMockTaskStack(); // Primary pinned stacks require a non-empty out bounds to be set or else all tasks // will be moved to the full screen stack. if (getWindowingMode() == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) { outBounds.set(0, 0, 100, 100); } - return mContainerController; + } @Override - T getWindowContainerController() { - return mContainerController; + TaskStack getTaskStack() { + return mTaskStack; } void setIsTranslucent(boolean isTranslucent) { @@ -827,27 +816,23 @@ class ActivityTestsBase { } @SuppressWarnings("TypeParameterUnusedInFormals") - <T extends ActivityStack> T build() { + ActivityStack build() { final int stackId = mStackId >= 0 ? mStackId : mDisplay.getNextStackId(); if (mWindowingMode == WINDOWING_MODE_PINNED) { - return (T) new PinnedActivityStack(mDisplay, stackId, - mRootActivityContainer.mStackSupervisor, mOnTop) { + return new ActivityStack(mDisplay, stackId, mRootActivityContainer.mStackSupervisor, + mWindowingMode, ACTIVITY_TYPE_STANDARD, mOnTop) { @Override Rect getDefaultPictureInPictureBounds(float aspectRatio) { return new Rect(50, 50, 100, 100); } @Override - PinnedStackWindowController createStackWindowController(int displayId, - boolean onTop, Rect outBounds) { - PinnedStackWindowController controller = - mock(PinnedStackWindowController.class); - controller.mContainer = mock(TaskStack.class); - return controller; + void createTaskStack(int displayId, boolean onTop, Rect outBounds) { + mTaskStack = mock(TaskStack.class); } }; } else { - return (T) new TestActivityStack(mDisplay, stackId, + return new TestActivityStack(mDisplay, stackId, mRootActivityContainer.mStackSupervisor, mWindowingMode, mActivityType, mOnTop, mCreateActivity); } diff --git a/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java index 51bebbbcd6b0..123de2d227bc 100644 --- a/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java @@ -60,7 +60,7 @@ public class AppTransitionTests extends WindowTestsBase { @BeforeClass public static void setUpRootWindowContainerMock() { - final WindowManagerService wm = WmServiceUtils.getWindowManagerService(); + final WindowManagerService wm = TestSystemServices.getWindowManagerService(); // For unit test, we don't need to test performSurfacePlacement to prevent some abnormal // interaction with surfaceflinger native side. sOriginalRootWindowContainer = wm.mRoot; @@ -74,7 +74,7 @@ public class AppTransitionTests extends WindowTestsBase { @AfterClass public static void tearDownRootWindowContainerMock() { - final WindowManagerService wm = WmServiceUtils.getWindowManagerService(); + final WindowManagerService wm = TestSystemServices.getWindowManagerService(); wm.mRoot = sOriginalRootWindowContainer; sOriginalRootWindowContainer = null; } @@ -181,7 +181,7 @@ public class AppTransitionTests extends WindowTestsBase { assertTrue(dc1.mOpeningApps.size() > 0); // Move stack to another display. - stack1.getController().reparent(dc2.getDisplayId(), new Rect(), true); + stack1.reparent(dc2.getDisplayId(), new Rect(), true); // Verify if token are cleared from both pending transition list in former display. assertFalse(dc1.mOpeningApps.contains(token1)); diff --git a/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java index bb3ab358e71a..68d8bc078d54 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java @@ -94,8 +94,8 @@ public class DragDropControllerTests extends WindowTestsBase { private WindowState createDropTargetWindow(String name, int ownerId) { final WindowTestUtils.TestAppWindowToken token = WindowTestUtils.createTestAppWindowToken( mDisplayContent); - final TaskStack stack = createStackControllerOnStackOnDisplay( - WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, mDisplayContent).mContainer; + final TaskStack stack = createTaskStackOnDisplay( + WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, mDisplayContent); final Task task = createTaskInStack(stack, ownerId); task.addChild(token, 0); diff --git a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java index 8c3dec7f1e75..b28ae40d5056 100644 --- a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java @@ -71,7 +71,6 @@ public class LaunchParamsControllerTests extends ActivityTestsBase { @Before public void setUp() throws Exception { - mService = createActivityTaskManagerService(); mPersister = new TestLaunchParamsPersister(); mController = new LaunchParamsController(mService, mPersister); } diff --git a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java index 86353643c128..aeda473a9e6e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java @@ -102,8 +102,6 @@ public class LaunchParamsPersisterTests extends ActivityTestsBase { mFolder = new File(cacheFolder, "launch_params_tests"); deleteRecursively(mFolder); - setupActivityTaskManagerService(); - mDisplayUniqueId = "test:" + Integer.toString(sNextUniqueId++); final DisplayInfo info = new DisplayInfo(); info.uniqueId = mDisplayUniqueId; diff --git a/services/tests/wmtests/src/com/android/server/wm/PendingRemoteAnimationRegistryTest.java b/services/tests/wmtests/src/com/android/server/wm/PendingRemoteAnimationRegistryTest.java index efd7d25c586d..beaac8e58686 100644 --- a/services/tests/wmtests/src/com/android/server/wm/PendingRemoteAnimationRegistryTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/PendingRemoteAnimationRegistryTest.java @@ -52,7 +52,6 @@ public class PendingRemoteAnimationRegistryTest extends ActivityTestsBase { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - mService = createActivityTaskManagerService(); mService.mH.runWithScissors(() -> { mHandler = new TestHandler(null, mClock); }, 0); diff --git a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java index 58302d6b8b75..e3bacf96a86c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java @@ -82,7 +82,6 @@ public class RootActivityContainerTests extends ActivityTestsBase { @Before public void setUp() throws Exception { - setupActivityTaskManagerService(); mFullscreenStack = mRootActivityContainer.getDefaultDisplay().createStack( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); } @@ -323,8 +322,8 @@ public class RootActivityContainerTests extends ActivityTestsBase { public void testFindTaskToMoveToFrontWhenRecentsOnTop() { // Create stack/task on default display. final ActivityDisplay display = mRootActivityContainer.getDefaultDisplay(); - final TestActivityStack targetStack = - new StackBuilder(mRootActivityContainer).setOnTop(false).build(); + final TestActivityStack targetStack = (TestActivityStack) new StackBuilder( + mRootActivityContainer).setOnTop(false).build(); final TaskRecord targetTask = targetStack.getChildAt(0); // Create Recents on top of the display. diff --git a/services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java index a8b6dc373cbf..dc964806b7a9 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java @@ -49,7 +49,6 @@ public class RunningTasksTest extends ActivityTestsBase { @Before public void setUp() throws Exception { - setupActivityTaskManagerService(); mRunningTasks = new RunningTasks(); } diff --git a/services/tests/wmtests/src/com/android/server/wm/StackWindowControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/StackWindowControllerTests.java deleted file mode 100644 index 5690b58737ab..000000000000 --- a/services/tests/wmtests/src/com/android/server/wm/StackWindowControllerTests.java +++ /dev/null @@ -1,105 +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.server.wm; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import android.graphics.Rect; -import android.platform.test.annotations.Presubmit; - -import androidx.test.filters.SmallTest; - -import org.junit.Test; - -/** - * Test class for {@link StackWindowController}. - * - * Build/Install/Run: - * atest FrameworksServicesTests:StackWindowControllerTests - */ -@SmallTest -@Presubmit -public class StackWindowControllerTests extends WindowTestsBase { - @Test - public void testRemoveContainer() { - final StackWindowController stackController = - createStackControllerOnDisplay(mDisplayContent); - final WindowTestUtils.TestTask task = WindowTestUtils.createTestTask(stackController); - - final TaskStack stack = stackController.mContainer; - assertNotNull(stack); - assertNotNull(task); - stackController.removeContainer(); - // Assert that the container was removed. - assertNull(stackController.mContainer); - assertNull(stack.getDisplayContent()); - assertNull(task.getDisplayContent()); - assertNull(task.mStack); - } - - @Test - public void testRemoveContainer_deferRemoval() { - final StackWindowController stackController = - createStackControllerOnDisplay(mDisplayContent); - final WindowTestUtils.TestTask task = WindowTestUtils.createTestTask(stackController); - - final TaskStack stack = stackController.mContainer; - // Stack removal is deferred if one of its child is animating. - task.setLocalIsAnimating(true); - - stackController.removeContainer(); - // For the case of deferred removal the stack controller will no longer be connected to the - // container, but the task controller will still be connected to the its container until - // the stack window container is removed. - assertNull(stackController.mContainer); - assertNull(stack.getController()); - assertNotNull(task); - - stack.removeImmediately(); - // After removing, the task will be isolated. - assertNull(task.getParent()); - assertEquals(task.getChildCount(), 0); - assertNull(task.getController()); - } - - @Test - public void testReparent() { - // Create first stack on primary display. - final StackWindowController stack1Controller = - createStackControllerOnDisplay(mDisplayContent); - final TaskStack stack1 = stack1Controller.mContainer; - final WindowTestUtils.TestTask task1 = WindowTestUtils.createTestTask(stack1Controller); - task1.mOnDisplayChangedCalled = false; - - // Create second display and put second stack on it. - final DisplayContent dc = createNewDisplay(); - final StackWindowController stack2Controller = - createStackControllerOnDisplay(dc); - final TaskStack stack2 = stack2Controller.mContainer; - - // Reparent - stack1Controller.reparent(dc.getDisplayId(), new Rect(), true /* onTop */); - assertEquals(dc, stack1.getDisplayContent()); - final int stack1PositionInParent = stack1.getParent().mChildren.indexOf(stack1); - final int stack2PositionInParent = stack1.getParent().mChildren.indexOf(stack2); - assertEquals(stack1PositionInParent, stack2PositionInParent + 1); - assertTrue(task1.mOnDisplayChangedCalled); - } -} diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java index 53e99fae95d4..ace179acdeb5 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java @@ -75,10 +75,6 @@ public class TaskLaunchParamsModifierTests extends ActivityTestsBase { @Before public void setUp() throws Exception { - setupActivityTaskManagerService(); - mService.mSupportsFreeformWindowManagement = true; - when(mSupervisor.canUseActivityOptionsLaunchBounds(any())).thenCallRealMethod(); - mActivity = new ActivityBuilder(mService).build(); mActivity.appInfo.targetSdkVersion = Build.VERSION_CODES.N_MR1; mActivity.info.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES; diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java index 1c33dfb79551..e182c45f009e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java @@ -90,7 +90,6 @@ public class TaskRecordTests extends ActivityTestsBase { @Before public void setUp() throws Exception { TaskRecord.setTaskRecordFactory(null); - setupActivityTaskManagerService(); mParentBounds = new Rect(10 /*left*/, 30 /*top*/, 80 /*right*/, 60 /*bottom*/); } @@ -314,13 +313,11 @@ public class TaskRecordTests extends ActivityTestsBase { // Wire up task and stack. task.mTask.mTaskRecord = task; doCallRealMethod().when(task.mTask).onDescendantOrientationChanged(any(), any()); - doReturn(stack.getWindowContainerController().mContainer).when(task.mTask).getParent(); + doReturn(stack.getTaskStack()).when(task.mTask).getParent(); // Wire up stack and display content. - doCallRealMethod().when(stack.mWindowContainerController.mContainer) - .onDescendantOrientationChanged(any(), any()); - doReturn(display.mDisplayContent).when(stack.mWindowContainerController.mContainer) - .getParent(); + doCallRealMethod().when(stack.mTaskStack).onDescendantOrientationChanged(any(), any()); + doReturn(display.mDisplayContent).when(stack.mTaskStack).getParent(); activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); assertTrue("Bounds of the task should be pillarboxed.", diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskStackContainersTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskStackContainersTests.java index f01e9f0662c9..74ccccca43bb 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskStackContainersTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskStackContainersTests.java @@ -47,8 +47,8 @@ public class TaskStackContainersTests extends WindowTestsBase { @Before public void setUp() throws Exception { - mPinnedStack = createStackControllerOnStackOnDisplay( - WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, mDisplayContent).mContainer; + mPinnedStack = createTaskStackOnDisplay( + WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, mDisplayContent); // Stack should contain visible app window to be considered visible. final Task pinnedTask = createTaskInStack(mPinnedStack, 0 /* userId */); assertFalse(mPinnedStack.isVisible()); diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java index 7ac331829fb1..2554237cdbf5 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java @@ -20,8 +20,12 @@ import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import android.graphics.Rect; import android.platform.test.annotations.Presubmit; import androidx.test.filters.SmallTest; @@ -106,4 +110,62 @@ public class TaskStackTests extends WindowTestsBase { assertNull(stack.getDisplayContent()); assertNull(task.mStack); } + + @Test + public void testRemoveContainer() { + final TaskStack stack = createTaskStackOnDisplay(mDisplayContent); + final WindowTestUtils.TestTask task = WindowTestUtils.createTestTask(stack); + + assertNotNull(stack); + assertNotNull(task); + stack.removeIfPossible(); + // Assert that the container was removed. + assertNull(stack.getParent()); + assertEquals(0, stack.getChildCount()); + assertNull(stack.getDisplayContent()); + assertNull(task.getDisplayContent()); + assertNull(task.mStack); + } + + @Test + public void testRemoveContainer_deferRemoval() { + final TaskStack stack = createTaskStackOnDisplay(mDisplayContent); + final WindowTestUtils.TestTask task = WindowTestUtils.createTestTask(stack); + + // Stack removal is deferred if one of its child is animating. + task.setLocalIsAnimating(true); + + stack.removeIfPossible(); + // For the case of deferred removal the task controller will still be connected to the its + // container until the stack window container is removed. + assertNotNull(stack.getParent()); + assertNotEquals(0, stack.getChildCount()); + assertNotNull(task); + + stack.removeImmediately(); + // After removing, the task will be isolated. + assertNull(task.getParent()); + assertEquals(0, task.getChildCount()); + assertNull(task.getController()); + } + + @Test + public void testReparent() { + // Create first stack on primary display. + final TaskStack stack1 = createTaskStackOnDisplay(mDisplayContent); + final WindowTestUtils.TestTask task1 = WindowTestUtils.createTestTask(stack1); + task1.mOnDisplayChangedCalled = false; + + // Create second display and put second stack on it. + final DisplayContent dc = createNewDisplay(); + final TaskStack stack2 = createTaskStackOnDisplay(dc); + + // Reparent + stack1.reparent(dc.getDisplayId(), new Rect(), true /* onTop */); + assertEquals(dc, stack1.getDisplayContent()); + final int stack1PositionInParent = stack1.getParent().mChildren.indexOf(stack1); + final int stack2PositionInParent = stack1.getParent().mChildren.indexOf(stack2); + assertEquals(stack1PositionInParent, stack2PositionInParent + 1); + assertTrue(task1.mOnDisplayChangedCalled); + } } diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java index 3e32ed37a6f3..ae211d3f1e38 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java @@ -40,8 +40,7 @@ public class TaskTests extends WindowTestsBase { @Test public void testRemoveContainer() { - final StackWindowController stackController1 = - createStackControllerOnDisplay(mDisplayContent); + final TaskStack stackController1 = createTaskStackOnDisplay(mDisplayContent); final WindowTestUtils.TestTask task = WindowTestUtils.createTestTask(stackController1); final WindowTestUtils.TestAppWindowToken appToken = WindowTestUtils.createAppWindowTokenInTask(mDisplayContent, task); @@ -49,14 +48,13 @@ public class TaskTests extends WindowTestsBase { task.removeIfPossible(); // Assert that the container was removed. assertNull(task.getParent()); - assertEquals(task.getChildCount(), 0); + assertEquals(0, task.getChildCount()); assertNull(appToken.getParent()); } @Test public void testRemoveContainer_deferRemoval() { - final StackWindowController stackController1 = - createStackControllerOnDisplay(mDisplayContent); + final TaskStack stackController1 = createTaskStackOnDisplay(mDisplayContent); final WindowTestUtils.TestTask task = WindowTestUtils.createTestTask(stackController1); final WindowTestUtils.TestAppWindowToken appToken = WindowTestUtils.createAppWindowTokenInTask(mDisplayContent, task); @@ -67,22 +65,20 @@ public class TaskTests extends WindowTestsBase { // For the case of deferred removal the task will still be connected to the its app token // until the task window container is removed. assertNotNull(task.getParent()); - assertNotEquals(task.getChildCount(), 0); + assertNotEquals(0, task.getChildCount()); assertNotNull(appToken.getParent()); task.removeImmediately(); assertNull(task.getParent()); - assertEquals(task.getChildCount(), 0); + assertEquals(0, task.getChildCount()); assertNull(appToken.getParent()); } @Test public void testReparent() { - final StackWindowController stackController1 = - createStackControllerOnDisplay(mDisplayContent); + final TaskStack stackController1 = createTaskStackOnDisplay(mDisplayContent); final WindowTestUtils.TestTask task = WindowTestUtils.createTestTask(stackController1); - final StackWindowController stackController2 = - createStackControllerOnDisplay(mDisplayContent); + final TaskStack stackController2 = createTaskStackOnDisplay(mDisplayContent); final WindowTestUtils.TestTask task2 = WindowTestUtils.createTestTask(stackController2); boolean gotException = false; @@ -93,20 +89,17 @@ public class TaskTests extends WindowTestsBase { } assertTrue("Should not be able to reparent to the same parent", gotException); - final StackWindowController stackController3 = - createStackControllerOnDisplay(mDisplayContent); - stackController3.setContainer(null); gotException = false; try { - task.reparent(stackController3, 0, false/* moveParents */); + task.reparent(null, 0, false/* moveParents */); } catch (IllegalArgumentException e) { gotException = true; } - assertTrue("Should not be able to reparent to a stack that doesn't have a container", + assertTrue("Should not be able to reparent to a stack that doesn't exist", gotException); task.reparent(stackController2, 0, false/* moveParents */); - assertEquals(stackController2.mContainer, task.getParent()); + assertEquals(stackController2, task.getParent()); assertEquals(0, task.positionInParent()); assertEquals(1, task2.positionInParent()); } @@ -114,20 +107,17 @@ public class TaskTests extends WindowTestsBase { @Test public void testReparent_BetweenDisplays() { // Create first stack on primary display. - final StackWindowController stack1Controller = - createStackControllerOnDisplay(mDisplayContent); - final TaskStack stack1 = stack1Controller.mContainer; - final WindowTestUtils.TestTask task = WindowTestUtils.createTestTask(stack1Controller); + final TaskStack stack1 = createTaskStackOnDisplay(mDisplayContent); + final WindowTestUtils.TestTask task = WindowTestUtils.createTestTask(stack1); task.mOnDisplayChangedCalled = false; assertEquals(mDisplayContent, stack1.getDisplayContent()); // Create second display and put second stack on it. final DisplayContent dc = createNewDisplay(); - final StackWindowController stack2Controller = createStackControllerOnDisplay(dc); - final TaskStack stack2 = stack2Controller.mContainer; - final WindowTestUtils.TestTask task2 = WindowTestUtils.createTestTask(stack2Controller); + final TaskStack stack2 = createTaskStackOnDisplay(dc); + final WindowTestUtils.TestTask task2 = WindowTestUtils.createTestTask(stack2); // Reparent and check state - task.reparent(stack2Controller, 0, false /* moveParents */); + task.reparent(stack2, 0, false /* moveParents */); assertEquals(stack2, task.getParent()); assertEquals(0, task.positionInParent()); assertEquals(1, task2.positionInParent()); diff --git a/services/tests/wmtests/src/com/android/server/wm/WmServiceUtils.java b/services/tests/wmtests/src/com/android/server/wm/TestSystemServices.java index 05ac8c1072c0..b151fb7a613c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WmServiceUtils.java +++ b/services/tests/wmtests/src/com/android/server/wm/TestSystemServices.java @@ -66,7 +66,7 @@ import java.util.concurrent.CountDownLatch; /** * A Test utility class to create a mock {@link WindowManagerService} instance for tests. */ -class WmServiceUtils { +class TestSystemServices { private static StaticMockitoSession sMockitoSession; private static WindowManagerService sService; private static TestWindowManagerPolicy sPolicy; @@ -78,7 +78,7 @@ class WmServiceUtils { .strictness(Strictness.LENIENT) .startMocking(); - runWithDexmakerShareClassLoader(WmServiceUtils::setUpTestWindowService); + runWithDexmakerShareClassLoader(TestSystemServices::setUpTestWindowService); } static void tearDownWindowManagerService() { @@ -147,7 +147,7 @@ class WmServiceUtils { final WindowManagerGlobalLock wmLock = new WindowManagerGlobalLock(); doReturn(wmLock).when(atms).getGlobalLock(); - sPolicy = new TestWindowManagerPolicy(WmServiceUtils::getWindowManagerService); + sPolicy = new TestWindowManagerPolicy(TestSystemServices::getWindowManagerService); sService = WindowManagerService.main(context, ims, false, false, sPolicy, atms); sService.onInitReady(); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java index d9ef10d7eecb..0a4a8a43fbc5 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java @@ -16,12 +16,15 @@ package com.android.server.wm; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; +import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.view.DisplayCutout.BOUNDS_POSITION_TOP; import static android.view.DisplayCutout.fromBoundingRect; import static android.view.WindowManager.LayoutParams.MATCH_PARENT; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; import android.app.ActivityManager.TaskDescription; import android.content.res.Configuration; @@ -58,7 +61,7 @@ public class WindowFrameTests extends WindowTestsBase { boolean mDockedResizingForTest = false; WindowStateWithTask(WindowManagerService wm, IWindow iWindow, WindowToken windowToken, WindowManager.LayoutParams attrs, Task t) { - super(wm, null, iWindow, windowToken, null, 0, 0, attrs, 0, 0, + super(wm, mock(Session.class), iWindow, windowToken, null, 0, 0, attrs, 0, 0, false /* ownerCanAddInternalSystemWindow */); mTask = t; } @@ -113,9 +116,9 @@ public class WindowFrameTests extends WindowTestsBase { @Before public void setUp() throws Exception { - mWindowToken = WindowTestUtils.createTestAppWindowToken( - mWm.getDefaultDisplayContentLocked()); - mStubStack = new TaskStack(mWm, 0, null); + mWindowToken = createAppWindowToken(mWm.getDefaultDisplayContentLocked(), + WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD); + mStubStack = WindowTestUtils.createMockTaskStack(); } // Do not use this function directly in the tests below. Instead, use more explicit function diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java index 20fc5ae2454e..44e998b7e62a 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java @@ -103,12 +103,10 @@ public class WindowTestUtils { } /** - * Creates a mock instance of {@link StackWindowController}. + * Creates a mock instance of {@link TestTaskStack}. */ - public static StackWindowController createMockStackWindowContainerController() { - StackWindowController controller = mock(StackWindowController.class); - controller.mContainer = mock(TestTaskStack.class); - return controller; + public static TaskStack createMockTaskStack() { + return mock(TestTaskStack.class); } /** Creates a {@link Task} and adds it to the specified {@link TaskStack}. */ @@ -201,6 +199,11 @@ public class WindowTestUtils { } @Override + void onParentSet() { + // Do nothing. + } + + @Override boolean isOnTop() { return mOnTop; } @@ -283,10 +286,9 @@ public class WindowTestUtils { } } - public static TestTask createTestTask(StackWindowController stackWindowController) { - return new TestTask(sNextTaskId++, stackWindowController.mContainer, 0, - stackWindowController.mService, RESIZE_MODE_UNRESIZEABLE, false, - mock(TaskRecord.class)); + public static TestTask createTestTask(TaskStack stack) { + return new TestTask(sNextTaskId++, stack, 0, stack.mWmService, RESIZE_MODE_UNRESIZEABLE, + false, mock(TaskRecord.class)); } public static class TestIApplicationToken implements IApplicationToken { @@ -334,5 +336,10 @@ public class WindowTestUtils { mHasSurface = hadSurface; } + + @Override + void onParentSet() { + // Do nothing; + } } } 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 cdc0a477b9c6..e38118e875e0 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java @@ -41,7 +41,6 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; import android.content.Context; import android.content.res.Configuration; -import android.graphics.Rect; import android.hardware.display.DisplayManagerGlobal; import android.testing.DexmakerShareClassLoaderRule; import android.util.Log; @@ -102,14 +101,14 @@ class WindowTestsBase { public static void setUpOnceBase() { AttributeCache.init(getInstrumentation().getTargetContext()); - WmServiceUtils.setUpWindowManagerService(); + TestSystemServices.setUpWindowManagerService(); sPowerManagerWrapper = mock(WindowState.PowerManagerWrapper.class); } @AfterClass public static void tearDonwOnceBase() { - WmServiceUtils.tearDownWindowManagerService(); + TestSystemServices.tearDownWindowManagerService(); } @Before @@ -121,7 +120,7 @@ class WindowTestsBase { final Context context = getInstrumentation().getTargetContext(); - mWm = WmServiceUtils.getWindowManagerService(); + mWm = TestSystemServices.getWindowManagerService(); beforeCreateDisplay(); context.getDisplay().getDisplayInfo(mDisplayInfo); @@ -199,7 +198,7 @@ class WindowTestsBase { } // Cleaned up everything in Handler. - WmServiceUtils.cleanupWindowManagerHandlers(); + TestSystemServices.cleanupWindowManagerHandlers(); } catch (Exception e) { Log.e(TAG, "Failed to tear down test", e); throw e; @@ -220,7 +219,7 @@ class WindowTestsBase { * Waits until the main handler for WM has processed all messages. */ void waitUntilHandlersIdle() { - WmServiceUtils.waitUntilWindowManagerHandlersIdle(); + TestSystemServices.waitUntilWindowManagerHandlersIdle(); } private WindowToken createWindowToken( @@ -240,8 +239,7 @@ class WindowTestsBase { WindowTestUtils.TestAppWindowToken createTestAppWindowToken(DisplayContent dc, int windowingMode, int activityType) { - final TaskStack stack = createStackControllerOnStackOnDisplay(windowingMode, activityType, - dc).mContainer; + final TaskStack stack = createTaskStackOnDisplay(windowingMode, activityType, dc); final Task task = createTaskInStack(stack, 0 /* userId */); final WindowTestUtils.TestAppWindowToken appWindowToken = WindowTestUtils.createTestAppWindowToken(dc); @@ -350,28 +348,20 @@ class WindowTestsBase { /** Creates a {@link TaskStack} and adds it to the specified {@link DisplayContent}. */ TaskStack createTaskStackOnDisplay(DisplayContent dc) { synchronized (mWm.mGlobalLock) { - return createStackControllerOnDisplay(dc).mContainer; + return createTaskStackOnDisplay(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, dc); } } - StackWindowController createStackControllerOnDisplay(DisplayContent dc) { - synchronized (mWm.mGlobalLock) { - return createStackControllerOnStackOnDisplay( - WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, dc); - } - } - - StackWindowController createStackControllerOnStackOnDisplay( - int windowingMode, int activityType, DisplayContent dc) { + TaskStack createTaskStackOnDisplay(int windowingMode, int activityType, DisplayContent dc) { synchronized (mWm.mGlobalLock) { final Configuration overrideConfig = new Configuration(); overrideConfig.windowConfiguration.setWindowingMode(windowingMode); overrideConfig.windowConfiguration.setActivityType(activityType); final int stackId = ++sNextStackId; - final StackWindowController controller = new StackWindowController(stackId, null, - dc.getDisplayId(), true /* onTop */, new Rect(), mWm); - controller.onRequestedOverrideConfigurationChanged(overrideConfig); - return controller; + final TaskStack stack = new TaskStack(mWm, stackId, mock(ActivityStack.class)); + dc.setStackOnDisplay(stackId, true, stack); + stack.onRequestedOverrideConfigurationChanged(overrideConfig); + return stack; } } diff --git a/services/usage/java/com/android/server/usage/IntervalStats.java b/services/usage/java/com/android/server/usage/IntervalStats.java index 94cc6502a12d..9a5bd1379717 100644 --- a/services/usage/java/com/android/server/usage/IntervalStats.java +++ b/services/usage/java/com/android/server/usage/IntervalStats.java @@ -22,6 +22,7 @@ import static android.app.usage.UsageEvents.Event.ACTIVITY_STOPPED; import static android.app.usage.UsageEvents.Event.CONFIGURATION_CHANGE; import static android.app.usage.UsageEvents.Event.CONTINUE_PREVIOUS_DAY; import static android.app.usage.UsageEvents.Event.CONTINUING_FOREGROUND_SERVICE; +import static android.app.usage.UsageEvents.Event.DEVICE_SHUTDOWN; import static android.app.usage.UsageEvents.Event.END_OF_DAY; import static android.app.usage.UsageEvents.Event.FLUSH_TO_DISK; import static android.app.usage.UsageEvents.Event.FOREGROUND_SERVICE_START; @@ -66,7 +67,7 @@ public class IntervalStats { public final ArrayMap<String, UsageStats> packageStats = new ArrayMap<>(); public final ArrayMap<Configuration, ConfigurationStats> configurations = new ArrayMap<>(); public Configuration activeConfiguration; - public EventList events; + public EventList events = new EventList(); // A string cache. This is important as when we're parsing XML files, we don't want to // keep hundreds of strings that have the same contents. We will read the string @@ -112,6 +113,9 @@ public class IntervalStats { } + public IntervalStats() { + } + /** * Gets the UsageStats object for the given package, or creates one and adds it internally. */ @@ -253,6 +257,7 @@ public class IntervalStats { case ROLLOVER_FOREGROUND_SERVICE: case CONTINUE_PREVIOUS_DAY: case CONTINUING_FOREGROUND_SERVICE: + case DEVICE_SHUTDOWN: return true; } return false; @@ -281,8 +286,9 @@ public class IntervalStats { @VisibleForTesting public void update(String packageName, String className, long timeStamp, int eventType, int instanceId) { - if (eventType == FLUSH_TO_DISK) { - // FLUSH_TO_DISK are sent to all packages. + if (eventType == DEVICE_SHUTDOWN + || eventType == FLUSH_TO_DISK) { + // DEVICE_SHUTDOWN and FLUSH_TO_DISK are sent to all packages. final int size = packageStats.size(); for (int i = 0; i < size; i++) { UsageStats usageStats = packageStats.valueAt(i); @@ -321,9 +327,6 @@ public class IntervalStats { */ @VisibleForTesting public void addEvent(Event event) { - if (events == null) { - events = new EventList(); - } // Cache common use strings event.mPackage = getCachedStringRef(event.mPackage); if (event.mClass != null) { diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index f146370b01d7..76a3aa81530e 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -18,6 +18,7 @@ package com.android.server.usage; import static android.app.usage.UsageEvents.Event.CHOOSER_ACTION; import static android.app.usage.UsageEvents.Event.CONFIGURATION_CHANGE; +import static android.app.usage.UsageEvents.Event.DEVICE_SHUTDOWN; import static android.app.usage.UsageEvents.Event.FLUSH_TO_DISK; import static android.app.usage.UsageEvents.Event.NOTIFICATION_INTERRUPTION; import static android.app.usage.UsageEvents.Event.SHORTCUT_INVOCATION; @@ -416,11 +417,30 @@ public class UsageStatsService extends SystemService implements */ void shutdown() { synchronized (mLock) { + mHandler.removeMessages(MSG_REPORT_EVENT); + Event event = new Event(DEVICE_SHUTDOWN, SystemClock.elapsedRealtime()); + // orderly shutdown, the last event is DEVICE_SHUTDOWN. + reportEventToAllUserId(event); flushToDiskLocked(); } } /** + * After power button is pressed for 3.5 seconds + * (as defined in {@link com.android.internal.R.integer#config_veryLongPressTimeout}), + * report DEVICE_SHUTDOWN event and persist the database. If the power button is pressed for 10 + * seconds and the device is shutdown, the database is already persisted and we are not losing + * data. + * This method is called from PhoneWindowManager, do not synchronize on mLock otherwise + * PhoneWindowManager may be blocked. + */ + void prepareForPossibleShutdown() { + Event event = new Event(DEVICE_SHUTDOWN, SystemClock.elapsedRealtime()); + mHandler.obtainMessage(MSG_REPORT_EVENT_TO_ALL_USERID, event).sendToTarget(); + mHandler.sendEmptyMessage(MSG_FLUSH_TO_DISK); + } + + /** * Called by the Binder stub. */ void reportEvent(Event event, int userId) { @@ -1487,6 +1507,11 @@ public class UsageStatsService extends SystemService implements } @Override + public void prepareForPossibleShutdown() { + UsageStatsService.this.prepareForPossibleShutdown(); + } + + @Override public void addAppIdleStateChangeListener(AppIdleStateChangeListener listener) { mAppStandby.addListener(listener); listener.onParoleStateChanged(isAppIdleParoleOn()); diff --git a/services/usage/java/com/android/server/usage/UserUsageStatsService.java b/services/usage/java/com/android/server/usage/UserUsageStatsService.java index 5128ae1f9130..2d1098c7cf5c 100644 --- a/services/usage/java/com/android/server/usage/UserUsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UserUsageStatsService.java @@ -16,6 +16,7 @@ package com.android.server.usage; +import static android.app.usage.UsageEvents.Event.DEVICE_SHUTDOWN; import static android.app.usage.UsageStatsManager.INTERVAL_BEST; import static android.app.usage.UsageStatsManager.INTERVAL_COUNT; import static android.app.usage.UsageStatsManager.INTERVAL_DAILY; @@ -134,6 +135,18 @@ class UserUsageStatsService { updateRolloverDeadline(); } + // During system reboot, add a DEVICE_SHUTDOWN event to the end of event list, the timestamp + // is last time UsageStatsDatabase is persisted to disk. + final IntervalStats currentDailyStats = mCurrentStats[INTERVAL_DAILY]; + if (currentDailyStats != null) { + final int size = currentDailyStats.events.size(); + if (size == 0 || currentDailyStats.events.get(size - 1).mEventType != DEVICE_SHUTDOWN) { + // The last event in event list is not DEVICE_SHUTDOWN, then we insert one. + final Event event = new Event(DEVICE_SHUTDOWN, currentDailyStats.lastTimeSaved); + currentDailyStats.addEvent(event); + } + } + if (mDatabase.isNewUpdate()) { notifyNewUpdate(); } @@ -175,7 +188,9 @@ class UserUsageStatsService { // ACTIVITY_STOPPED. && event.mEventType != Event.ACTIVITY_DESTROYED // FLUSH_TO_DISK is a private event. - && event.mEventType != Event.FLUSH_TO_DISK) { + && event.mEventType != Event.FLUSH_TO_DISK + // DEVICE_SHUTDOWN is added to event list after reboot. + && event.mEventType != Event.DEVICE_SHUTDOWN) { currentDailyStats.addEvent(event); } @@ -393,10 +408,6 @@ class UserUsageStatsService { @Override public void combine(IntervalStats stats, boolean mutable, List<Event> accumulatedResult) { - if (stats.events == null) { - return; - } - final int startIndex = stats.events.firstIndexOnOrAfter(beginTime); final int size = stats.events.size(); for (int i = startIndex; i < size; i++) { @@ -434,10 +445,6 @@ class UserUsageStatsService { names.add(packageName); final List<Event> results = queryStats(INTERVAL_DAILY, beginTime, endTime, (stats, mutable, accumulatedResult) -> { - if (stats.events == null) { - return; - } - final int startIndex = stats.events.firstIndexOnOrAfter(beginTime); final int size = stats.events.size(); for (int i = startIndex; i < size; i++) { @@ -696,10 +703,6 @@ class UserUsageStatsService { @Override public void combine(IntervalStats stats, boolean mutable, List<Event> accumulatedResult) { - if (stats.events == null) { - return; - } - final int startIndex = stats.events.firstIndexOnOrAfter(beginTime); final int size = stats.events.size(); for (int i = startIndex; i < size; i++) { @@ -925,10 +928,12 @@ class UserUsageStatsService { return "SCREEN_INTERACTIVE"; case Event.SCREEN_NON_INTERACTIVE: return "SCREEN_NON_INTERACTIVE"; - case UsageEvents.Event.KEYGUARD_SHOWN: + case Event.KEYGUARD_SHOWN: return "KEYGUARD_SHOWN"; - case UsageEvents.Event.KEYGUARD_HIDDEN: + case Event.KEYGUARD_HIDDEN: return "KEYGUARD_HIDDEN"; + case Event.DEVICE_SHUTDOWN: + return "DEVICE_SHUTDOWN"; default: return "UNKNOWN_TYPE_" + eventType; } diff --git a/telephony/java/android/telephony/CellConfigLte.java b/telephony/java/android/telephony/CellConfigLte.java index 35769f04c5ae..eafbfbc5076d 100644 --- a/telephony/java/android/telephony/CellConfigLte.java +++ b/telephony/java/android/telephony/CellConfigLte.java @@ -34,6 +34,11 @@ public class CellConfigLte implements Parcelable { } /** @hide */ + public CellConfigLte(android.hardware.radio.V1_4.CellConfigLte cellConfig) { + mIsEndcAvailable = cellConfig.isEndcAvailable; + } + + /** @hide */ public CellConfigLte(boolean isEndcAvailable) { mIsEndcAvailable = isEndcAvailable; } diff --git a/telephony/java/android/telephony/CellInfo.java b/telephony/java/android/telephony/CellInfo.java index b761bd7bf70c..8ce5c54c810e 100644 --- a/telephony/java/android/telephony/CellInfo.java +++ b/telephony/java/android/telephony/CellInfo.java @@ -19,8 +19,10 @@ package android.telephony; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.UnsupportedAppUsage; +import android.hardware.radio.V1_4.CellInfo.Info; import android.os.Parcel; import android.os.Parcelable; +import android.os.SystemClock; import com.android.internal.annotations.VisibleForTesting; @@ -318,6 +320,13 @@ public abstract class CellInfo implements Parcelable { } /** @hide */ + protected CellInfo(android.hardware.radio.V1_4.CellInfo ci) { + this.mRegistered = ci.isRegistered; + this.mTimeStamp = SystemClock.elapsedRealtimeNanos(); + this.mCellConnectionStatus = ci.connectionStatus; + } + + /** @hide */ public static CellInfo create(android.hardware.radio.V1_0.CellInfo ci) { if (ci == null) return null; switch(ci.cellInfoType) { @@ -342,4 +351,17 @@ public abstract class CellInfo implements Parcelable { default: return null; } } + + /** @hide */ + public static CellInfo create(android.hardware.radio.V1_4.CellInfo ci) { + if (ci == null) return null; + switch (ci.info.getDiscriminator()) { + case Info.hidl_discriminator.gsm: return new CellInfoGsm(ci); + case Info.hidl_discriminator.cdma: return new CellInfoCdma(ci); + case Info.hidl_discriminator.lte: return new CellInfoLte(ci); + case Info.hidl_discriminator.wcdma: return new CellInfoWcdma(ci); + case Info.hidl_discriminator.tdscdma: return new CellInfoTdscdma(ci); + default: return null; + } + } } diff --git a/telephony/java/android/telephony/CellInfoCdma.java b/telephony/java/android/telephony/CellInfoCdma.java index c9f07dab6bbd..4440108879f2 100644 --- a/telephony/java/android/telephony/CellInfoCdma.java +++ b/telephony/java/android/telephony/CellInfoCdma.java @@ -67,6 +67,15 @@ public final class CellInfoCdma extends CellInfo implements Parcelable { new CellSignalStrengthCdma(cic.signalStrengthCdma, cic.signalStrengthEvdo); } + /** @hide */ + public CellInfoCdma(android.hardware.radio.V1_4.CellInfo ci) { + super(ci); + final android.hardware.radio.V1_2.CellInfoCdma cic = ci.info.cdma(); + mCellIdentityCdma = new CellIdentityCdma(cic.cellIdentityCdma); + mCellSignalStrengthCdma = + new CellSignalStrengthCdma(cic.signalStrengthCdma, cic.signalStrengthEvdo); + } + @Override public CellIdentityCdma getCellIdentity() { return mCellIdentityCdma; diff --git a/telephony/java/android/telephony/CellInfoGsm.java b/telephony/java/android/telephony/CellInfoGsm.java index ad16dfae7295..248adfcb2d90 100644 --- a/telephony/java/android/telephony/CellInfoGsm.java +++ b/telephony/java/android/telephony/CellInfoGsm.java @@ -63,6 +63,14 @@ public final class CellInfoGsm extends CellInfo implements Parcelable { mCellSignalStrengthGsm = new CellSignalStrengthGsm(cig.signalStrengthGsm); } + /** @hide */ + public CellInfoGsm(android.hardware.radio.V1_4.CellInfo ci) { + super(ci); + final android.hardware.radio.V1_2.CellInfoGsm cig = ci.info.gsm(); + mCellIdentityGsm = new CellIdentityGsm(cig.cellIdentityGsm); + mCellSignalStrengthGsm = new CellSignalStrengthGsm(cig.signalStrengthGsm); + } + @Override public CellIdentityGsm getCellIdentity() { return mCellIdentityGsm; diff --git a/telephony/java/android/telephony/CellInfoLte.java b/telephony/java/android/telephony/CellInfoLte.java index 75938317bf44..8e8ce8a1f5de 100644 --- a/telephony/java/android/telephony/CellInfoLte.java +++ b/telephony/java/android/telephony/CellInfoLte.java @@ -70,6 +70,15 @@ public final class CellInfoLte extends CellInfo implements Parcelable { mCellConfig = new CellConfigLte(); } + /** @hide */ + public CellInfoLte(android.hardware.radio.V1_4.CellInfo ci) { + super(ci); + final android.hardware.radio.V1_4.CellInfoLte cil = ci.info.lte(); + mCellIdentityLte = new CellIdentityLte(cil.base.cellIdentityLte); + mCellSignalStrengthLte = new CellSignalStrengthLte(cil.base.signalStrengthLte); + mCellConfig = new CellConfigLte(cil.cellConfig); + } + @Override public CellIdentityLte getCellIdentity() { if (DBG) log("getCellIdentity: " + mCellIdentityLte); diff --git a/telephony/java/android/telephony/CellInfoTdscdma.java b/telephony/java/android/telephony/CellInfoTdscdma.java index a8c49b7bf68e..2ab38fb77a90 100644 --- a/telephony/java/android/telephony/CellInfoTdscdma.java +++ b/telephony/java/android/telephony/CellInfoTdscdma.java @@ -64,6 +64,14 @@ public final class CellInfoTdscdma extends CellInfo implements Parcelable { mCellSignalStrengthTdscdma = new CellSignalStrengthTdscdma(cit.signalStrengthTdscdma); } + /** @hide */ + public CellInfoTdscdma(android.hardware.radio.V1_4.CellInfo ci) { + super(ci); + final android.hardware.radio.V1_2.CellInfoTdscdma cit = ci.info.tdscdma(); + mCellIdentityTdscdma = new CellIdentityTdscdma(cit.cellIdentityTdscdma); + mCellSignalStrengthTdscdma = new CellSignalStrengthTdscdma(cit.signalStrengthTdscdma); + } + @Override public CellIdentityTdscdma getCellIdentity() { return mCellIdentityTdscdma; } diff --git a/telephony/java/android/telephony/CellInfoWcdma.java b/telephony/java/android/telephony/CellInfoWcdma.java index a427e80fd65c..65e047077639 100644 --- a/telephony/java/android/telephony/CellInfoWcdma.java +++ b/telephony/java/android/telephony/CellInfoWcdma.java @@ -63,6 +63,14 @@ public final class CellInfoWcdma extends CellInfo implements Parcelable { mCellSignalStrengthWcdma = new CellSignalStrengthWcdma(ciw.signalStrengthWcdma); } + /** @hide */ + public CellInfoWcdma(android.hardware.radio.V1_4.CellInfo ci) { + super(ci); + final android.hardware.radio.V1_2.CellInfoWcdma ciw = ci.info.wcdma(); + mCellIdentityWcdma = new CellIdentityWcdma(ciw.cellIdentityWcdma); + mCellSignalStrengthWcdma = new CellSignalStrengthWcdma(ciw.signalStrengthWcdma); + } + @Override public CellIdentityWcdma getCellIdentity() { return mCellIdentityWcdma; diff --git a/telephony/java/com/android/internal/telephony/DctConstants.java b/telephony/java/com/android/internal/telephony/DctConstants.java index 3408291825d1..17516bc24aca 100644 --- a/telephony/java/com/android/internal/telephony/DctConstants.java +++ b/telephony/java/com/android/internal/telephony/DctConstants.java @@ -66,7 +66,8 @@ public class DctConstants { public static final int EVENT_DATA_CONNECTION_DETACHED = BASE + 9; public static final int EVENT_ROAMING_ON = BASE + 11; public static final int EVENT_ROAMING_OFF = BASE + 12; - public static final int EVENT_ENABLE_NEW_APN = BASE + 13; + public static final int EVENT_ENABLE_APN = BASE + 13; + public static final int EVENT_DISABLE_APN = BASE + 14; public static final int EVENT_DISCONNECT_DONE = BASE + 15; public static final int EVENT_DATA_CONNECTION_ATTACHED = BASE + 16; public static final int EVENT_DATA_STALL_ALARM = BASE + 17; diff --git a/tests/net/java/android/net/shared/LinkPropertiesParcelableUtilTest.java b/tests/net/java/android/net/shared/LinkPropertiesParcelableUtilTest.java new file mode 100644 index 000000000000..4cabfc95b49d --- /dev/null +++ b/tests/net/java/android/net/shared/LinkPropertiesParcelableUtilTest.java @@ -0,0 +1,193 @@ +/* + * Copyright (C) 2019 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.net.shared; + +import static android.net.shared.LinkPropertiesParcelableUtil.fromStableParcelable; +import static android.net.shared.LinkPropertiesParcelableUtil.toStableParcelable; + +import static org.junit.Assert.assertEquals; + +import android.net.InetAddresses; +import android.net.IpPrefix; +import android.net.LinkAddress; +import android.net.LinkProperties; +import android.net.ProxyInfo; +import android.net.RouteInfo; +import android.net.Uri; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.lang.reflect.Modifier; +import java.util.Arrays; +import java.util.Collections; + +/** + * Tests for {@link LinkPropertiesParcelableUtil} + */ +@RunWith(AndroidJUnit4.class) +@SmallTest +public class LinkPropertiesParcelableUtilTest { + private LinkProperties mLinkProperties; + + private static final String TEST_LINKPROPS_IFACE = "TEST_IFACE"; + private static final String TEST_STACKED_LINK_1_IFACE = "TEST_STACKED_IFACE_1"; + private static final String TEST_STACKED_LINK_2_IFACE = "TEST_STACKED_IFACE_2"; + + @Before + public void setUp() { + mLinkProperties = makeLinkProperties(TEST_LINKPROPS_IFACE); + mLinkProperties.addStackedLink(makeLinkProperties(TEST_STACKED_LINK_1_IFACE)); + mLinkProperties.addStackedLink(makeLinkProperties(TEST_STACKED_LINK_2_IFACE)); + } + + private static LinkProperties makeLinkProperties(String iface) { + final LinkProperties lp = new LinkProperties(); + lp.setInterfaceName(iface); + lp.setLinkAddresses(Arrays.asList( + new LinkAddress(InetAddresses.parseNumericAddress("192.168.0.42"), 16), + new LinkAddress(InetAddresses.parseNumericAddress("2001:db8::7"), 42))); + lp.setDnsServers(Arrays.asList( + InetAddresses.parseNumericAddress("2001:db8::42"), + InetAddresses.parseNumericAddress("192.168.1.1") + )); + lp.setValidatedPrivateDnsServers(Arrays.asList( + InetAddresses.parseNumericAddress("2001:db8::43"), + InetAddresses.parseNumericAddress("192.168.42.43") + )); + lp.setPcscfServers(Arrays.asList( + InetAddresses.parseNumericAddress("2001:db8::47"), + InetAddresses.parseNumericAddress("192.168.42.47") + )); + lp.setUsePrivateDns(true); + lp.setPrivateDnsServerName("test.example.com"); + lp.setDomains("test1.example.com,test2.example.com"); + lp.addRoute(new RouteInfo( + new IpPrefix(InetAddresses.parseNumericAddress("2001:db8::44"), 45), + InetAddresses.parseNumericAddress("2001:db8::45"), + iface, + RouteInfo.RTN_UNICAST + )); + lp.addRoute(new RouteInfo( + new IpPrefix(InetAddresses.parseNumericAddress("192.168.44.45"), 16), + InetAddresses.parseNumericAddress("192.168.45.1"), + iface, + RouteInfo.RTN_THROW + )); + lp.setHttpProxy(new ProxyInfo("test3.example.com", 8000, + "excl1.example.com,excl2.example.com")); + lp.setMtu(5000); + lp.setTcpBufferSizes("1,2,3,4,5,6"); + lp.setNat64Prefix(new IpPrefix(InetAddresses.parseNumericAddress("2001:db8::48"), 96)); + + // Verify that this test does not miss any new field added later. + // If any added field is not included in LinkProperties#equals, assertLinkPropertiesEquals + // must also be updated. + assertEquals(14, Arrays.stream(LinkProperties.class.getDeclaredFields()) + .filter(f -> !Modifier.isStatic(f.getModifiers())).count()); + + return lp; + } + + @Test + public void testParcelUnparcel() { + doParcelUnparcelTest(); + } + + @Test + public void testParcelUnparcel_NullInterface() { + mLinkProperties.setInterfaceName(null); + doParcelUnparcelTest(); + } + + @Test + public void testParcelUnparcel_NullPrivateDnsServer() { + mLinkProperties.setPrivateDnsServerName(null); + doParcelUnparcelTest(); + } + + @Test + public void testParcelUnparcel_NullDomains() { + mLinkProperties.setDomains(null); + doParcelUnparcelTest(); + } + + @Test + public void testParcelUnparcel_NullProxy() { + mLinkProperties.setHttpProxy(null); + doParcelUnparcelTest(); + } + + @Test + public void testParcelUnparcel_NullTcpBufferSizes() { + mLinkProperties.setTcpBufferSizes(null); + doParcelUnparcelTest(); + } + + @Test + public void testParcelUnparcel_EmptyLinkAddresses() { + mLinkProperties.setLinkAddresses(Collections.emptyList()); + doParcelUnparcelTest(); + } + + @Test + public void testParcelUnparcel_EmptyDnses() { + mLinkProperties.setDnsServers(Collections.emptyList()); + doParcelUnparcelTest(); + } + + @Test + public void testParcelUnparcel_EmptyValidatedPrivateDnses() { + mLinkProperties.setValidatedPrivateDnsServers(Collections.emptyList()); + doParcelUnparcelTest(); + } + + @Test + public void testParcelUnparcel_EmptyRoutes() { + for (RouteInfo r : mLinkProperties.getAllRoutes()) { + mLinkProperties.removeRoute(r); + } + doParcelUnparcelTest(); + } + + @Test + public void testParcelUnparcel_PacFileProxyInfo() { + mLinkProperties.setHttpProxy(new ProxyInfo(Uri.parse("http://pacfile.example.com"))); + doParcelUnparcelTest(); + } + + @Test + public void testParcelUnparcel_NullNat64Prefix() { + mLinkProperties.setNat64Prefix(null); + doParcelUnparcelTest(); + } + + private void doParcelUnparcelTest() { + final LinkProperties unparceled = fromStableParcelable(toStableParcelable(mLinkProperties)); + assertLinkPropertiesEquals(mLinkProperties, unparceled); + } + + private static void assertLinkPropertiesEquals(LinkProperties expected, LinkProperties actual) { + assertEquals(expected, actual); + + // LinkProperties equals() does not include stacked links + assertEquals(expected.getStackedLinks(), actual.getStackedLinks()); + } +} diff --git a/tools/aapt2/ResourceUtils.cpp b/tools/aapt2/ResourceUtils.cpp index c6f91527c91c..ab4805f626a5 100644 --- a/tools/aapt2/ResourceUtils.cpp +++ b/tools/aapt2/ResourceUtils.cpp @@ -16,6 +16,7 @@ #include "ResourceUtils.h" +#include <algorithm> #include <sstream> #include "android-base/stringprintf.h" @@ -503,6 +504,14 @@ Maybe<int> ParseSdkVersion(const StringPiece& str) { if (entry.first == trimmed_str) { return entry.second; } + + // Try parsing codename from "[codename].[preview_sdk_fingerprint]" value. + const StringPiece::const_iterator begin = std::begin(trimmed_str); + const StringPiece::const_iterator end = std::end(trimmed_str); + const StringPiece::const_iterator codename_end = std::find(begin, end, '.'); + if (codename_end != end && entry.first == trimmed_str.substr(begin, codename_end)) { + return entry.second; + } return {}; } diff --git a/tools/aapt2/ResourceUtils_test.cpp b/tools/aapt2/ResourceUtils_test.cpp index 5ce464074335..9018b0fc372a 100644 --- a/tools/aapt2/ResourceUtils_test.cpp +++ b/tools/aapt2/ResourceUtils_test.cpp @@ -16,6 +16,7 @@ #include "ResourceUtils.h" +#include "SdkConstants.h" #include "Resource.h" #include "test/Test.h" @@ -212,6 +213,17 @@ TEST(ResourceUtilsTest, ItemsWithWhitespaceAreParsedCorrectly) { Pointee(ValueEq(BinaryPrimitive(Res_value::TYPE_FLOAT, expected_float_flattened)))); } +TEST(ResourceUtilsTest, ParseSdkVersionWithCodename) { + const android::StringPiece codename = + GetDevelopmentSdkCodeNameAndVersion().first; + const int version = GetDevelopmentSdkCodeNameAndVersion().second; + + EXPECT_THAT(ResourceUtils::ParseSdkVersion(codename), Eq(Maybe<int>(version))); + EXPECT_THAT( + ResourceUtils::ParseSdkVersion(codename.to_string() + ".fingerprint"), + Eq(Maybe<int>(version))); +} + TEST(ResourceUtilsTest, StringBuilderWhitespaceRemoval) { EXPECT_THAT(ResourceUtils::StringBuilder() .AppendText(" hey guys ") diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java index 85871feba12d..e019f282cd33 100644 --- a/wifi/java/android/net/wifi/WifiConfiguration.java +++ b/wifi/java/android/net/wifi/WifiConfiguration.java @@ -145,11 +145,23 @@ public class WifiConfiguration implements Parcelable { */ public static final int SUITE_B_192 = 10; + /** + * WPA pre-shared key with stronger SHA256-based algorithms. + * @hide + */ + public static final int WPA_PSK_SHA256 = 11; + + /** + * WPA using EAP authentication with stronger SHA256-based algorithms. + * @hide + */ + public static final int WPA_EAP_SHA256 = 12; + public static final String varName = "key_mgmt"; public static final String[] strings = { "NONE", "WPA_PSK", "WPA_EAP", "IEEE8021X", "WPA2_PSK", "OSEN", "FT_PSK", "FT_EAP", - "SAE", "OWE", "SUITE_B_192"}; + "SAE", "OWE", "SUITE_B_192", "WPA_PSK_SHA256", "WPA_EAP_SHA256" }; } /** |